所以我有一个4个RAM模块阵列,我希望能够根据两个不同的选择器信号进行读/写。现在我正在使用中间信号实例化RAM:
genvar i;
generate
for (i = 0; i < regnum; i=i+1) begin: regs
rfram_generic rf (clk,rst,ce_a_int[i],addr_a_int[i],do_a_int[i],
ce_b_int[i],addr_b_int[i],do_b_int[i],
ce_w_int[i],we_w_int[i],addr_w_int[i],
di_w_int[i]);
end
endgenerate
我想使用head
或tail
信号(2位向量)选择要使用的RAM。任何想法如何做到这一点?
答案 0 :(得分:2)
我是新手,暂不对问题发表评论,但是为了回应Marty:大多数FPGA综合工具会尽可能将具有三态值的内部多源信号转换为类似MUX的逻辑。例如,请参阅:a description of old tristate-to-logic behaviour that sounds accurate to me。
作为对Adam的推荐,你可能最好通过自己执行掩码而不是使用三态来在代码中明确这样做。这将提高可移植性,为您提供更可预测的结果,并且如果有人需要重新访问您的代码,则可以作为自我文档。
但是,根据您的解决方案进行一些猜测,简单地屏蔽写端口上的时钟使能并复用读端口的输出可能是有意义的。例如:
reg [WIDTH-1:0] do_a,do_b;
always @(*) do_a = do_a_int[head];
always @(*) do_b = do_b_int[tail];
generate
genvar i;
for (i = 0; i < regnum; i=i+1) begin: regs
rfram_generic rf (clk,rst,
ce_a,addr_a,do_a_int[i],
ce_b,addr_b,do_b_int[i],
ce_w,head==i?we_w:1'b0,addr_w,di_w);
end
endgenerate
这可能会导致比您的解决方案更简单的逻辑(即,更好的区域和延迟)。
答案 1 :(得分:0)
我想我想出来了,必须使用生成语句:
genvar i;
generate
for (i = 0; i < regnum; i=i+1) begin: sigassign
//read from the checkpoint in progress
assign ce_a_int[i] = (head == i) ? ce_a : 'bz;
assign addr_a_int[i] = (head == i) ? addr_a : 'bz;
assign do_a = (head == i) ? do_a_int[i] : 'bz;
//write to the checkpoint in progress
assign ce_w_int[i] = (head == i) ? ce_w : 'bz;
assign we_w_int[i] = (head == i) ? we_w : 'bz;
assign addr_w_int[i] = (head == i) ? addr_w : 'bz;
assign di_w_int[i] = (head == i) ? di_w : 'bz;
//read from the last stable checkpoint
assign ce_b_int[i] = (tail == i) ? ce_b : 'bz;
assign addr_b_int[i] = (tail == i) ? addr_b : 'bz;
assign do_b = (tail == i) ? do_b_int[i] : 'bz;
end
endgenerate
答案 2 :(得分:0)
if
,从而实例化不同的模块或使用依赖于genvar
的不同信号,例如:
generate
genvar i;
for (i = 0; i < regnum; i=i+1) begin: regs
if (i == head) begin
rfram_generic_a rf(...);
end else if (i == tail) begin
rfram_generic_b rf(...);
end else begin
rfram_generic_c rf(...);
end
end
endgenerate