verbesserungsvorschlag?

OP #1567540
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.
Angehängte Dateien:
#1568020
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.
OP #1568169
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.
Moderator (Firma: Titel) Persönliche Seite #1568479
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren