VHDL Definieren Sie ein signal, wenn Undefinierte
So, ich habe einige VHDL-Hausaufgaben, und ich habe einige Schwierigkeiten mit meiner testbench. Im Grunde, meine testbench ausgeführt wird, durch die verschiedenen Möglichkeiten für eine Reihe von flip-flops. Allerdings, ich bekomme den 'U' - als ein Ergebnis aus einer der flip-flops, und während ich weiß genau, warum, ich habe keine Ahnung wie es zu lösen ist.
Im Grunde, was passiert ist, ist, dass es für meinen T-flip-flop, da Q nicht eingestellt, wenn ich die XOR-operation, das Programm endet nie, bis ein Wert zugewiesen Q nach der XOR-operation. Also im Grunde, ich brauche eine Möglichkeit der Einstellung von Q, sagen wir, 0, iff Q nicht definiert wurde.
Nur als Referenz, hier ist mein code für das T-flipflop
library ieee;
use ieee.std_logic_1164.all;
entity T_FF is
port (
T, clk : in std_logic;
Q : inout std_logic);
end T_FF;
architecture behv of T_FF is
begin
process (clk) is
variable hold1, hold2 : std_logic;
begin
if (clk'event) then
hold1 := Q and (not T);
hold2 := T and (not Q);
Q <= hold1 or hold2;
end if;
end process;
end behv;
Und der testbench:
library ieee;
use ieee.std_logic_1164.all;
entity tb is
end tb;
architecture behv of tb is
-- Component declaration
component T_FF is
port (
T, clk : in std_logic;
Q : inout std_logic);
end component;
signal sT : std_logic :='0';
signal sclk : std_logic :='0';
signal sQT : std_logic :='0';
for TFF : T_FF use entity work.T_FF(behv);
begin
TFF: T_FF port map (T=>sT, clk=>sclk, Q=>sQT);
sclk <= not sclk after 50 ns;
sT <= not sT after 100 ns;
end;
- Herzlich willkommen auf Stack Overflow! Deine Frage könnte besser geeignet sein, auf electronics.stackexchange.com, einer unserer Schwester-Websites.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Entschuldigung an Chris Laplante, aber deine Frage erscheint sehr viel eine gültige VHSIC Hardware Description Language (VHDL) Frage. (VHSIC in ein Akronym für Sehr Hohen Scale-Integration-Schaltung). Trotz gut gemeinten Wiki-Beschreibungen VHDL ist nicht ein Allzweck-Programmiersprache. Die Ausführung ist begrenzt entweder durch simulation oder in einer implementierungsabhängigen Weise, die Anzahl der aufeinander folgenden delta-Zyklen. Leihen eine umdrehung der Satz von Harry Harrison, VHDL ist hardware. All das sagte die electronics.stackexchange.com vhdl-tag könnten den Verkehr.
Ihre test-bench bietet bereits ein Standard-Wert für sT, die eigentliche, die für die formale T in Ihrem instanziiert T_FF. Aus den unbeschrifteten Prozess, den wir sehen, Variablen hold1 und halten Sie 2 Produkte von T und Q, also die Frage ist mit einem bekannten Wert von Q für die UND die Tabelle oder der Tabelle NICHT nach oben schauen in der Paket Körper std_logic_1164 produziert einige Wert neben 'U':
Aus den beiden Tabellen sehen wir, dass die Eingänge müssen eine '0', '1', 'H' oder 'L' zu liefern etwas anderes, als das 'U' oder 'X'. (Die horizontale Achse entspricht einem Eingang, die vertikale Achse repräsentiert die andere für eine zwei-input-UND-Funktion, wird der daraus resultierende Wert im array gefunden von Werten überschneidenden eine oder beide Achsen).
Also Q initialisiert werden, um eine dieser vier Werte. Es gibt zwei Möglichkeiten, dies zu tun, entweder spiegelt die Initialisierung eines FPGA, der eine Natürliche Tendenz in Richtung einer set-oder reset-Zustand, oder durch die Anwendung eines aktiven reset F. (Siehe Antwort, um die damit verbundene Frage VHDL - Asynchrone up/down Zähler).
Weil Sie haben gewählt, um den Q-port-Modus inout und verwenden Sie es, direkt in den feed-back die beste Wahl ist, um eine Rückstellung. Es gibt auch ein design-Fehler in Ihrer T_FF, wo Sie tätig sind, an beiden clock-Flanken auf, die gelöst werden können, durch die Qualifikation der clk'event mit clk = '1' zu betreiben, die nur auf eine Flanke (die steigende Flanke):
(Die 'failure mode über die beiden Kanten ist zum erzeugen einer Ausgabe, die ist die richtige Frequenz, sondern gilt nur für die niedrigen baud-von der Uhr, versuchen Sie es).
Also mit dem hinzufügen von einem asynchronen RESET-port in T_FF, component-Deklaration und Instanziierung Aussage im tb, ebenso wie das hinzufügen sRESET an Tuberkulose, und initialisieren Sie es auf true, so dass, wenn falsch, nachdem einige Intervall der T_FF simulation sieht wie folgt aus:
Es ist ein IEEE-Standard, auf Synthese-kompatiblen VHDL, IEEE-Standard 1076.6-2004, mit dem Titel IEEE Standard for VHDL Register Transfer Level (RTL) Synthese beschreibt die Konstrukte, die hier verwendet werden, siehe 6.1.3 Modellierung edge-sensitive storage-Elemente. Beachten Sie, dass RESET wurde Hinzugefügt, um die unbeschrifteten Prozess-Anweisung ist die Empfindlichkeit der Liste in T_FF.
Es sind hier zwei Probleme: (1) Auf das, was Sie versuchen zu bauen; (2) Auf den code selbst.
1) Auf, was Sie versuchen zu bauen:
Sie versuchen, zu bauen, ein T-flip-flop. Dies ist in der Regel gebaut mit einem D-Typ-flip-flop einfach durch den Anschluss einer umgekehrten version von seinem Ausgang zurück zum Eingang. In Ihrem Fall, Sie wollen auch ein "toggle-enable" - signal (den sogenannten T in Ihrem code), damit stoppen die TFF, wenn T=0 ist. Dies bedeutet, dass die TFF-Eingang gehen müssen, durch eine XOR-gate, sonst nichts.
Solche XOR-Gatter aufgebaut werden kann, wie Sie es getan hat (UND-ODER-Ebenen) oder mit direkt ein XOR-gate. Da die DFFs in FPGAs sind bereits gebaut mit ein enable-Anschluss (XOR-Funktionalität interne DFF), ist es besser, verwenden Sie den XOR-option, speichern von Logik und Betrieb schneller. Aber die andere Möglichkeit, die funktionieren auch, offensichtlich.
2) Hinsichtlich der code: