2009-10-30 8 views
0

그래서 두 개의 다른 선택기 신호를 기반으로 읽기/쓰기가 가능하도록 4 개의 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 

을 그리고 head 또는 tail 신호 (2 비트 벡터)를 사용하여 사용하는 RAM을 선택합니다 : 지금은 중간 신호를 사용하여 RAM을 인스턴스화하고 있습니다. 어떤 아이디어가 이것을 어떻게?

답변

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가 tristate 신호로 무엇을하고 있는지 궁금해졌습니다. – Adam

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

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