문제

따라서 두 개의 다른 선택기 신호를 기반으로 읽거나 쓸 수있는 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을 선택하고 싶습니다. head 또는 tail 신호 (2 비트 벡터). 이 작업을 수행하는 방법이 있습니까?

도움이 되었습니까?

해결책

나는 여기에 새롭고 질문에 대해서는 아직 언급 할 수 없지만 Marty에 대한 응답 : 대부분의 FPGA 합성 도구는 가능한 경우 Tristate 값을 가진 내부 멀티 소스 신호를 MUX와 같은 논리로 변환합니다. 예를 들어 : 참조 : 나에게 정확하게 들리는 오래된 Tristate-to-Logic 행동에 대한 설명.

Adam에게 권장 사항으로, 당신은 아마도 트리 스테이트를 사용하는 대신 마스킹을 수행하여 코드에서 이것을 명시 적으로 만드는 것이 더 나을 것입니다. 이렇게하면 이식성이 향상되고 예측 가능한 결과를 제공하며 코드를 다시 방문 해야하는 경우 자체 문서화 역할을합니다.

그러나 솔루션을 기반으로 약간의 추측을 할 수있게되면, 쓰기 포트에서 시계를 마스킹하고 읽기 포트의 출력을 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 내부는 진술을 생성하므로 다른 모듈을 인스턴스화하거나 다른 신호를 사용합니다. genvar, EG :

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