微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 循环移位器的verilog代码问题

循环移位器的verilog代码问题

时间:10-02 整理:3721RD 点击:
老师布置的任务,我实现了,但是感觉算法不够好,资源浪费有点多啊。
这个循环移位器有两个输入,待移位的数(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)这种写法有什么不同吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top