我有一个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
答案 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