2017-09-10 3 views
0

Ich bin technisch neu in VHDL, und ich muss eine Pause von 2 Hz oder 0,5 Hz im VHDL-Programm für ein Counter-Projekt machen.Wie kann ich eine Pause von 2Hz in einer Uhr in VHDL machen?

Auf der anderen Seite, ich habe den folgenden Code:

architecture behavior of Counter is 
signal q: std_logic_vector(7 downto 0); 

begin 
process(clock, choose) 
    begin 

    if clear = '1' then 
     q <= q - q; 
    else 
     if rising_edge(clock) then 
      -- when choose is '1', the process if for increment 
      if(choose = '1') then 
       case incodec is   
        when "001" => q <= q + 1; 
        when "011" => q <= q + 10; 
        when "111" => q <= q + 11; 
        when others => q <= q; 
       end case; 
      -- when choose is '0', the process if for decrement 
      elsif choose = '0' then 
       case incodec is   
        when "001" => q <= q - 1; 
        when "011" => q <= q - 10; 
        when "111" => q <= q - 11; 
        when others => q <= q; 
       end case; 
      end if; 
     end if; 
    end if; 
    case q(7 downto 4) is 
            --
     when "0000" => hex7 <= "1000000"; --0 
     when "0001" => hex7 <= "1111001"; --1 
     when "0010" => hex7 <= "0100100"; --2 
     when "0011" => hex7 <= "0110000"; --3 
     when "0100" => hex7 <= "0011001"; --4 
     when "0101" => hex7 <= "0010010"; --5 
     when "0110" => hex7 <= "0000010"; --6 
     when "0111" => hex7 <= "1111000"; --7 
     when "1000" => hex7 <= "0000000"; --8 
     when "1001" => hex7 <= "0010000"; --9 
     when "1010" => hex7 <= "0001000"; --10/A 
     when "1011" => hex7 <= "0000011"; --11/B/b 
     when "1100" => hex7 <= "1000110"; --12/C 
     when "1101" => hex7 <= "0100001"; --13/D/d 
     when "1110" => hex7 <= "0000110"; --14/E 
     when "1111" => hex7 <= "0001110"; --15/F 
     when others => hex7 <= "0111111"; -- - 
    end case; 

    case q(3 downto 0) is 
            --
     when "0000" => hex6 <= "1000000"; --0 
     when "0001" => hex6 <= "1111001"; --1 
     when "0010" => hex6 <= "0100100"; --2 
     when "0011" => hex6 <= "0110000"; --3 
     when "0100" => hex6 <= "0011001"; --4 
     when "0101" => hex6 <= "0010010"; --5 
     when "0110" => hex6 <= "0000010"; --6 
     when "0111" => hex6 <= "1111000"; --7 
     when "1000" => hex6 <= "0000000"; --8 
     when "1001" => hex6 <= "0010000"; --9 
     when "1010" => hex6 <= "0001000"; --10/A 
     when "1011" => hex6 <= "0000011"; --11/B/b 
     when "1100" => hex6 <= "1000110"; --12/C 
     when "1101" => hex6 <= "0100001"; --13/D/d 
     when "1110" => hex6 <= "0000110"; --14/E 
     when "1111" => hex6 <= "0001110"; --15/F 
     when others => hex6 <= "0111111"; -- - 
    end case; 
end behavior 

Wenn das Programm kompiliert zeigt die folgenden Fehler:

Error (10818): Can't infer register for "q[0]" at Counter.vhd(28) because it does not hold its value outside the clock edge I don't know what is means

