Forum: FPGA, VHDL & Co. verbesserungsvorschlag?


von Jens B. (sio2)


Angehängte Dateien:

Lesenswert?

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.

von SeriousSam (Gast)


Lesenswert?

Generics werden analog zu Ports mit "generic map" zugewiesen.

von Jan M. (mueschel)


Lesenswert?

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.

von Jens B. (sio2)


Lesenswert?

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.

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


Lesenswert?

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