循环移位器的verilog代码问题
这个循环移位器有两个输入,待移位的数(13个数,每个数是4bits,一共52bits),以及要移位的位数(每移一位,以一个数据为单位,即4bits)。输出就是移位后的13个数了。注意是13个数据,不是16个数据。
所有移位是右移。
比如如果输入是52‘h 0123456789ABC, 移动位数为1,输出是:C0123456789AB
如果输入是52‘h 0123456789ABC, 移动位数为3,输出是:ABC0123456789
希望我描述清楚了。
模块的端口是 module shifter(Indata, shift, Outdata)
input [51:0] Indata,
input [3:0]shift; //因为是13个数据,shift的值是0 到12
output [51:0] outdata;
求高手给出好的算法或者代码!先谢谢!
是个循环移位问题。
module shifter(Indata, shift, Outdata)
input [51:0] Indata,
input [3:0]shift; //因为是13个数据,shift的值是0 到12
output [51:0] outdata;
always @(shift)
begin
case (shift);
4'b0000: outdata=indata;
4'b0001: outdata={indata[48:51],indata[0:47]};
4'b0010: outdata={indata[44:51],indata[0:43]};
4'b0011: outdata={indata[40:51],indata[0:39]};
4'b0100: outdata={indata[36:51],indata[0:35]};
4'b0101: outdata={indata[32:51],indata[0:31]};
4'b0111: outdata={indata[28:51],indata[0:27]};
4'b1000: outdata={indata[24:51],indata[0:23]};
4'b1001: outdata={indata[20:51],indata[0:19]};
4'b1010: outdata={indata[16:51],indata[0:15]};
4'b1011: outdata={indata[12:51],indata[0:11]};
4'b1100: outdata={indata[8:51],indata[0:7]};
4'b1101: outdata={indata[4:51],indata[0:3]};
endcase
end
endmodule
建议参看barrel shifter的设计
input clk;
output reg data_out;
reg [11:0]val;
always @(posedge clk)begin
if(rst)begin
end
else begin
val<={val[10:0],val[11]};
end
assign data_out=val[11];
非常有用。谢谢
赞,可以看看
这个综合后相当于barrel shifter吗?
3#的写法跟 outdata=(indata<<shifter)这种写法有什么不同吗?
