2015-03-03 1 views
3

Я отправляю код для JK Flip flop на языке VHDL. код правильный в соответствии с схемой триггера JK. но я получил выход как красную линию. может ли кто-нибудь сказать мне, в чем проблема только с флип-флопом JK.Почему выход JK flip flop red в симуляции?

  • Программа: JK флип-флоп

---------- ======= NAnd ворота с тремя входами ===== ------ ---------

library ieee; 
use ieee.std_logic_1164.all; 
entity nand_gate3 is port(
     A, B, C : in std_logic; 
      F : out std_logic); 
end nand_gate3 ; 


architecture nandfunc3 of nand_gate3 is 
    signal x : std_logic ; 
begin 
     x <= A nand B ; 
     F <= x nand C ; 
end nandfunc3; 

------====== END NANd GATE with three inout ======-------- 

----=========NANd Gate with Two inputs==========------------ 
library ieee; 
use ieee.std_logic_1164.all; 
entity nand_gate2 is port(
      A, B : in std_logic; 
      F : out std_logic); 
end nand_gate2; 

architecture nandFunc2 of nand_gate2 is 
begin 
     F <= A nand B ; 
end nandFunc2; 
------====== END NANd GATE with three inout ======- 
library ieee; 
use ieee.std_logic_1164.all; 
ENTITY JK_flipflop IS PORT ( 
        clk , J, K : IN std_logic; 
        Q , Q_bar : OUT std_logic); 
END JK_flipflop ; 

architecture JK_structure OF JK_flipflop IS 
----===Compnents 
    COMPONENT nand_gate3 IS PORT (
         A, B ,C : IN std_logic ; 
         F  : OUt std_logic); 
    End Component ; 

    COMPONENT nand_gate2 IS PORT (
         A, B : IN std_logic ; 
         F  : OUt std_logic); 
    End Component ; 

    Signal X, Y , Qback ,Qbar_back: std_logic ; 
----== Structure 
    Begin 

    U1: nand_gate3 PORT MAP (J, clk, Qbar_back, X); 
    U2: nand_gate3 PORT MAP (K, clk, Qback ,Y); 
    U3: nand_gate2 PORT MAP (X, Qbar_back ,Qback); 
    U4: nand_gate2 PORT MAP (Y, Qback ,Qbar_back); 

    Q <= Qback; 
    Q_bar <= Qbar_back; 

END JK_structure ; 

-------------------- Test Bench для JK флип-флоп ---- ===

library ieee; 
use ieee.std_logic_1164.all; 

entity jk_flipflop_tb is 
end jk_flipflop_tb ; 

    architecture tb of jk_flipflop_tb is 
    ---====Jk_flipflop 
    component JK_flipflop is port(
       clk,J , K : in std_logic; 
       Q, Q_bar : out std_logic); 
    end component; 
---===signals 
    signal clk,J ,K , Q, Q_bar : std_logic; 

    begin 
    mapping: JK_flipflop port map(clk, J, K, Q, Q_bar); 

-------=========Process for Clcok ===========--------------- 
    process 

begin 
    clk <= '1'; 
    wait for 5 ns; 
    clk <= '0'; 
    wait for 5 ns; 
    end process; 
--------===========Process for j,k inputs values=======-------------- 
process 

begin 
-------===TEST 1 
    J <= '0'; 
    K <= '1'; 
    wait for 20 ns; 
    -------====TEST 2 
    J <= '1'; 
    K <= '1'; 
    wait for 20 ns; 
-------====TEST 3 
    J <= '1'; 
    K <= '0'; 
    wait for 20 ns; 
-------====TEST 4 
    J <= '0'; 
    K <= '0'; 
    wait for 20 ns; 

    end process; 
end tb; 
-------------------------------------------- 
configuration cfg_tb of jk_flipflop_tb is 
    for tb 
    end for; 
end cfg_tb; 

--------- ====== ------

enter image description here

+1

значения не определенно, а не 0 или 1! – 23ars

ответ

0

Ваша логика кажется неисправной. Правая логика: Q = (J и Qbar_back) CLK NAND NAND Qbar_back Qbar = (К и Q_back) CLK NAND NAND Q_back

и операция является операцией NAND в вашей логике.

+0

если вы знаете ошибку, пожалуйста, исправьте его для меня ... спасибо. @ OmgBob – Misal313

2

JK флип-флоп должен иметь порт сброса для инициализации выходов, в противном случае из-за выхода (Q, Qbar) устанавливаются сами по себе (обратной связи), если они не имеют каких-либо начальное значение, они всегда не определено. Затем вы должны добавить порт сброса в свой дизайн.

Вы можете использовать следующий код, чтобы получить правильный результат:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity JK_FF is 
    port( 
     Reset : in std_logic; 
     Clock : in std_logic; 
     J,K : in std_logic; 
     Q,Qbar : out std_logic 
    ); 
end JK_FF; 

architecture Behavioral of JK_FF is 
    signal temp : std_logic; 
begin 
    process (Clock) 
    begin 
     if rising_edge(Clock) then     
      if Reset='1' then 
       temp <= '0'; 
      else 
       if (J='0' and K='0') then 
        temp <= temp; 
       elsif (J='0' and K='1') then 
        temp <= '0'; 
       elsif (J='1' and K='0') then 
        temp <= '1'; 
       elsif (J='1' and K='1') then 
        temp <= not (temp); 
       end if; 
      end if; 
     end if; 
    end process; 

    Q <= temp; 
    Qbar <= not temp; 

end Behavioral; 
+0

Спасибо, амир ,,, Plese вы можете исправить код для уровня ворот. – Misal313

+1

VHDL не подходит для уровня ворот, вам действительно нужно использовать код @amir или аналоговый симулятор. Кроме того, ваш nand3 должен читать x <= not (A и B и C); –

+0

Мои мысли также (@Jonathan Drolet), но если вам действительно нужно использовать логические ворота, вы можете синтезировать мой код в каком-нибудь инструменте синтеза (например, Xininx Synthesis Tool) и нажимать на «view schematic Technology». Выход содержит некоторые LUT, DFF, .... (LUT могут быть преобразованы в базовые логические ворота). Затем вы можете написать свой код со всем, что вы видите в окне Schematic Technology. – Amir