2017-04-21 6 views
0

Ich hätte nur einen Kommentar in den folgenden Post geschrieben, aber ich habe dieses Privileg noch nicht, also dachte ich, ich könnte nur eine Frage stellen, damit ich eine Klarstellung bekommen kann.Wie funktioniert dieser VHDL-Code?

how to delay a signal for several cycles in vhdl

Grundsätzlich muss ich 2 Taktzyklus Verzögerung dieses Prozesses in der Verhaltens meiner VHDL-Projekt (der Code, für die unten gezeigt) befindet sich implementieren:

process(font_address(0), font_address(1), font_address(2), font_address(3),font_address(4), font_address(5), font_address(6), font_address(7),vga_hcount(0), vga_hcount(1),vga_hcount(2),CLK) 

begin 




--if (CLK'event and CLK = '1') then 
    -- a_store <= a_store(1 downto 0) & a; 
    -- a_out <= a_store(1 downto 0); 
--end if; 

if (CLK'event and CLK = '1') then 
case vga_hcount(2 downto 0) is 
when "000" => font_bit <= font_data(7); 
when "001" => font_bit <= font_data(6); 
when "010" => font_bit <= font_data(5); 
when "011" => font_bit <= font_data(4); 
when "100" => font_bit <= font_data(3); 
when "101" => font_bit <= font_data(2); 
when "110" => font_bit <= font_data(1); 
when "111" => font_bit <= font_data(0); 
when others => font_bit <= font_data(0); 
end case; 
end if; 



end process; 

Wie Sie sehen können Ich habe es so gemacht, dass es eine einzige Taktzyklusverzögerung braucht, bevor die Signalzuweisungen in dem Prozess gemacht werden, wie durch die if-Anweisung um die Signalzuweisungen bereitgestellt, aber ich kann keine synthetisierbare Verzögerung von 2 Taktimpulsen trotz des Lesens der beantwortete Frage verbunden oben

Wenn ich kommentieren Sie die if-Anweisung um den Fall eingewickelt und Kommentar- der folgenden Codeblock

if (CLK'event and CLK = '1') then 
a_store <= a_store(1 downto 0) & a; 
a_out <= a_store(1 downto 0); 
end if; 

, die von den Link am Anfang dieser Frage, die ich die folgende Fehlermeldung gegeben genommen wurde:

[Synth 8-690] Breite stimmt nicht überein in Zuordnung; Ziel hat 2 Bits, Quelle hat 3 Bits ["U:/Computer-Organisationslabor/vga/vga_prac.vhd": 304]

Das Ziel, auf das in dieser Fehlermeldung verwiesen wird, ist der a_store-Vektor und die Quelle ist die Verkettung von a_store und a.

Dies ist, nachdem ich Logik 1 zu a zugewiesen und erstellt a_store und a_out als Std_logic_vectors mit 2 Elementen (wie ich eine Verzögerung von zwei Taktzyklen will). Ich denke, der Grund, warum ich diesen Fehler erhalte, liegt darin, dass ich selbst nach stundenlanger Lektüre dieser Frage immer noch nicht zu verstehen vermag, wie sie tatsächlich eine Verzögerung von zwei Taktzyklen erzeugen soll.

Ich dachte zuerst könnte es sein, dass ein 1 Bit durch den a_store Vektor iteriert wird, bis das MSB eins ist und dann dieser Vektor auf a_out angewendet wird, aber auf die Tatsache schauend, dass es in einer if-Anweisung ist, kann ich nicht Sehen Sie, wie diese zwei Codezeilen sogar mehr als einmal ausgeführt würden. Wenn das überhaupt wahr wäre, müsste ich einen Test haben, um sicherzustellen, dass a_out eine 1 in seinem MSB hat.

Normalerweise hätte ich weitergemacht, aber nach umfangreicher Suche konnte ich keine einfachere Lösung als diese finden, obwohl ich nicht ganz verstehe, wie es funktionieren soll.

Wenn jemand dies klarstellen oder eine Änderung an meinem Programm vorschlagen könnte, die die erforderliche Verzögerung erzeugen würde, die großartig wäre.

Vielen Dank im Voraus,

Simon.

+1

Es gibt viele unnötige Namen in der Prozess Empfindlichkeit Liste. Nur 'CLK' ist erforderlich. – JHBonarius

+1

Der Code, von dem Sie behaupten, dass er von der anderen Frage kopiert/eingefügt wurde, ist in der Tat anders. –

+1

Martins Antwort auf Ihre verknüpfte Frage zeigt 'a_store <= a_store (store'high-1 downto 0) & a;' was die richtige Antwort gibt. In einem absteigenden Bereich (downto) gibt 'high' den Indexwert der linken Grenze an. Bei einem Array-Subtyp mit zwei Elementen 1 bis 0 würde a_store (0 bis 0) ein Array-Wert mit einem Element sein. Ihr Problem ist, dass Sie Martins Antwort nicht treu umgesetzt haben. Sie können auch eine [MCVe] (https://stackoverflow.com/help/mcve) angeben, damit die Deklarationen sichtbar sind. Auch 'font_bit <= font_data (to_integer (nicht signiert (nicht vga_hcount (2 downto 0)))); ein 8-fach-Multiplexer. – user1155120

Antwort

2

Zunächst einmal, der erste Code nicht so effizient ist, und könnte zu

use ieee.numeric_std.all; 
[...] 

process(CLK) 
begin 
    if rising_edge(CLK) then 
     font_bit <= font_data(7 - to_integer(unsigned(vga_hcount(2 downto 0)))); 
    end if; 
end process; 

Für den zweiten Teil reduziert werden, sagt der Fehler alles. Sie sagen a_store hat 2 Bits (oder "Elemente", wie Sie es nennen), dann können Sie sich vorstellen, dass a_store(1 downto 0) & a zwei Bits a_store + 1 Bit a = 3 Bits ist. Sie können 3 Bits nicht 2 Bits zuweisen. Wie würde das passen? Gleiches Problem beim Zuweisen a_out: Wie können 2 Bits in 1 Bit passen?

So:

if (CLK'event and CLK = '1') then 
    a_store <= a_store(0) & a; 
    a_out <= a_store(1); 
end if; 
+0

Danke für das Feedback, wenn ich zurück ins Labor komme, werde ich diese Änderung vornehmen und sehen, ob es richtig funktioniert. – burton01

+0

Das funktioniert nur, ich musste a_store (1 downto 0) zu a_out zuweisen und nicht, was Sie hier getan haben. Trotzdem danke. – burton01

+0

@ burton01 Da Sie den vollständigen Code nicht angegeben haben, kann das wahr sein. Ich habe nur den Code für eine normale Zwei-Uhr-Verzögerung vorgeschlagen. – JHBonarius