2017-05-21 5 views
0

내 코드가 잘 컴파일되고 있지만 시뮬레이션 할 때 작동하지 않습니다. "오류 로딩 디자인"이 표시됩니다. 나는이 모듈들 중에서 입출력 포트가 잘못되었다고 생각한다. 하지만 그들을 찾을 수 없습니다 .. 내 코드에서 오류가있는 곳에서 도와주세요.modelsim 프로그래밍 60 카운터 (오류로드 디자인)

modulo_60_binary의 내 y 신호는 두 위치에서 구동되고
module tb_modulo_60_binary; 

    reg t_clk, reset; 
    wire [7:0] t_Y; 
    parameter sec = 30; 

    always #(sec) t_clk = ~t_clk; 
    modulo_60_binary M1 (t_Y, t_clk, reset); 

    initial begin 
    t_clk = 1; reset =1; #10; 
    reset = 0; #3050; 
    $finish; 
    end 
endmodule 

module modulo_60_binary(y, clk, reset); 
    output [7:0] y; 
    input reset, clk; 
    wire TA1, TA2, TA3, JA2, JA4; 
    reg [7:0] y; 

    assign TA1 = 1; 
    assign TA2 = (~y[6]) && y[4]; 
    assign TA3 = (y[5] && y[4]) || (y[6] && y[4]); 
    assign JA2 = ~y[3]; 
    assign JA4 = y[1]&&y[2]; 

    jk_flip_flop JK1 (1, 1, clk, y[0]); 
    jk_flip_flop JK2 (JA2, 1, y[0], y[1]); 
    jk_flip_flop JK3 (1, 1, y[1], y[2]); 
    jk_flip_flop JK4 (JA4, 1, y[1], y[3]); 
    t_flip_flop T1 (TA1, clk, y[4]); 
    t_flip_flop T2 (TA2, clk, y[5]); 
    t_flip_flip T3 (TA3, clk, y[6]); 
    always @(negedge clk) 
    begin 
    if(reset) 
     y <= 8'b00000000; 
    else if(y == 8'b01110011) 
     y <= 8'b00000000; 
    end 
endmodule 

module t_flip_flop(t, clk, q); 
    input t, clk; 
    output q; 
    reg q; 

    initial q=0; 
    always @(negedge clk) 
    begin 
    if(t == 0) q <= q; 
    else q <= ~q; 
    end 

endmodule 

module jk_flip_flop(j, k, clk, Q); 
    output Q; 
    input j, k, clk; 
    reg Q; 

    always @(negedge clk) 
     if({j,k} == 2'b00) Q <= Q; 
     else if({j,k} == 2'b01) Q <= 1'b0; 
     else if({j,k} == 2'b10) Q <= 1'b1; 
     else if({j,k} == 2'b11) Q <= ~Q; 
endmodule 
+0

'y'의 각 비트에는 하나의 드라이버가 있어야합니다. 당신은 두개 (모듈 인스턴스와 분리 된 항상 블록)를가집니다. 또한 모듈 인스턴스의 출력은 네트 유형 (예 :'wire')에 연결되어야합니다. 너는 너의 나머지 논리를 재고 할 필요가있다 – Greg

+0

너는 저에게 세부 사항을 더 말할 수 있 었는가? 어느 부분을 변경해야합니까? 나는 Verilog를 사용할 첫 번째 시간이다 ... – kyubihn

답변

0

: 비트 JK # 및 T 인스턴스 #

  • 0으로 y 모든 비트를 할당하는 리셋 로직에 의해

    힙 및 빗 논리에는 하나의 명확한 드라이버가 있어야합니다. 이것은 소프트웨어와 하드웨어 언어 간의 근본적인 차이점 중 하나입니다.

    나머지는 JK 및 Tflops의 사용을 가정 할 때 디자인 요구 사항입니다. 따라서 y을 0에 할당하는 always 블록을 삭제하고 ywire 유형으로 만들어야합니다.

    로직을 T 플로피에 고정하는 것은 쉽습니다. 간단히 조건문을 추가하십시오. 예 :

    wire do_rst = reset || (y == 8'b01110011); 
    assign TA1 = do_rst ? y[4] : 1; 
    assign TA2 = do_rst ? y[5] : (~y[6]) && y[4]; 
    assign TA3 = do_rst ? y[6] : (y[5] && y[4]) || (y[6] && y[4]); 
    

    한 플롭의 출력이 다른 플럽의 시계이기 때문에 JK 플립이 더 어렵습니다. 나는 각 JK 플롭에 대한 클록 입력이 clk이어야한다고 조언 할 것이다. 그렇지 않으면 y 비트가 2의 1이 아닌 값 (예 : 1,3,7,15) 일 때 재설정을위한 디자인상의 골칫거리를 물어볼 것이다. 즉, JA # 로직을 재평가하고 KA # 로직을 추가해야합니다 (위의 do_rst이 도움이 될 것이라는 힌트). 나는 너를 위해서이 일을하지 않을 것이다.

    비동기 재설정 접근 방식의 옵션이 있지만,이 디자인을 위해 나는 그것을 연령 주의자에게 권고 할 것입니다. 리셋 펄스는 실리콘에서 너무 짧아서 y ==에 대한 조건부 리셋을 특정 값으로 가지며, 이로 인해 부분적으로 리셋되지 않을 수 있습니다. 푸시를 충분히 넓히기 위해 합성 제약 조건/규칙을 추가 할 수는 있지만 취성 설계에 패치를 적용하는 것입니다. 처음에는 견고하게 설계하는 것이 좋습니다.

    FYI : y[7]에는 드라이버가없고 인스턴스 T3의 모듈 선언에 오타가 있습니다.