Helfen Sie mir bitte :(

+0

wirklich sind 11 Fehler wie diese. –

+2

Bitte zeigen Sie uns zunächst den vollständigen Code, da der Fehler wahrscheinlich außerhalb des Code-Snippets liegt. Zweitens, warum gibt es so viele führende Nullen in Ihren steigenden Zahlen? An dritter Stelle müssen Sie q in den anderen Fällen nicht q zuweisen, da es sich um einen getakteten Prozess handelt, da einige Synthesizer durch diesen Codierungsstil irritiert werden könnten. Ist Ihnen bekannt, dass '00000011' ein Integer-Literal mit dem Wert 11 anstelle einer Binärzahl mit dem Wert 3 ist? – Paebbels

+1

Wie hängen Sie in Bezug auf eine Pause mit Ihrem Code-Snippet zusammen? Pausen werden nicht in Hertz gemessen, sondern in Sekunden, weil es eine Zeit und keine Frequenz ist. – Paebbels

Antwort

4

Ihren Code enthält mehrere Fehler:

  • Verwenden Sie die Synopsys-Pakete nicht für arithmetische Operationen.
    Verwenden Sie stattdessen das Paket numeric_std und die Typen signed und/oder unsigned.
  • q stellt den Zustand dar und wird als Flip-Flops synthetisiert.
    Also auf einer FPGA-Technologie, initialisieren sie: := (others => '0')
  • clear ist ein asynchrones Signal, also liste es in der Empfindlichkeitsliste auf.
  • choose ist ein synchrones Signal, also listet es nicht in der Empfindlichkeitsliste auf.
  • Wenn Sie die Zahlen 1,2,3 hinzufügen möchten, verwenden Sie geeignete Ganzzahlliterale oder geben Sie Ihr Literal explizit als Binärcode an. Der Standardwert ist Dezimal.
  • Durch die Verwendung von Variablen wird der Code gekürzt, indem Duplikate vermieden werden.
  • Löschen q sollte durch Zuweisen aller Nullen mit einem Aggregat erfolgen: (others => '0').
  • Eine for-Schleife und eine andere Variable können Ihren Code weiter reduzieren und einen weiteren großen Bereich doppelten Codes entfernen.
  • Die Benutzervariable hex entfernt auch eine zusätzliche Registerstufe, die wahrscheinlich von den meisten Designern nicht vorgesehen ist.
  • Sie haben die Segmentnamen der 7-Segment-Anzeige kommentiert, aber die Segmente heißen normalerweise GFEDCBA.
  • Sie sollten Ihren 7-Segment-Decoder in eine separate Einheit oder Funktion einfügen, um die Wiederverwendbarkeit zu erhöhen.
  • Ihr 7-Segment-Anzeigecode ist schwach aktiv, Designer sollten jedoch High-Active-Code schreiben. Die geringe Aktivität ist auf das Board- oder Display-Design zurückzuführen und nicht auf die Verantwortung des Decoders. Die Invertierung kann durchgeführt werden, wenn hex zu hex7 zugewiesen wird.

Hier ist die verbesserte Code:

library IEEE; 
use  IEEE.std_logic_1164.all; 
use  IEEE.numeric_std.all; 


entity Counter is 
    -- ... 
end entity; 


architecture behavior of Counter is 
    signal q : unsigned(7 downto 0) := (others => '0'); 
begin 
    process(clock, clear) 
     variable decoded : positive; 
     variable hex  : std_logic_vector(13 downto 0); 
    begin 
     case incodec is   
      when "001" => decoded := 1; 
      when "011" => decoded := 2; 
      when "111" => decoded := 3; 
      when others => decoded := 0; 
     end case; 

     if clear = '1' then 
      q <= (others => '0'); 
     elsif rising_edge(clock) then 
      if(choose = '1') then  -- when choose is '1', the process if for increment 
       q <= q + decoded; 
      elsif (choose = '0') then -- when choose is '0', the process if for decrement 
       q <= q - decoded; 
      end if; 
     end if; 

     for i in 0 to 1 loop 
      case q(i*4+7 downto i*4) is   --
       when "0000" => hex(i*7+6 downto i*7) := "1000000"; --0 
       when "0001" => hex(i*7+6 downto i*7) := "1111001"; --1 
       when "0010" => hex(i*7+6 downto i*7) := "0100100"; --2 
       when "0011" => hex(i*7+6 downto i*7) := "0110000"; --3 
       when "0100" => hex(i*7+6 downto i*7) := "0011001"; --4 
       when "0101" => hex(i*7+6 downto i*7) := "0010010"; --5 
       when "0110" => hex(i*7+6 downto i*7) := "0000010"; --6 
       when "0111" => hex(i*7+6 downto i*7) := "1111000"; --7 
       when "1000" => hex(i*7+6 downto i*7) := "0000000"; --8 
       when "1001" => hex(i*7+6 downto i*7) := "0010000"; --9 
       when "1010" => hex(i*7+6 downto i*7) := "0001000"; --10/A 
       when "1011" => hex(i*7+6 downto i*7) := "0000011"; --11/b 
       when "1100" => hex(i*7+6 downto i*7) := "1000110"; --12/C 
       when "1101" => hex(i*7+6 downto i*7) := "0100001"; --13/d 
       when "1110" => hex(i*7+6 downto i*7) := "0000110"; --14/E 
       when "1111" => hex(i*7+6 downto i*7) := "0001110"; --15/F 
       when others => hex(i*7+6 downto i*7) := "0111111"; -- - 
      end case; 
     end loop; 

     hex7 <= hex(13 downto 7); 
     hex6 <= hex(6 downto 0); 
    end process; 
end architecture; 
+0

Wie lautet die Antwort * Wie kann ich eine Pause von 2Hz in einer Uhr in VHDL machen? * – user1155120

+0

@ user1155120 Während ich Teil 1 der Antwort schreibe, um seinen Code zum Laufen zu bringen, löse ich seine implizite Frage nach einem Zustand, der nicht draußen gehalten wurde wenn steigende Flanke. Ich hoffe immer noch auf eine Bearbeitung, um Teil zwei zu schreiben, wenn er seine Frage klärt. – Paebbels

Verwandte Themen