Verilog中自定义模块阵列的单输入

Verilog中自定义模块阵列的单输入,verilog,ram,muxer,Verilog,Ram,Muxer,因此,我有一个由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],

因此,我有一个由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
genvari;
生成
对于(i=0;i

我想使用
head
tail
信号(2位向量)选择要使用的RAM。有没有办法做到这一点?

我想我已经想好了,必须使用generate语句:

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
genvari;
生成
对于(i=0;i
很高兴听到您找到了解决问题的方法。我必须承认我没有完全理解你在做什么,但有一条评论,你也可以在generate语句中使用
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
生成
genvar i;
对于(i=0;i
我是新来的,现在还不能对问题发表评论,但作为对Marty的回应:大多数FPGA合成工具将尽可能将具有三态值的内部多源信号转换为类似MUX的逻辑。例如,请参见:

作为对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
reg[WIDTH-1:0]do_a,do_b;
始终@(*)do_a=do_a_int[头部];
始终@(*)do_b=do_b_int[尾];
生成
genvar i;
对于(i=0;i

这可能会导致比您的解决方案更不复杂的逻辑(即更好的面积和延迟)。

您的目标是什么,FPGA?它将如何合成
'bz