mikrocontroller.net

Forum: FPGA, VHDL & Co. verbesserungsvorschlag?


Autor: Jens B. (sio2)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: SeriousSam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Generics werden analog zu Ports mit "generic map" zugewiesen.

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens B. (sio2)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
      width:  positive := 9*3
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:
signal data :  STD_LOGIC_VECTOR ((16*width)-1 downto 0):= (others => '0');
-- oder
signal data :  STD_LOGIC_VECTOR ((16*width)-1 downto 0):= (((16*width)-1 downto 0) => '0');

Und das hier:
      if rising_edge(en) then
        counter <= counter +1;
        if (counter = number_led-1) then
          data_out<= data;
          res := '1';
      end if;
      end if;
      if(reset='0') or (res='1')then
        counter <= 0;
        res :='0';
      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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.