Archiv verlassen und diese Seite im Standarddesign anzeigen : [VHDL] binärzähler
Ich hab mal zwei versionen eines 4Bit binärzähler gebastelt und wollte mal fragen ob sich das mal einer anschauen kann, denn ich habe keine möglichkeit das zu testen.
V1: mit takt hochzählen
library ieee;
use ieee.std_logic_unsigned.all; -- einbinden von 'integer' Zahlen
use ieee.std_logic_1164.all;
entity binarycounter is -- anfang entity
port (clk : in std_logic;
count : out std_logic_vector (3 downto 0));
-- zuweisung der pins
attribute location : string;
attribute location of clk : signal is "P11";
attribute location of count(0) : signal is "P40";
attribute location of count(1) : signal is "P41";
attribute location of count(2) : signal is "P42";
attribute location of count(3) : signal is "P43";
end; -- ende entity
architecture counter of binarycounter is
begin
process(clk)
if (clk'event and clk='1')
count <= count + 1;
end if;
end process;
end counter;
V2: mit takt hochzählen, reset setzt 0
library ieee;
use ieee.std_logic_unsigned.all; -- einbinden von 'integer' Zahlen
use ieee.std_logic_1164.all;
entity binarycounter is -- anfang entity
port (clk, reset : in std_logic;
count : out std_logic_vector (3 downto 0));
-- zuweisung der pins
attribute location : string;
attribute location of clk : signal is "P11";
attribute location of count(0) : signal is "P40";
attribute location of count(1) : signal is "P41";
attribute location of count(2) : signal is "P42";
attribute location of count(3) : signal is "P43";
end; -- ende entity
architecture counter of binarycounter is
begin
process(clk, reset)
if (clk'event and clk='1') -- zählen
count <= count + 1;
end if;
if (reset ='1') -- asynchroner reset
count <= '0'
end if;
end process; -- ende des prozesses
end counter;
Danke, ich hoffe ich bin im richtigen forum
FireBird2002
13.05.2006, 23:05
Beim Drüberkucken, kann ich folgenden Fehler entdecken können:
architecture counter of binarycounter is
begin
process(clk, reset)
if (reset ='1') -- asynchroner reset
count <= '0';
elseif (clk'event and clk='1') -- zählen
count <= count + 1;
end if;
end process; -- ende des prozesses
end counter;
In diesem Fall wird auf jeden Fall ein Flip-Flop erzeugt. Ob deine Version funktioniert ist fraglich. Außerdem fehlte ein ";".
Diese attribute-Blöcke kenn ich zwar nicht, aber sieht ok aus. Zum Testen kannst du aber Demos von Simulatoren benutzen:
- den Modelsim-Simulator gibt es, soweit ich weiß in einer größenbeschränkten Form
- Symphony EDA VHDL Simuli auch größenbeschränkt
- Eine Version von ORCAD
- Xilinx hat in der ISE 8.1 einen eigenen Simulator. Die ISE ist in der Webpack Edition kostenfrei
Ich hab mal zwei versionen eines 4Bit binärzähler gebastelt und wollte mal fragen ob sich das mal einer anschauen kann, denn ich habe keine möglichkeit das zu testen.
(snip)
Danke, ich hoffe ich bin im richtigen forum
Du programmierst hier VHDL als RTL, das ist ok.
Je nach Architektur kann dein Ansatz funtkionieren, muß aber nicht. Viele CPLD unterstützen im Gegensatz zu FCPGAs keine dual edged events, also kann es mitunter vorkommen, daß clk'event als Fehler angemeckert wird. Sofern du im Prozess mit einer konsistenten Edge auskommst, kann man das an der Signal-edge festmachen.
Außerdem sollte RESET Vorrang haben, in deinem Beispiel könnte count kurzzeitig undefined sein, oder jittern. Mein Vorschlag:
BinaryCounter: process (clk, reset)
begin
if (reset = '0') then -- sollte RESET nicht, wie üblich, low aktiv sein?
count <= 0;
else
-- Wenn kein Reset anliegt und CLK aktiv wird,
-- count inkrementieren.
if (rising_edge(clk)) then
-- Overflow abfangen
if (count="1111") then
count <= 0;
else
count <= count + 1;
end if;
end if;
end if;
end process; -- ende des prozesses
Den Datentyp von count solltest du vielleicht noch mal überdenken :-)
Das was ich da gemacht hab war fast richtig, habe die richtige version im DigiLab ausporbiert und funktioniert ohne Probleme. (danach kam noch ne normale ampel, eine orange-blinkende und ein mux dazu).
Es handelte sich übrigens um einen MACH Baustein in System.
Falls es jemand intressiert:
library ieee;
use ieee.std_logic_unsigned.all; -- einbinden von 'unsigned int' Zahlen
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
entity binarycounter is -- anfang entity
port (clk, reset : in std_logic;
count : out std_logic_vector (3 downto 0));
end; -- ende entity
architecture counter of binarycounter is
signal temp : std_logic_vector (3 downto 0);
begin
process(clk, reset)
begin
if (clk'event and clk='1') then
temp <= temp + 1;
end if;
if (reset = '1') then
temp <= "0000";
end if;
end process;
count <= temp;
end counter;
Das was ich da gemacht hab war fast richtig, habe die richtige version im DigiLab ausporbiert und funktioniert ohne Probleme. (danach kam noch ne normale ampel, eine orange-blinkende und ein mux dazu).
Es handelte sich übrigens um einen MACH Baustein in System.
Falls es jemand intressiert:
...
architecture counter of binarycounter is
signal temp : std_logic_vector (3 downto 0);
begin
process(clk, reset)
begin
if (clk'event and clk='1') then
temp <= temp + 1;
end if;
if (reset = '1') then
temp <= "0000";
end if;
end process;
count <= temp;
end counter;
Du brauchst in deinem Ansatz ein zusätzliches Latch, was u.U. zu einem Straftakt führen kann.
Wenn Zeit und Silizium keine Rolle spielen, ist das sicherlich ok,aber warum latched du das Ausgangssignal, wenn nicht zusätzliche Operationen darauf stattfinden?
FireBird2002
21.05.2006, 23:26
Es gibt immer einen Unterschied zwischen Simulation und Synthese.Simulieren läßt sich vieles, der Simulator überprüft nur das logische Verhalten. Die Synthese muß aus dem Code eine Schaltung produzieren. Es ist sicherer, wenn du feste Muster benutzt, die die Synthese auch richtig inferieren kann. Wnn du nur einen Zähler beschreibst geht das noch, aber bei komplexeren Schaltungen wird die Synthese eventuell etwas produzieren, was du nicht wolltest.
Es gibt immer einen Unterschied zwischen Simulation und Synthese.Simulieren läßt sich vieles, der Simulator überprüft nur das logische Verhalten. Die Synthese muß aus dem Code eine Schaltung produzieren. Es ist sicherer, wenn du feste Muster benutzt, die die Synthese auch richtig inferieren kann. Wnn du nur einen Zähler beschreibst geht das noch, aber bei komplexeren Schaltungen wird die Synthese eventuell etwas produzieren, was du nicht wolltest.
Nun ja, wenn man das postfit simulation model in den Multisim schiebt kommt schon ziemlich genau das heraus, was der Baustein später auch im realen Umfeld anrichten wird, zumindest nach meiner Erfahrung. Durch Laufzeiten, eingeschobene Latches und unglückliches Gating kommt es immer wieder zu ... erstaunlichen Ergebnissen. Es ist schon richtig, daß man sich einen Satz "best practices" anlegen sollte, Vorgehensweisen von denen man weiß, daß sie funktionieren (das prägt auch einen eigenen, hoffentlich halbwegs sauberen Stil), aber um ausgiebiges Simulieren kommt man einfach nicht herum. Sogar ein kleines, unspektakuläres GAL kann schon für Kopfzerbrechen sorgen.
Für ganze einfache, determinierte Logiken mit festen Abläufen und Timings und ohne viel Feedback ist meiner Erfahrung nach die EPROM-Methode ganz praktisch...
FireBird2002
22.05.2006, 10:41
Ich habe natürlich nicht gemeint, das eine Simulation unbrauchbar ist, sie ist sehr wichtig. Ich wollte nur ausdrücken, das man mit dem Ergebnis der funktionalen Simulation sehr vorsichtig sein soll. Eine Gate-Level Simulation ist natürlich genauer, die hatte ich auch nicht gemeint.
Was meinst du mit EPROM-Methode?
Ich habe natürlich nicht gemeint, das eine Simulation unbrauchbar ist, sie ist sehr wichtig. Ich wollte nur ausdrücken, das man mit dem Ergebnis der funktionalen Simulation sehr vorsichtig sein soll. Eine Gate-Level Simulation ist natürlich genauer, die hatte ich auch nicht gemeint.
Eine gute Gatelevel-Simulation bekommen nur die wenigsten Programme hin - und auf ein größeres Gatterarray ein PSpice loslassen, oh je, da kann man alt werden.
Was meinst du mit EPROM-Methode?
Das ist eine ganz einfache Methode um relativ kleine, statische Probleme zu lösen oder feste Timings oder Statemachines zu bauen...
Du legst deine logischen Eingänge auf die A-Bits eines EPROMs, und deine Ausgänge auf die D-Bits. Wenn du Feedbacks hast, führst du die Ds auch wieder auf die As zurück. Jetzt mußt du das EPROM so programmieren, daß zu jeder gültigen Eingangskombination auf den Adressbits die korrekte Ausgangskombination der Datenbits entsteht, inklusive möglicher Feedbacks... Nach einem Toggle des CLK-Eingangs hast du direkt den korrekte Ausgangswert. Mit einem 2764 (8 Adressbits, 8 Datenbits) bekommst du z.B. ohne jegliche äußere Beschaltung einen 7-Segment Zähler oder -Treiber, einen Binärzähler up/down, einen Muxer, einen Demuxer und alles mögliche andere hin :-)
FireBird2002
22.05.2006, 11:48
geniale Idee. Für meinb derzeitiges Projekt (Thesis) bringt mir das zwar nix, aber ich werd's mir merken...
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.