我正在Verilog中编写8 * 4 RAM的代码。对于每个存储器的二进制单元,我使用的是SR触发器。最初,每个单元被分配1'bx。逻辑似乎是正确的,但输出不是。这可能是因为语句没有同时执行。任何人都可以建议我如何让SRFlipFlop任务与其他语句同时执行?
module memory(addr, read_data, rw, write_data, clk);
// read_data is the data read
// rw specifies read or write operation. 1 for read and 0 for write
// write data is the data to be written
// addr is the address to be written or read
task SRFlipFlop;
input d,r,s,clk; // d is the value initially stored
output q;
begin
case({s,r})
{1'b0,1'b0}: q<=d;
{1'b0,1'b1}: q<=1'b0;
{1'b1,1'b0}: q<=1'b1;
{1'b1,1'b1}: q<=1'bx;
endcase
end
endtask
task decoder; // a 3 to 8 line decoder
input [2:0] A;
input E;
output [7:0] D;
if (!E)
D <= 16'b0000000000000000;
else
begin
case (A)
3'b000 : D <= 8'b00000001;
3'b001 : D <= 8'b00000010;
3'b010 : D <= 8'b00000100;
3'b011 : D <= 8'b00001000;
3'b100 : D <= 8'b00010000;
3'b101 : D <= 8'b00100000;
3'b110 : D <= 8'b01000000;
3'b111 : D <= 8'b10000000;
endcase
end
endtask
output reg [3:0] read_data;
input [3:0] write_data;
input [2:0] addr;
input rw, clk;
reg [3:0] memory [7:0];
reg [3:0] r [7:0];
reg [3:0] s [7:0];
reg [3:0] intermediate;
reg [3:0] select [7:0];
reg [7:0] out;
reg [7:0] out1;
integer i,j,k,l;
initial
begin
for (i = 0; i <= 7; i=i+1)
begin
for (j = 0; j <= 3; j=j+1)
begin
memory[i][j] = 1'bx;
r[i][j] = 1'b0;
s[i][j] = 1'b0;
select[i][j] = 1'b0;
end
end
end
always @(posedge clk)
begin
decoder(addr, 1'b1, out);
for (i = 0; i <= 7; i=i+1)
begin
if (out[i] == 1'b1)
begin
for (j = 0; j <= 3; j=j+1)
begin
select[i][j] <= 1'b1;
s[i][j] <= write_data[j] & !rw & select[i][j];
r[i][j] <= !write_data[j] & !rw & select[i][j];
SRFlipFlop(memory[i][j],r[i][j],s[i][j],clk,intermediate);
memory[i][j] <= intermediate;
read_data[j] <= memory[i][j];
end
end
end
end
endmodule
答案 0 :(得分:0)
您的代码风格非常以软件为导向。就个人而言,我想知道我的代码看起来像一个电路,所以我不会使用嵌套的for循环和任务,而是使用模块和生成循环来创建我的电路。
我无法使你的代码工作,但我怀疑错误是因为s和r在每次迭代时都没有重置为零。
我在这里创建了一个功能设计: http://www.edaplayground.com/x/Guc
我没有使用初始块来初始化值,而是添加了异步重置。
SRFF任务已转换为模块。 RAMblock模块实例化四个SRFF模块。 8个RAM块在内存模块中实例化。
我已将压缩的(reg [] a []
)数组转换为解压缩的数组(reg [][] a
),以便能够在没有for循环的情况下对多个位执行按位运算。
如果您对代码有疑问,请随时给我发消息。
编辑:在这个设计中最重要的一点是我将顺序电路与组合分开。通过这种方式,可以更容易地控制应该在clk的构造上更新的内容以及应该对在posedge中执行的更改的组合反应。