Hi, ich hab hier ein kleines "Programm" geschrieben, was auch laeuft, nur habe ich mal ein paar Fragen dazu. Wenn ich in 2 prozessen einene wert(Signal) schreiben will, geht das nicht, weil das Signal dann durch 2 Treiber getrieben wird (fehlermeldung :( ). Wie wird sowas am besten gelöst? Ich habe hierzu eine Variable genommen, weil mir nix bessres einfiel (Variable "res" Zeile 70 & 75). 2tens. Wie kann ich ein generic an Submodule weiterleiten? Auch via port map? 3tens. gibt es sowas wie "#define"? Generic ist ja schon sowas, aber wenn ich generic( number_led: positive := 9; width : positive :=number_led*3); eingebe, gibt es wiederum eine Fehlermeldung. Danke.
Jens B. schrieb: > Wenn ich in 2 prozessen einene wert(Signal) schreiben will, geht das > nicht, weil das Signal dann durch 2 Treiber getrieben wird > (fehlermeldung :( ). Wie wird sowas am besten gelöst? Ich habe hierzu > eine Variable genommen, weil mir nix bessres einfiel (Variable "res" > Zeile 70 & 75). In deinem Code sind nicht zwei Treiber das Problem, res wird doch nur in einem Prozess zugewiesen - welche Fehlermeldung bekommst du eigentlich? > 3tens. gibt es sowas wie "#define"? Generic ist ja schon sowas, aber > wenn ich > > generic( number_led: positive := 9; > width : positive :=number_led*3); > > eingebe, gibt es wiederum eine Fehlermeldung. Richtig, generics dürfen sich nicht auf andere generics der selben Entity beziehen. Du kannst entweder eine externe Library verwenden (hier eindeutig übertrieben), oder du definierst width einfach um zu channels_per_led := 3 oder etwas ähnlichem. Btw: Du solltest die Regel "Nur ein Takt pro Design" beherzigen. Wenn du sowohl EN als auch SCK als Takt benutzt handelst du dir Probleme ein wenn z.B. beide Signale sehr kurz nacheinander ihren Wert wechseln. EN ist schon dem Namen nach ein enable-Signal. Besser, du benutzt es auch wie ein clock enable.
Hi, > In deinem Code sind nicht zwei Treiber das Problem, res wird doch nur in > einem Prozess zugewiesen - welche Fehlermeldung bekommst du eigentlich? Habs grade nochmal versucht nachzuvollziehen, aber keine Fehlermeldung. Der obige Code ist schon korrigiert :( . > > Btw: Du solltest die Regel "Nur ein Takt pro Design" beherzigen. Wenn du > sowohl EN als auch SCK als Takt benutzt handelst du dir Probleme ein > wenn z.B. beide Signale sehr kurz nacheinander ihren Wert wechseln. > EN ist schon dem Namen nach ein enable-Signal. Besser, du benutzt es > auch wie ein clock enable. Ist mir eigentlich klar, aber ich brauchte die Flanke, mir ist nix bessres eingefallen :(. Aber danke für die Hinweise.
1 | width: positive := 9*3 |
2 | signal data : STD_LOGIC_VECTOR ((16*width)-1 downto 0):="0000000000000000000000000000000000000000000000000000000000000000"; |
Wenn du schon die Wortbreite generisch beschreibst, dann solltest du schon auch die Defaultzuweisung generisch beschreiben. 16*9*3-1 = 431 d.h. dein Defaultvektor ist garantiert zu kurz :-o Schreib das besser so:
1 | signal data : STD_LOGIC_VECTOR ((16*width)-1 downto 0):= (others => '0'); |
2 | -- oder
|
3 | signal data : STD_LOGIC_VECTOR ((16*width)-1 downto 0):= (((16*width)-1 downto 0) => '0'); |
Und das hier:
1 | if rising_edge(en) then |
2 | counter <= counter +1; |
3 | if (counter = number_led-1) then |
4 | data_out<= data; |
5 | res := '1'; |
6 | end if; |
7 | end if; |
8 | if(reset='0') or (res='1')then |
9 | counter <= 0; |
10 | res :='0'; |
11 | end if; |
ist ein synchroner Zähler mit asynchronem kombinatorischen Reset. Das ist schlechte Designpraxis. Sieh dir mal meinen SPI-SLave an: http://www.lothar-miller.de/s9y/categories/26-SPI-Slave
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.