2016-07-06 9 views
1

Ich versuche, eine Schaltung, die das MOD von zwei Zahlen zu bekommen, ist mein Problem in der Ausgabe dieser Schaltung, zeigt die Ausgabe 0 und dann den richtigen Wert von MOD, i Ich muss diese Schaltung in eine andere Schaltung integrieren, um eine Schaltung auszuführen, die anzeigt, ob eine Zahl prim ist oder nicht. Wenn ich die MOD-Schaltung in die PRIME-Nummer-Schaltung integriere, geht der Ausgang der PRIME-Schaltung immer falsch, weil die obige Situation, der Ausgang der MOD-Schaltung, immer zwei Werte zeigt. Das Ausgangsuntenstehende Formular aus:Zwei Ausgänge Werte in einer Mod-Operation mit vhdl

enter image description here

In diesem Bild die Schaltung immer 0 erhalten und 3, weil meine Zustandsmaschine in Schleife bleibt, das ist nicht das Problem, das Problem ist: Ich brauche, dass die Ausgabe Aufenthalt immer mit der Wert des MOD und keine Nullen. In diesem Beispiel sollte immer 3 bleiben.

Mein Steuerungscode.

LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 
USE IEEE.std_logic_unsigned.ALL; 
use IEEE.std_logic_arith.ALL; 

ENTITY operacao_modulo_control IS 
    PORT (
     i_CLK : IN STD_ULOGIC; 
     i_RST : IN STD_LOGIC; 
     i_S  : IN INTEGER; 
     i_COMP : IN STD_LOGIC; 
     o_LD_CLR : OUT STD_LOGIC; 
     o_LD_K : OUT STD_LOGIC; 
     o_DOUT : OUT INTEGER 
    );  
END operacao_modulo_control; 

ARCHITECTURE arch_1 OF operacao_modulo_control IS 
    TYPE state_type IS (s0, s1, s2,s3); 
    SIGNAL stateT : state_type; 
BEGIN 
    PROCESS(i_CLK) 
    BEGIN 
    IF rising_edge(i_CLK) THEN 
     IF (i_RST = '1') THEN 
     stateT <= s0; 
     ELSE 
     CASE stateT IS 
      when s0 => stateT <= s1; 
      when s1 => if (i_COMP = '1') then 
         stateT <= s2; 
        else 
         stateT <= s3; 
        end if; 
      when s2 => stateT <= s1; 
      when s3 => stateT <= s0; 
     END CASE; 
     END IF; 
    END IF; 
    END PROCESS; 

    o_LD_CLR <= '1' WHEN (stateT = s0) ELSE '0'; 
    o_LD_K <= '1' WHEN (stateT = s2) ELSE '0'; 
    o_DOUT <= i_S WHEN (stateT = s3) ELSE 0; 

END arch_1; 

Wie kann ich dies ändern, damit die Ausgabe nur den korrekten Wert des MOD anzeigt und keine Nullen?

Wenn die anderen Codes erforderlich ist, sind sie unter:

Datapath:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 
USE ieee.numeric_std.ALL; 

entity operacao_modulo_datapath is 
port (
    i_RESET   : IN STD_LOGIC;        -- Sinal para resetar a maquina de estados do contador 
    i_CLOCK   : IN STD_ULOGIC;       -- Clock 
    i_LOAD_K  : IN STD_LOGIC;        -- Sinal para carregar K 
    i_LOAD_CLEAR : IN STD_LOGIC;        -- Sinal para limpar K 
    i_A    : IN UNSIGNED (7 downto 0);     -- Entrada A 
    i_B    : IN UNSIGNED (7 downto 0);     -- Entrada B 
    o_OUTS   : OUT INTEGER;        -- Saida da operação aritmética 
    o_COMP   : OUT STD_LOGIC        -- Saída do comparador 
    ); 
end operacao_modulo_datapath; 


architecture arch_1 of operacao_modulo_datapath is 

component tot is 
port (
     i_RST : IN STD_LOGIC; 
     i_CLR : IN STD_LOGIC;   -- Sinal vindo do controle para limpar o valor de K 
     i_CLK : IN STD_ULOGIC;  -- Sinal de clock para sincronizar com o controle 
     i_DINL : IN STD_LOGIC ;  -- Sinal de load para carregar K 
     i_DINK : IN INTEGER;   -- Valor antigo de K 
     o_DOUTK : OUT INTEGER 
    ); -- data output 
end component; 


component array_multiplier is 
port (
    i_MULTIPLICAND : in unsigned(7 downto 0); -- data input 
    i_MULTIPLIER : in integer; -- data input 
    o_DOUT : out std_logic_vector(15 downto 0)); -- data output 
end component; 


component alu_mod is 
port (
    i_DINA : IN UNSIGNED (7 downto 0);   -- Entrada A 
    i_DINM : IN STD_LOGIC_VECTOR(15 downto 0); -- entrada do multiplicador 
    o_DOUTS : OUT INTEGER      -- saída S da operação de mod 
    ); 
end component; 


component comparator is 
port (
    i_DINS : IN INTEGER;       -- Entrada S (saída S da alu_mod) 
    i_DINB : IN UNSIGNED (7 downto 0);   -- Entrada B (entrada do usuário) 
    o_DOUT : OUT STD_LOGIC);      -- Saída para informar o resultado da comparação 
end component; 



signal w_OUT : STD_LOGIC; 
signal w_Ko : INTEGER; 
signal w_Ki : INTEGER; 
signal w_OUT0 : INTEGER; 
signal w_OUT1 : std_logic_vector(15 downto 0); 

begin 

u_0: tot port map (
        i_RST => i_RESET, 
        i_CLR => i_LOAD_CLEAR, 
        i_CLK => i_CLOCK, 
        i_DINL => i_LOAD_K, 
        i_DINK => w_Ko, 
        o_DOUTK => w_Ko 
       ); 

u_1: array_multiplier port map (
        i_MULTIPLICAND => i_B, 
        i_MULTIPLIER => w_Ko, 
        o_DOUT   => w_OUT1 
       ); 


u_2: alu_mod port map (
       i_DINA => i_A, 
       i_DINM => w_OUT1, 
       o_DOUTS => w_OUT0 
       ); 

u_3: comparator port map (
       i_DINS => w_OUT0,      
       i_DINB => i_B,   
       o_DOUT => w_OUT     
       ); 


o_OUTS <= w_OUT0; 
o_COMP <= w_OUT;     


end arch_1; 

Top-Level-Einheit:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 
USE ieee.numeric_std.ALL; 

entity operacao_modulo_top is 
port (
    i_RESETAR   : IN STD_LOGIC;        -- Sinal para resetar a maquina de estados do contador 
    i_CLCK   : IN STD_ULOGIC;       -- Clock 
    i_INA    : IN UNSIGNED (7 downto 0);     -- Entrada A 
    i_INB    : IN UNSIGNED (7 downto 0);     -- Entrada B 
    o_SOMA   : OUT INTEGER        -- Saida da operação aritmética 
    ); 
end operacao_modulo_top; 


architecture arch_1 of operacao_modulo_top is 

component operacao_modulo_datapath is 
port(
     i_RESET   : IN STD_LOGIC;        -- Sinal para resetar a maquina de estados do contador 
     i_CLOCK   : IN STD_ULOGIC;       -- Clock 
     i_LOAD_K  : IN STD_LOGIC;        -- Sinal para carregar K 
     i_LOAD_CLEAR : IN STD_LOGIC;        -- Sinal para limpar K 
     i_A    : IN UNSIGNED (7 downto 0);     -- Entrada A 
     i_B    : IN UNSIGNED (7 downto 0);     -- Entrada B 
     o_OUTS   : OUT INTEGER;        -- Saida da operação aritmética 
     o_COMP   : OUT STD_LOGIC        -- Saída do comparador 
    ); 
end component; 


component operacao_modulo_control is 
port (
     i_CLK : IN STD_ULOGIC; 
     i_RST : IN STD_LOGIC; 
     i_S  : IN INTEGER; 
     i_COMP : IN STD_LOGIC; 
     o_LD_CLR : OUT STD_LOGIC; 
     o_LD_K : OUT STD_LOGIC; 
     o_DOUT : OUT INTEGER 
    ); 
end component; 


signal w_OUT0 : INTEGER; 
signal w_OUT3 : INTEGER; 
signal w_OUT1 : STD_LOGIC; 
signal w_OUT2 : STD_LOGIC; 
signal w_OUT : STD_LOGIC; 




begin 

u_0: operacao_modulo_datapath port map (
              i_RESET   => i_RESETAR,   
              i_CLOCK   => i_CLCK,   
              i_LOAD_K   => w_OUT2, 
              i_LOAD_CLEAR  => w_OUT1, 
              i_A    => i_INA, 
              i_B    => i_INB, 
              o_OUTS   => w_OUT0, 
              o_COMP   => w_OUT   
             ); 

u_1: operacao_modulo_control port map (
             i_CLK => i_CLCK, 
             i_RST => i_RESETAR, 
             i_S  => w_OUT0, 
             i_COMP => w_OUT, 
             o_LD_CLR => w_OUT1, 
             o_LD_K => w_OUT2, 
             o_DOUT => w_OUT3 
            ); 


o_SOMA <= w_OUT3;    


end arch_1; 

Antwort

2

Ihr Problem ist, diese Zeile:

o_DOUT <= i_S WHEN (stateT = s3) ELSE 0; 

stateT ist nur s3 eine Uhr in drei, also Sie ausgegeben. Wenn Sie nicht die Nullen wollen, müssen Sie den Wert von i_S in einigen Flip-Flops speichern, die aktualisiert werden, wenn stateT = s3:

PROCESS(i_CLK) 
BEGIN 
    IF rising_edge(i_CLK) THEN 
    IF i_RST = '1' THEN 
     o_DOUT <= 0; 
    ELSIF stateT = s3 THEN 
     o_DOUT <= i_S; 
    END IF; 
    END IF; 
END PROCESS; 

http://www.edaplayground.com/x/25QN

+0

Oder nicht die zwei vor eins Mutiplexer verwenden gesteuert von stateT = 3. – user1155120

+0

Also brauche ich noch einen Prozess, um dies zu tun? – Mutante

+0

@ user1155120 Ja - wenn i_S für alle drei Taktzyklen stabil ist. Ohne einen MCVE ist es eine Anstrengung zu sagen, ob das der Fall ist. –