簡體   English   中英

單一輸入到Verilog中的自定義模塊陣列

[英]Single Input to Array of Custom Modules in Verilog

因此,我有一個包含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

我想選擇使用headtail信號(2位向量)使用的RAM。 任何想法如何做到這一點?

我是新來的,現在還不能評論問題,但是為了回應Marty:大多數FPGA綜合工具都會在可能的情況下將具有三態值的內部多源信號轉換為類似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

與您的解決方案相比,這可能會導致邏輯的復雜性降低( ,面積和延遲更好)。

我想我想通了,必須使用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

很高興聽到您找到解決問題的方法。 我必須承認我不完全了解您的工作,但有一條評論,您還可以if內部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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM