所以,我有的,我希望能够读/写,以基于两个不同的选择器信号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

和我想选择的RAM使用任一headtail信号(2比特向量)来使用。任何想法如何做到这一点?

有帮助吗?

解决方案

我是新来的,不能在问题尚未置评,但在应对马蒂:大多数FPGA综合工具将与三态值内多源信号,其中可能转化为MUX般的逻辑。见,例如:的旧三态到逻辑行为的描述是声音精确到我

为建议亚当,你可能会更好做在你的代码此明确通过执行掩蔽自己,而不是使用三态。这将提高便携性,给你更多的可预见的结果,并作为个人文档,如果有人曾经有重新审视你的代码。

然而,使基于您的解决方案一些猜测,它很可能是有意义的干脆屏蔽掉时钟使能写端口和MUX读端口的输出。例如:

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

这将可能导致不太复杂的逻辑(的,更好的面积和延迟)比你的溶液中。

其他提示

我想我想通了,总得使用生成的语句:

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

很高兴听到你找到了你的问题的解决方案。我必须承认,我没有完全理解你在做什么,但一个评论,您还可以使用if内生成报表,从而实例化不同的模块,或者使用不同的信号取决于genvar,e.g:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top