Forum: FPGA, VHDL & Co. 4 Bit Zähler


von Mo (Gast)


Angehängte Dateien:

Lesenswert?

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 ?

von user (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.