www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Verlust eines Bits während Optimierung


Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verstehe bei der unten angegebenen Beschreibung nicht, weshalb ISE 
der Meinung ist das LOKAL_SER_OUT_MSG<15> niemals genutzt wird und es 
deshalb weg optimiert wird? Bei den Anweisungen "LOKAL_SER_OUT_MSG := 
x"1234"; SERIAL_OUT <= LOKAL_SER_OUT_MSG(15);" im zweiten if-Zweig wird 
das 15. Bit doch benötigt?


entity S3P_TX is  
  port(  CLK_SYS        : in std_logic;
         RST          : in std_logic;
         CLK_TX        : out std_logic;
         SERIAL_OUT      : out std_logic);
end S3P_TX;

architecture BEHAVIORAL of S3P_TX is

  component DATA_CLK_GENERATOR
    port(  CLK_SYS : in  std_logic;
           RST : in  std_logic;
           DATA_CLK : out  std_logic;
           TX_CLK_EN : out  std_logic);
    end component;

  signal SHIFT_CNT : integer range 0 to 15;
  signal TX_CLK_EN_CON : std_logic;
    
begin
  
  CLK_GEN : DATA_CLK_GENERATOR port map(  CLK_SYS => CLK_SYS,
                      RST => RST,
                      DATA_CLK => CLK_TX,
                      TX_CLK_EN => TX_CLK_EN_CON
                    );
    
  TEST : process(CLK_SYS)
    variable LOKAL_SER_OUT_MSG : std_logic_vector(15 downto 0);
  begin
    if(CLK_SYS'event and CLK_SYS = '1')then
        if(RST = '1') then
          LOKAL_SER_OUT_MSG := x"FFFF";
          SHIFT_CNT <= 0;
          SERIAL_OUT <= '1';
        elsif(TX_CLK_EN_CON = '1') then
          if(SHIFT_CNT < 15) then
            LOKAL_SER_OUT_MSG := LOKAL_SER_OUT_MSG(14 downto 0) & '0';
            SERIAL_OUT <= LOKAL_SER_OUT_MSG(15);        
            SHIFT_CNT <= SHIFT_CNT + 1;
          elsif(SHIFT_CNT >= 15) then
            LOKAL_SER_OUT_MSG := x"0123";
            SERIAL_OUT <= LOKAL_SER_OUT_MSG(15);
            SHIFT_CNT <= 0;
          end if;
        end if;
    end if;  
  end process;
    
end BEHAVIORAL;


Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LOKAL_SER_OUT_MSG(15) steht schon zum Synthesezeitpunkt fest. Ist also 
eine Konstante und kann direkt eingesetzt werden.

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

Bewertung
0 lesenswert
nicht lesenswert
guest schrieb:
> SERIAL_OUT <= LOKAL_SER_OUT_MSG(15);
Mein Verdacht: LOKAL_SER_OUT_MSG(15) ist das selbe wie SERIAL_OUT und 
wird deshalb wegrationalisiert.
Trotz der der Optimierung und der unnötigen Verwendung einer Variablen 
sollte die Beschreibung aber das machen, was man von ihr verlangt...

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke soweit. Wäre nur der erste If-Zweig vorhanden könnt ich das weg 
optimieren nachvollziehen. Im "elsif(SHIFT_CNT >= 15) then" Zweig wird 
aber doch LOKAL_SER_OUT_MSG := x"0123"; ausgeführt, wodurch auch 
SERIAL_OUT auf 0 gesetzt wird?
Selbst wenn ich die Zuweisung von einem externen Signal abhängig mache, 
wobei der Wert von SERIAL_OUT nur von LOKAL_SER_OUT_MSG(15) abhängt, 
geht Bit 15 verloren.


TEST : process(CLK_SYS)
    variable LOKAL_SER_OUT_MSG : std_logic_vector(15 downto 0);
  begin
    if(CLK_SYS'event and CLK_SYS = '1')then
        if(RST = '1') then
          LOKAL_SER_OUT_MSG := x"FFFF";
          SHIFT_CNT <= 0;
          SERIAL_OUT <= '1';
        elsif(TX_CLK_EN_CON = '1') then
          if(SHIFT_CNT < 15) then
            LOKAL_SER_OUT_MSG := LOKAL_SER_OUT_MSG(14 downto 0) & '0';
            SERIAL_OUT <= LOKAL_SER_OUT_MSG(15);        
            SHIFT_CNT <= SHIFT_CNT + 1;
          elsif(SHIFT_CNT >= 15) then
            if(EXTERN = '1') then
               LOKAL_SER_OUT_MSG := b"0111_1111_1111_1111";
            else
               LOKAL_SER_OUT_MSG := b"1111_1111_1111_1111";
            end if;
            SERIAL_OUT <= LOKAL_SER_OUT_MSG(15);   
            SHIFT_CNT <= 0;
          end if;
        end if;
    end if;  
  end process;


Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

LOKAL_SER_OUT_MSG(15) wird wegoptimiert, da nie auf den gespeicherten 
Wert zugegriffen wird.

Im ersten if-Zweig wird auf das in LOKAL_SER_OUT_MSG(14) gespeicherte 
Element zugegriffen.
Im Zweiten If-Zweig wird LOKAL_SER_OUT_MSG(15) gar nicht benötigt, da es 
direkt von EXTERN abhängt (im 2. Codestück).

Deine Verwirrung stammt sicherlich aus der unterschiedlichen 
abarbeitungsweise von Signalen und Variablen. Wenn du LOKAL_SER_OUT_MSG 
als Signal definierst (was ich dringend empfehle!), sollte dir schnell 
klar werden, warum das Bit nicht benötigt wird. Denn da reicht ein 15 
Bit breiter Vektor zum Speichern des Wertes völlig aus.

Kleiner Tipp noch:  elsif(SHIFT_CNT >= 15) then
kann einfach mit einem "else" ersetz werden.

Der Besucher

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank nochmal. Erlich gesagt weiß ich auch nicht warum ich erst 
shiften wollte um diesen Wert in Bit 15 dann nochmals (SERIAL_OUT) zu 
speichern. Desshalb hatte ich auch zur Variable gegriffen..

Wesshalb wird hier oftmals von Variablen abgeraten? Nur weil die 
Abarbeitung anders ist und somit das Nachvollziehen des Codes 
unangenehmer wird, oder kann das auch zu Problemen führen an jeder Ecke 
Variablen zu nutzen?

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

Bewertung
0 lesenswert
nicht lesenswert
> Wesshalb wird hier oftmals von Variablen abgeraten?
Weil (insbesondere mit [implizit] speichernden) Variablen selbst Profis 
ins Schleudern kommen...
Siehe auch die Verweise auf die AppNotes im 
Beitrag "Variable vs Signal"

Variablen sind sehr gut geeignet, wenn ein Rechenschritt der Übersicht 
halber auf einzelne Berechnungen verteilt werden soll:
http://www.lothar-miller.de/s9y/archives/73-Wurzel...
Aber dann sollten die Dinger nicht speichernd sein.

Oder wenn in Testbenches mit Funktionen und Schleifen herumgemacht wird:
http://www.lothar-miller.de/s9y/archives/75-PS2-Ta...

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@guest: es ist schon möglich, an jeder Ecke Variablen zu nutzen. Man muß 
sich nur mit der Beschränkung auf den aktuellen Process anfreunden (von 
globalen Variablen spreche ich hier nicht, denn um die mache ich einen 
großen Bogen). Auch, dass sie anders gehandhabt werden als Signale. 
Falsch ist die Nutzung sicherlich nicht, solange das gewünschte Ergebnis 
erzielt wird.
Nur, dein Codebeispiel zeigt doch sehr eindringlich, dass selbst bei 
einfachster Logik die genauen Zusammenhänge schwerer zu durchschauen 
sind, wenn Signale und Variablen für Speicherelemente parallel verwendet 
werden.

Aber jeder muß seinen eigenen Codestil finden. Richtig und Falsch gibt 
es wohl nur im Type Boolean ;)

Der Besucher

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.