2012-10-11 134 views
0

我要翻譯下面的VHDL程序VERILOG:轉換VHDL代碼的Verilog

ENTITY ascounter IS 
    PORT (CLK :IN STD_LOGIC; 
     QoutA, QoutB, QoutC, QoutD :OUT STD_LOGIC); 
END ascounter; 
ARCHITECTURE circuit OF ascounter IS 
    SIGNAL CLKnot, QBnot, QCnot, QDnot, QA, QB, QC, QD, HIGH :STD_LOGIC; 
    BEGIN 
     HIGH<='1'; 
     CLKnot<=NOT CLK; 
     QDnot<=NOT QD; 
     QCnot<=NOT QC; 
     QBnot<=NOT QB; 
     FFD: JKFF PORT MAP (J=>HIGH, K=>HIGH, CLK=>CLKnot, CLRN=>HIGH, PRN=>HIGH, Q=>QD); 
     FFC: JKFF PORT MAP (J=>HIGH, K=>HIGH, CLK=>QDnot, CLRN=>HIGH, PRN=>HIGH, Q=>QC); 
     FFB: JKFF PORT MAP (J=>HIGH, K=>HIGH, CLK=>QCnot, CLRN=>HIGH, PRN=>HIGH, Q=>QB); 
     FFA: JKFF PORT MAP (J=>HIGH, K=>HIGH, CLK=>QBnot, CLRN=>HIGH, PRN=>HIGH, Q=>QA); 
     QoutA<=QA; 
     QoutB<=QB; 
     QoutC<=QC; 
     QoutD<=QD; 
END circuit; 

,我已經做到了:

... 
    assign HIGH = 1'b1; 
    assign CLKnot = (~CLK); 
    assign QDnot = (~QD); 
    assign QCnot = (~QC); 
    assign QBnot = (~QB); 

flipflop_jk FFD(.J(HIGH), .K(HIGH), .CK(CLKnot), .CLN(HIGH), .PRN(HIGH), .Q(QD)); 

flipflop_jk FFC(.J(HIGH), .K(HIGH), .CK(QDnot), .CLN(HIGH), .PRN(HIGH), .Q(QC)); 

flipflop_jk FFB(.J(HIGH), .K(HIGH), .CK(QCnot), .CLN(HIGH), .PRN(HIGH), .Q(QB)); 

flipflop_jk FFA(.J(HIGH), .K(HIGH), .CK(QBnot), .CLN(HIGH), .PRN(HIGH), .Q(QA)); 

assign QoutA = QA; 
assign QoutB = QB; 
assign QoutC = QC; 
assign QoutD = QD; 

我已經使用了JK觸發器:

always @(CK or PRN or CLN) 
begin 
    if (PRN == 1'b0) 
    begin 
    Q <= 1'b1 ; 
    end 
    else if (CLN == 1'b0) 
    begin 
    Q <= 1'b0 ; 
    end 
    else if (CK == 1'b0) 
    begin 
    if (J == 1'b1 & K == 1'b1) 
    begin 
     Q <= ~Q ; 
    end 
    else if (J == 1'b1 & K == 1'b0) 
    begin 
     Q <= 1'b1 ; 
    end 
    else if (J == 1'b0 & K == 1'b1) 
    begin 
     Q <= 1'b0 ; 
    end 
    end 
end 

當我嘗試運行模擬時,出現了這樣的錯誤,但我不明白錯誤在哪裏。

enter image description here

沒有人有任何想法?
非常感謝!

+3

您應該添加更多關於問題的信息。 _「......這是錯誤的」_是不夠的。 – keyser

+0

認爲輸出中的x值明顯是錯誤的。道歉。 – gosling

回答

1

在flipflop_jk定義中使用邊緣靈敏度會更合適。您還包含一個異步清除信號,其復位信號的值不同。我的例子顯示了這個同步清除。

您的信號捕獲不會顯示您的重置信號。我認爲這是最初的低點,然後在時間0之後把它提高。設置Q爲一個已知值。

module flipflop_jk(
    input  CK, 
    input  PRN, 
    input  CLN, 
    input  J, 
    input  K, 
    output reg Q 
); 

always @(posedge CK or negedge PRN) begin 
    if (PRN == 1'b0) begin 
    Q <= 1'b1 ; 
    end 
    else begin 
    if (CLN == 1'b0) begin 
     Q <= 1'b0 ; 
    end 
    else if (J == 1'b1 & K == 1'b1) begin 
     Q <= ~Q ; 
    end 
    else if (J == 1'b1 & K == 1'b0) begin 
     Q <= 1'b1 ; 
    end 
    else if (J == 1'b0 & K == 1'b1) begin 
     Q <= 1'b0 ; 
    end 
    end 
end 
endmodule 
+0

非常感謝 – gosling

0

我假設您已在您的jk觸發器模塊中聲明Qreg。默認情況下,在Verilog中,reg被初始化爲x。由於J,0 K,CLNPRN輸入到您的jk觸發器被綁定爲高(1'b1),唯一被執行的語句是Q <= ~Q ;(當CK變低時)。 Q仍然未知,因爲x的反轉仍然是x。您從未將Q設置爲已知值。