2009-10-30 51 views
0

所以我有一個4個RAM模塊陣列,我希望能夠根據兩個不同的選擇器信號進行讀/寫。現在,我使用中介信號實例化RAM:Verilog中定製模塊陣列的單輸入

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位向量)來使用。任何想法如何做到這一點?

回答

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 

這將可能導致比解決方案更簡單的邏輯(即,更好的面積和延遲)。

+0

謝謝!這正是我需要的!還要感謝這個鏈接,我想知道FPGA對三態信號做了什麼。 – Adam 2009-12-12 17:26:41

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 
+0

你在做什麼?FPGA?它如何綜合''bz'? – Marty 2009-10-31 15:56:01

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