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.
Sie versuchen, Additionen an std_logic
und 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
'1'
Werte in einer Addition treffen, oderFü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 natural
ihm eine range
Einschränkung geben und es dem Compiler überlassen, eine interne Darstellung auszuwählen.
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:
während Sie einige Flip-Flops sparen, indem Sie Hardware modellieren.
Deniz Yildirim
Simon Richter
Deniz Yildirim
Simon Richter
range
Schlüsselwort einschränken. Beschränkt man auf0 to 3
, bekommt man zwar das gewünschte Verhalten, aber auch einen Fehler in der Simulation, weil man den Wert4
kurzzeitig zuweist, auch wenn man ihn später gleich wieder überschreibt (weil<=
Zuweisungen erst am Ende des Blocks durchgeführt werden).