在verilog中将移位寄存器的输出存储在RAM中

时间:2012-11-13 17:51:11

标签: verilog

我正在编写一个代码来移位128位寄存器25位置,然后将它的第一个96位存储在RAM中(RAM中的mem_bank宽度= 16位),我尝试在第一个时钟周期中取消计数器进行移位将子值存储在RAM中以用于接下来的6(96/16)个周期。我使用计数器进行索引,但我有一个计数器不是常数的问题???这是RAM的代码

module RAM(clk,we,din,dout,address);
input clk,we,re;
input [15:0] din;
input [5:0] address;
output [15:0] dout;

reg [15:0] dout;
reg [15:0] mem_bank [0:51];
integer i;
initial 
begin
    for (i=0;i<52;i=i+1)
    mem_bank[i] <=0;
end

always @(posedge clk)
begin 
if(we)
    mem_bank[address] <= din;
dout <= mem_bank[address];
end
endmodule

这是移位寄存器的代码

module keygen(clk,load,data0,data1,data2,data3,out1,out0);
input clk,load;
input [31:0] data0,data1,data2,data3;
output [31:0] out1,out0;
reg [127:0] reg128;
integer adrs = 0;  //address of RAM from 0 to 51
integer count=0;
parameter KEYSIZE = 16;
integer lowindex=0;
integer highindex=0;

always @(posedge clk)
begin
if(load)
    reg128 <= {data3,data2,data1,data0};
else if(count < 1)
begin

    reg128 [127:25] <= reg128 [102:0];
    reg128 [24:0] <= reg128 [127:103];
    count =count + 1;       
end
else if(count <8 && adrs < 52)
begin 
//  lowindex= (count-2)*KEYSIZE;
//  highindex = (count-2)*KEYSIZE+KEYSIZE-1;
RAM ram(.clk(clk),.we(1),.din(reg128[(count-2)*KEYSIZE:(count-2)*KEYSIZE+KEYSIZE-1]),.address(adrs));
adrs=adrs+1;
if (count < 8)
count =count + 1;       
else
count = 0;
end
end
assign out0=reg128[31:0];
assign out1=reg128[63:32];
//assign out2=reg128[95:64];
//assign out3=reg128[127:96];

endmodule

任何帮助请解决此问题

1 个答案:

答案 0 :(得分:1)

首先,您在always块内部进行了RAM实例化。这很糟糕 - 把它移到外面。并使用非阻止分配进行计数器更新(<=)。

要解决您的其他问题,请使用“索引部分选择”。对于你的问题,我会尝试重写

reg128[(count-2)*KEYSIZE:(count-2)*KEYSIZE+KEYSIZE-1]

作为

reg128[(count-2)*KEYSIZE+KEYSIZE-1 -: KEYSIZE ];

传统上,对于verilog中的部分选择(例如reg_a[3:4]),限制必须是常量。在更新版本的verilog中,有新的“索引部分选择”,它允许您改变其中一个维度。它的格式为reg_a[START +: WIDTH],因此reg_a[3 +: 4]reg_a[3:6]相同 - 从索引3开始的4位。此处的START可能会有所不同,但宽度必须保持不变。

另一个变种reg_a[3 -: 4]将为您提供reg_a[3:0]