Ich will hier einen 4 Bit Zähler mit Reset verwirklichen, aber es kommt immer wieder der gleiche Error. LED_out[3] is constantly driven from multiple places. Wie kann Ich mein Programm ändern ?
Du schreibst von 2 Prozessen auf das gleiche Signal LED<=LED_in; --hier wird geschrieben und counter:process(ClkLeft,DIR) begin if rising_edge(ClkLeft) then if DIR = '1' then case LED is when"0000"=>LED<="0001"; --hier wird geschrieben
Mo schrieb: > Wie kann Ich mein Programm ändern ? Vorneweg: die Sensitivliste deiner Beschreibung muss hier eigentlich nur den Takt enthalten. DIR ist unnötig, denn der Prozess mus bei einer Änderung von DIR nicht neu berechnet werden:
1 | counter:process(ClkLeft,DIR) |
Als Tipp: die Sensitivliste ist ausschließlich für den Simulator relevant. Der Synthesizer nimmt "automatisch" fehlende signale dazu oder lässt überflüssige weg. Allerdings passt bei einer falschen Sensitivliste das Simulationsergebnis nicht mehr unbedingt zum Syntheseergebnis und damit zum Verhalten der Hardware. > Wie kann Ich mein Programm ändern ? Sieh dir an, wie ein asynchroner Reset üblicherweise beschrieben wird. Du findest das in jedem beliebigen VHDL-Buch:
1 | counter:process(ClkLeft,RES) |
2 | |
3 | begin
|
4 | if RES = '1' then |
5 | LED<="0000"; |
6 | elsif rising_edge(ClkLeft) then |
7 | |
8 | if DIR = '1' then |
9 | :
|
10 | :
|
Damit ist dann auch der "Reset-Prozess" unnötig. Deinen 4-Bit-Zähler würde ich übrigens so schreiben:
1 | library ieee; |
2 | use ieee.std_logic_1164.all; |
3 | use ieee.numeric_std.all; |
4 | |
5 | -- use work.all; -- unnötig, weil soweiso im Projekt
|
6 | -- library machxo2; -- unnötig, weil hier nicht verwendet
|
7 | -- use machxo2.components.all;
|
8 | |
9 | entity bit is |
10 | port( |
11 | ClkLeft: in std_logic; |
12 | LED_in: in std_logic_vector(3 downto 0); |
13 | DIR: in std_logic; |
14 | LED_out: out std_logic_vector(3 downto 0) |
15 | );
|
16 | end entity bit; |
17 | |
18 | architecture behaviour of bit is |
19 | signal counter: unsigned(3 downto 0):="0000"; |
20 | begin
|
21 | |
22 | counter:process(ClkLeft,RES) |
23 | begin
|
24 | if RES = '1' then |
25 | counter <= "0000"; |
26 | elsif rising_edge(ClkLeft) then |
27 | |
28 | if DIR = '1' then |
29 | counter <= counter + '1'; |
30 | else
|
31 | counter <= counter - '1'; |
32 | end if; |
33 | end if; |
34 | end process counter; |
35 | |
36 | LED_out <= std_logic_vector(counter); |
37 | end architecture behaviour; |
Mo schrieb: > tic<= tic + 1; > tic zählt ja die positiven Signale der Clk Dieser tic "zählt" die steigenden Flanken vom Takt. Ein Tipp: du musst an deiner Wortwahl arbeiten. Mit deiner derzeitigen Semantik verwirrst du Gesprächspartner. Dass die Signale zudem beliebige Namen haben, die nichts über ihre Funktion aussagen, verwirrt zudem. Und wenn sie an jeder Schnittstelle ihren Namen wechseln, macht das die Sache nicht besser... Mo schrieb: > plan.JPG Screenshots besser als (nicht verlustbehaftete) PNG-Datei anhängen. Bei JPEGs werden Screenshots dank der Komprimierung automatisch "unscharf" mit verwaschenen Linien und Kanten.
:
Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.