Forum: FPGA, VHDL & Co. wieder mal das bad description ding -.-


von Hannes (Gast)


Lesenswert?

hey ihrs,
bin neu in sachen vhdl und bin wie viele auf das bad descritpion ding 
gestoßen, habe mir auhc einige per suchfunktion gezeigte threads 
durchgelesen, die aber nicht ganz mein problem lösen:
1
process( oe,sw) begin
2
  
3
  if rising_edge(oe) then
4
    if sw='1' then
5
      OUT_RST <= OUTPUT_ARRAY;
6
      OUT_CUP <= (others => '0');
7
    else 
8
      OUT_RST <= (others => '0');
9
      OUT_CUP <= OUTPUT_ARRAY;
10
    end if;
11
  end if;
12
end process;
mag funktionieren, aber mein ziel ist es, wenn days signal oe wieder 
fällt (falling edge) bzw low ist, dass dann sowohl OUT_RST als auch 
OUT_CUP dann beide den zustand (others => '0') einnehmen also 
vollständig gecleared werden:
1
process( oe,sw) begin
2
  
3
  if oe = '1' and oe'event then
4
    if sw='1' then
5
      OUT_RST <= OUTPUT_ARRAY;
6
      OUT_CUP <= (others => '0');
7
    else 
8
      OUT_RST <= (others => '0');
9
      OUT_CUP <= OUTPUT_ARRAY;
10
    end if;
11
  else  
12
    OUT_RST <= (others => '0');
13
    OUT_CUP <= (others => '0');
14
  end if;
15
  
16
end process;
und da kommt dann der fehler.
ich scheine vhdl noch nciht ganz begriffen zu haben (wohl nicht mal im 
ansatz) deswegen bitte ich euch mir zu helfen!!
danke!
gruß Hannes

von Mathi (Gast)


Lesenswert?

Ich vermute das OE soll ein Output enable sein. So wie Du es jetzt 
beschrieben hast, ist es ein Takt.
Wenn ich Dich richtig verstanden habe, willst Du wenn OE = '1' ist die 
Ausgänge schalten, ansonsten sollen die 0 sein.
Das machst Du kombinatorisch:
1
process( oe,sw) begin
2
  
3
  if oe = '1' then
4
    if sw='1' then
5
       OUT_RST <= OUTPUT_ARRAY;
6
       OUT_CUP <= (others => '0');
7
    else 
8
       OUT_RST <= (others => '0');
9
       OUT_CUP <= OUTPUT_ARRAY;
10
    end if;
11
  else  
12
    OUT_RST <= (others => '0');
13
    OUT_CUP <= (others => '0');
14
  end if;
15
  
16
end process;

von Hannes (Gast)


Lesenswert?

hey super, es funktioniert!
also er gibt noch ne warnung aus dass er ein signal in der sensivity 
list vermisst, obwohl beide signale aufgelistet sind, don't care.

aber nochm,al zur der clock sache:
wenn ich also clock'event bzw rising edge mache, dann kann ich 
synchronisieren, aber warum kann ich das nicht mit logik verknüpfen?
welcher unterschied bestünde, wenn ich beim synchronisieren anstatt 
foo'event einfach foo= '1' mache?
THX 4 HELP!

von Mathi (Gast)


Lesenswert?

Der Unterschied besteht im Zeitpunkt.
Wenn Du rising_edge/event machst, dann wird genau der Zeitpunkt der 
Flanke etwas gemacht.
1
  ___
2
__| |__
3
  ^
4
 hier

Wenn Du = '1' sagst, dann wird etwas gemacht wenn das Signal den Wert 
'1'.
1
  ___
2
__| |__
3
   ^
4
  hier

(vereinfacht)

Du siehst es handelt sich um zwei ganz verschiedene Dinge. Beim ersten 
die steigende Flanke und beim Zweiten ein konkreter Wert. Der konkrete 
Wert liegt länger an.
In einem FPGA kann man die Flipflops entweder mit Flankenerkennung 
(steigend ODER fallend) oder Levelerkennung konfigurieren. Es sind keine 
Kombinationen bei einem FF möglich.

> wenn ich also clock'event bzw rising edge mache, dann kann ich
> synchronisieren, aber warum kann ich das nicht mit logik verknüpfen?

Du kannst das verknüpfen. Immer in dieser Form:
1
process(foo)
2
begin
3
 if(rising_edge(foo))then
4
   if(bar = '1')then
5
     mach was...
6
   else
7
     mach was anderes... 
8
   end if;
9
end process;

von Mathi (Gast)


Lesenswert?

Ach ja, das Signal das fehlt ist das OUTPUT_ARRAY. In einen 
kombinatorischen Prozess müssen alle abgefragten Signale in die 
sensitivity-list. In einem getakteten Prozess nur Clk (und Reset).

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.