Quartus 2 VHDL Clock Frequency Divider: Kann die Definition des Operators "+" nicht bestimmen

Ich bin extrem neu in VHDL und versuche, einige einfache Projekte zu machen, so dass ich die Grundlagen und die Syntax lerne. Ich benutze Quartus 2 zu Hause und ISE 10.1 am Schulcomputer. Ich habe genau den gleichen Code in beide geschrieben, wo der Code ist:

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

    entity freq_divider is port(        

        clk: in std_logic;
        clkdividedby2,clkdividedby4,clkdividedby8: out std_logic
    );

    end freq_divider;

    architecture karakter of freq_divider is

    signal count4 : std_logic := '0'; --In this line, count4 is initialized as 0.
    signal count8 : std_logic_vector (1 downto 0) := "00"; -- Count 8 is initialized as 0.
    signal clkdividedby2_temp,clkdividedby4_temp,clkdividedby8_temp : std_logic :='0';

    begin

    process(clk) 



    begin
    if(rising_edge(clk)) then


    clkdividedby2_temp<= not clkdividedby2_temp;
    count4 <= count4 + '1';
    count8 <= count8 + "01";

    if(count4 = '1') then -- = Tests for equality, not ==
    clkdividedby4_temp<= not clkdividedby4_temp;
    count4<='0';
    end if;

    if(count8 = "11") then
    clkdividedby8_temp<= not clkdividedby8_temp;
    count8<="00";
    end if;

    end if;
    end process;

    clkdividedby2<=clkdividedby2_temp;
    clkdividedby4<=clkdividedby4_temp;
    clkdividedby8<=clkdividedby8_temp;

    end karakter;

Dies wurde auf ISE 10.1 in der Schule perfekt synthetisiert, aber in Quartus 2 erhalte ich den Fehler:

Die Definition des Operators ""+"" kann nicht bestimmt werden -- es wurden 0 mögliche Definitionen gefunden

Ich habe keine Ahnung, warum dies geschieht. Ich habe alle Bibliotheken und Sachen geschrieben, und es funktioniert immer noch nicht.

Antworten (2)

Sie versuchen, Additionen an std_logicund durchzuführen std_logic_vector- das macht in VHDL keinen Sinn, da diese Typen keine numerischen Werte enthalten.

Wenn Sie zusätzlich arbeiten möchten, müssen Sie beides verwenden

  • ein Typ, der eine gut definierte Überlaufsemantik hat, sodass klar ist, was passieren soll, wenn sich zwei '1'Werte in einer Addition treffen, oder
  • ein Typ, der ein reiner numerischer Wert ist und an den keine Repräsentation angehängt ist.

Für einen Zähler, der nur mit einem festen Wert verglichen, aber nie gelesen wird, würde ich mich für Letzteres entscheiden, den Typ ändern und naturalihm eine rangeEinschränkung geben und es dem Compiler überlassen, eine interne Darstellung auszuwählen.

Aber warum macht es in ISE Sinn, aber nicht in Quartus? Ich habe meinen Code in der Schule in ISE 10.1 verwendet und es hat funktioniert, in Quartus 2 nicht.
Meine erste Vermutung ist, dass sie versuchen, "hilfreich" zu sein.
Nun, ich habe count4 und count8 als Ganzzahlen definiert und jetzt funktioniert der Code perfekt, aber die Sache ist, dass der Compiler zwei 32-Bit-Zahlen verwendet, wenn ein einzelnes Bit und zwei Bits für count4 bzw. count8 erforderlich sind. Ist es nicht eine Verschwendung von Speicher oder wird es die Anzahl der Bits reduzieren, die bei der Optimierung verwendet werden?
In VHDL können Sie die zulässigen Werte mit dem rangeSchlüsselwort einschränken. Beschränkt man auf 0 to 3, bekommt man zwar das gewünschte Verhalten, aber auch einen Fehler in der Simulation, weil man den Wert 4kurzzeitig zuweist, auch wenn man ihn später gleich wieder überschreibt (weil <=Zuweisungen erst am Ende des Blocks durchgeführt werden).

Der Zusatz für den Typ std_logic_vector wird im IEEE-Paket numeric_std_unsigned sowie im Synopsys-Paket std_logic_unsigned unterstützt.

Was nicht unterstützt wird, ist die Addition für den Typ std_logic, wobei die Addition "and" entsprechen würde. Ersetzen Sie count4 <= count4 + '1';durch count4 <= not count4;oder verwenden Sie einfach clkdividedby2_temp.

Sie könnten die temporären Flipflops auch als Teil derselben std_logic_vectors anzeigen, indem Sie count4 auf Länge 2 und count8 auf Länge 3 setzen und die MSBs clkdividedby4 und clkdividedby8 zuweisen sowie clkdividedby2_temp count2 umbenennen.

Sie könnten auch einen einzelnen 3-Bit-Zähler verwenden:

library ieee;
use ieee.std_logic_1164.all;
-- use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;
-- OR use ieee.numeric_std_unsigned.all;

entity freq_divider is
     port (        
        clk:            in  std_logic;
        clkdividedby2, 
        clkdividedby4, 
        clkdividedby8:  out std_logic
    );
end entity freq_divider;

architecture foo of freq_divider is
    signal count : std_logic_vector (2 downto 0) := (others => '0');
begin
    process (clk) 
    begin
        if rising_edge(clk) then
            count <= count + 1;
        end if;
    end process;

    clkdividedby2 <= count(0);
    clkdividedby4 <= count(1);
    clkdividedby8 <= count(2);

end architecture;

und mit einer kleinen testbench:

library ieee;
use ieee.std_logic_1164.all;

entity freq_divider_tb is
end entity;

architecture foo of freq_divider_tb is
    signal clk:             std_logic := '0';
    signal clkdividedby2:   std_logic;
    signal clkdividedby4:   std_logic;
    signal clkdividedby8:    std_logic;
begin
DUT:
    entity work.freq_divider
        port map (
            clk => clk,
            clkdividedby2 => clkdividedby2,
            clkdividedby4 => clkdividedby4,
            clkdividedby8 => clkdividedby8
        );
CLOCK:
    process
    begin
        wait for 5 ns;
        clk <= not clk;
        if now > 160 ns then
            wait;
        end if;
    end process;
end architecture;

Sie würden bekommen:

freq_divider_tb.png

während Sie einige Flip-Flops sparen, indem Sie Hardware modellieren.

Es gibt sehr wenig Unterschied zwischen Ihrem Code und meinem. Ich habe versucht, count4<=count4+1 in meinen Code zu schreiben, aber meiner funktioniert immer noch nicht und gibt den gleichen Fehler aus. Ich habe nicht verstanden, wie count<= count + '1' bedeutet und Operation, aber count<=count +1 nicht? Ich habe Ihren Code auch mit count<=count+"001" ausprobiert und es funktioniert auch. Ich bin verwirrt
Oh, ich habe dich, denke ich. Für einzelne Bits können wir die Dinge nicht durch count<=count + '1' zum Laufen bringen; . Ich verstehe immer noch nicht, warum es bedeutet und obwohl? Aber es ist sicher zu sagen, count4<=count4 + "01", wenn es ein std_logic_vector der Größe 2 wäre, oder?