2016-03-19 10 views
0

Ich versuche, in vhdl mit der Prozessanweisung zu programmieren. Unten ist mein VHDL-CodeVHDL: Prozess und Zähler funktioniert nicht

begin 

dcm_clk PORT MAP(
    CLKIN1_IN => clk, 
    RST_IN => reset, 
    CLKOUT0_OUT => clk0_fast, 
    CLKOUT1_OUT => clk0_dac, 
    CLKOUT2_OUT => clk90_fast, --13.33MHz ; div =60 
    CLKOUT3_OUT => clk_mux  --26.67MHz ; div =30 
); 


process(clk_mux, reset) 
begin 
if (reset = '0') then 
    if rising_edge(clk_mux) then 
     if count_m = 0 then -- 0 
      MUX_0 <= '1'; 
      count_m <= count_m + 1; 
     elsif count_m = 29 then 
      MUX_0 <= '0'; 
      count_m <= count_m + 1; 
     elsif count_m = 57 then 
      MUX_0 <= '1'; 
      count_m <= count_m + 1; 
     elsif count_m = 86 then 
      MUX_0 <= '0'; 
      count_m <= count_m + 1; 
     elsif count_m = 115 then 
      count_m <= (others => '0');   
    end if; -- end count_m 
    end if; -- end clock 

end if; -- end reset 

Der Wert count_m scheint auf den Wert fest zu sein ‚1‘. Ich verstehe nicht, warum es keinen Zähler für den Zähler gibt. Jede Hilfe wird sehr geschätzt. Die Ausgabe von dem Prüfstand wird unter

gezeigt

Testbench Output

Antwort

0

Ihr unmarkierten Prozess nur count_m für vier bestimmte Werte von count_m erhöht wird, und count_m = 1 ist nicht einer von ihnen.

Versuchen:

UNLABELLED_PROCESS: 
    process (clk_mux, reset) 
    begin 
     if (reset = '0') then 
      if rising_edge(clk_mux) then 
       count_m <= count_m + 1; 
       if count_m = 0 then -- 0 
        MUX_0 <= '1'; 
        -- count_m <= count_m + 1; 
       elsif count_m = 29 then 
        MUX_0 <= '0'; 
        count_m <= count_m + 1; 
       elsif count_m = 57 then 
        MUX_0 <= '1'; 
        -- count_m <= count_m + 1; 
       elsif count_m = 86 then 
        MUX_0 <= '0'; 
        -- count_m <= count_m + 1; 
       elsif count_m = 115 then 
        count_m <= (others => '0');   
      end if; -- end count_m 
      end if; -- end clock 

     end if; -- end reset 
    end process; 

Und was tut, ist Schritt count_m jedes clk_mux und wenn der Wert 115 ordnet sie alle ‚0en.

Und das gibt so etwas wie:

no_mcve_incrementing.png

wenn ich Ihre Taktperiode Arithmetik richtig verstanden habe. Beachten Sie, dass die Zuweisung von count_m + 1 zu count_m von der if-Anweisung für count_m = 115 überschrieben wird. Sie können auch sehen, dass MUX_0 ein Flipflop ist und seine Ausgabe nach der nächsten steigenden Flanke von clk_mux für einen count_m-Wert ändert, der eine Änderung angibt.

Hilfe zum Debuggen sollte dem antwortenden Leser die Möglichkeit geben, einen spezifischen Fehler durch Liefern eines Minimal, Complete, and Verifiable example neu zu erstellen.

In diesem Fall war es Sache eines zweiten Prozesses für clk_mux, vier Signal Erklärungen mit den notwendigen Anfangswerte alle in einer Einheit und Architektur Paar (jede Reset-Aktion fehlt):

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity no_mcve is 
end entity; 

-- dcm_clk PORT MAP(
--  CLKIN1_IN => clk, 
--  RST_IN => reset, 
--  CLKOUT0_OUT => clk0_fast, 
--  CLKOUT1_OUT => clk0_dac, 
--  CLKOUT2_OUT => clk90_fast, --13.33MHz ; div =60 
--  CLKOUT3_OUT => clk_mux  --26.67MHz ; div =30 
--); 

architecture foo of no_mcve is 
    signal count_m: unsigned (9 downto 0) := (others => '0'); 
    signal clk_mux: std_logic := '0'; -- clock 
    signal mux_0: std_logic := '0'; 
    signal reset: std_logic := '0'; 
begin 

UNLABELLED_PROCESS: 
    process (clk_mux, reset) 
    begin 
     if (reset = '0') then 
      if rising_edge(clk_mux) then 
       count_m <= count_m + 1; 
       if count_m = 0 then -- 0 
        MUX_0 <= '1'; 
        -- count_m <= count_m + 1; 
       elsif count_m = 29 then 
        MUX_0 <= '0'; 
        count_m <= count_m + 1; 
       elsif count_m = 57 then 
        MUX_0 <= '1'; 
        -- count_m <= count_m + 1; 
       elsif count_m = 86 then 
        MUX_0 <= '0'; 
        -- count_m <= count_m + 1; 
       elsif count_m = 115 then 
        count_m <= (others => '0');   
      end if; -- end count_m 
      end if; -- end clock 

     end if; -- end reset 
    end process; 
CLOCK: 
    process 
    begin 
     wait for 19.25 ns; 
     clk_mux <= not clk_mux; 
     if now > 7.3 us then 
      wait; 
     end if; 
    end process; 
end architecture; 
+0

Hallo. Vielen Dank für Ihre Antwort. Ich kann den Code arbeiten lassen. Ich habe es versäumt, dies früher zu sehen, da die Lösung so einfach war. Außerdem werde ich sicherstellen, dass ich in Zukunft einen Arbeitscode posten werde. – CanisMajoris