算术移位操作在verilog中

时间:2014-09-09 20:44:13

标签: verilog system-verilog

我有一个Verilog模块,一次只能移位一位 请帮我完成模块。

module shift_right1 (
  output logic [15:0] shifted,
  input  wire  [15:0] unshifted,
  input  wire   [3:0] amt );

  localparam int width = 16;

  always @* begin 
    automatic int limit = width - amt;

    for ( int i=0; i<limit; i++ ) begin
      shifted[i] = unshifted[i+amt];
    end
  end
endmodule

2 个答案:

答案 0 :(得分:0)

算术移位在移位时保持符号。在for循环之后,您需要设置移位值的符号。这样的事情可能有用:

for ( int i=limit; i<width-1; i++ ) shifted[i] = unshifted[width-1];

请注意,从左侧插入的所有数字应等于未移位值的符号位,即unshifted[width-1]

Example:

Shifting 1011000 by 3, should be: 1111011
Shifting 0011000 by 3, should be: 0000011

答案 1 :(得分:0)

我认为关键是一次取一点作为输入。这意味着输入为1位,右移旧数据。这是串行到并行转换器的实现。

module shifter(
   input               dat_rx, //1bit data input    
   input               clk,
   output logic [15:0] dat_tx  //Parallel output
);
   always @(posedge clk) begin
     dat_tx <= {dat_rx, dat_tx[15:1]}; //Next input and right shift
   end
endmodule

需要外部触发器的组合版本:

module shifter_comb(
   input dat_rx,
   input  logic [15:0] dat_old,
   output logic [15:0] dat_tx
);
   always @* begin
     dat_tx = {dat_rx, dat_old[15:1]}; //Next input and right shift
   end
endmodule