mikrocontroller.net

Forum: FPGA, VHDL & Co. Wortaufteilung in 2 Wörtern


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte ein Modul schreiben, an dem man ein ein Bit Signal und ein 
16-bit Wort anlegen kann.

Bei einer positiven Flanke des 1 Bit Signals soll das 16 Bit Wort in 
eine reg geladen werden und die erste Hälfte des Wortes in einem 8 Bit 
Wort ausgegeben werden.
Bei einer 2. positiven Flanke des 1 Bit Signals, soll die zweite Hälfte 
des 8 Bit  Wortes ausgegeben werden.

Bei der dritten positiven Flanke, soll das aktuelle 16 Bit Wort wieder 
in die reg geladen, die erste Hälfte ausgegeben werden, usw.


Leider habe ich damit große Probleme, die Simulation hat am Anfang 
jeweils zwei undefinierte Signale, danach läuft es fast fehlerfrei 
weiter.

Könntet Ihr mir dabei helfen und ein Grundgerüst für solch ein Modul 
posten?


Vielen, vielen Dank,
Frank

Autor: Eman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste du deins, dann finden wir den Fehler schnell. Die Arbeit anderer 
zu machen wird den wenigsten hier Vergnügen bereiten :)

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

Bewertung
0 lesenswert
nicht lesenswert
>die Simulation hat am Anfang jeweils zwei undefinierte Signale
Das ist an sich nicht schlimm und kann mit einer Defaultzuweisung 
problemlos umgangen werden.
Z.B. so:
signal ausgang : std_logic_vector(7 downto 0) := (others=>'0');

>danach läuft es fast fehlerfrei weiter
Das Ganze passt mit viel Luft in einen getakteten Prozess,
da kann es eigentlich gar keinen Platz für Fehler geben ;-)

Autor: Nephilim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klingt für mich wie eine einfache FSM mit 3 zuständen in einem einfachen 
prozess.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>klingt für mich wie eine einfache FSM mit 3 zuständen
>in einem einfachen prozess.

Nein, das geht noch einfacher: eine SM mit 2 Zuständen.
So etwa:
entity Mux is
    Port ( clk  : in   STD_LOGIC;
           din  : in   STD_LOGIC_VECTOR (15 downto 0);
           dout : out  STD_LOGIC_VECTOR (7 downto 0));
end Mux;

architecture Behavioral of Mux is
signal hilo   : std_logic := '0';
signal lobyte : std_logic_vector(7 downto 0) := (others=>'0');
begin
   process(clk)
   begin
      if rising_edge(clk) then
         hilo <= not hilo;              -- SM Zustand weiterschalten
         if (hilo='0') then
            dout   <= din(15 downto 8); -- High-Byte ausgeben
            lobyte <= din( 7 downto 0); -- Low-Byte merken
         else 
            dout   <= lobyte;           -- Low-Byte ausgeben
         end if;
      end if;
   end process;
end Behavioral;

Alles hübsch registriert und ohne Glitches...
Simulation siehe Anhang ;-)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich musste mal kurz weg, deshalb jetz erst die Variante mit einem 
globalen (schnellen) FPGA-Takt und einem "langsamen" Mux-Takt:
architecture Behavioral of Mux is
signal hilo:      std_logic := '0';
signal muxclksr:  std_logic_vector(1 downto 0) := (others=>'0');
signal lobyte:    std_logic_vector(7 downto 0) := (others=>'0');
begin
   process(clk)
   begin
      if rising_edge(clk) then             -- DER globale FPGA-Takt
         muxclksr <= muxclksr(0) & muxclk; -- Schiebereg. für Flankenerkennung
         if (muxclksr="01") then           -- steigende Flanke des Mux-Taktes
           hilo <= not hilo;               -- SM Zustand weiterschalten
           if (hilo='0') then
              dout   <= din(15 downto 8);  -- High-Byte ausgeben
              lobyte <= din( 7 downto 0);  -- Low-Byte merken
           else 
              dout   <= lobyte;            -- Low-Byte ausgeben
           end if;
         end if;
      end if;
   end process;
end Behavioral;

Waveform wie vorhin im Anhang.
Viel Spass damit ;-)

Autor: Eman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schön, dann ist Frank ja schon fertig mit seinen Hausaufgaben.

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

Bewertung
0 lesenswert
nicht lesenswert
@ Eman
> Schön, dann ist Frank ja schon fertig mit seinen Hausaufgaben.
Ja, aber das hilft ihm nicht wirklich. Jetzt muss er nämlich meinen Code 
erst mal kapieren, und hat dann trotzdem noch ein Problem. Aber das muss 
er selber erkennen... ;-)

@ Frank
Nein, mein Code ist ok. Dein Problem liegt woanders...

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die vielen Antworten.
Es stimmt, es wäre klüger gewesen, den Code zu posten.

Ich habe den Code veressert.
Es funktioniert so ähnlich, wie das bisher gepostete.
module xyz (clock, reset, Ready_for_Data_in, in, out);

//Input
input clock, reset;                       
input Ready_for_Data_in;
input [13:0] in;

//Output  
output [7:0] out;

reg [7:0] highbits;     

reg [7:0] out;

reg state;      



//sequenzieller Block
always @(posedge clock)
 begin
      if(reset==1)
        begin
           Data_to_RS232<=8'b0;
           state<=1'b0;
           highbits[0] <= 1'b0;
           highbits[1] <= 1'b0;
           highbits[2] <= 1'b0;
           highbits[3] <= 1'b0;
           highbits[4] <= 1'b0;
           highbits[5] <= 1'b0;
           highbits[6] <= 1'b0;
           highbits[7] <= 1'b0;
        end 
      else
         begin  
          if (Ready_for_Data_in==1'b1);
          begin 
            if (state==1'b0)
            begin
          Data_to_RS232[0] <= Mikrofon_editing_input[0];
          Data_to_RS232[1] <= Mikrofon_editing_input[1];     
          Data_to_RS232[2] <= Mikrofon_editing_input[2];  
          Data_to_RS232[3] <= Mikrofon_editing_input[3];  
          Data_to_RS232[4] <= Mikrofon_editing_input[4];  
          Data_to_RS232[5] <= Mikrofon_editing_input[5];  
          Data_to_RS232[6] <= Mikrofon_editing_input[6];  
          Data_to_RS232[7] <= 1'b0;
     
          highbits[0] <= Mikrofon_editing_input[7];
          highbits[1] <= Mikrofon_editing_input[8];     
          highbits[2] <= Mikrofon_editing_input[9];  
          highbits[3] <= Mikrofon_editing_input[10];  
          highbits[4] <= Mikrofon_editing_input[11];  
          highbits[5] <= Mikrofon_editing_input[12];  
          highbits[6] <= Mikrofon_editing_input[13];  
          highbits[7] <= 1'b0;  
           
          state<=1'b1;
          end
          else
          begin
          Data_to_RS232[8]  <= highbits[0];
          Data_to_RS232[9]  <= highbits[1];     
          Data_to_RS232[10] <= highbits[2];  
          Data_to_RS232[11] <= highbits[3];  
          Data_to_RS232[12] <= highbits[4];  
          Data_to_RS232[13] <= highbits[5];  
          Data_to_RS232[14] <= highbits[6];  
          Data_to_RS232[15] <= highbits[7];
          state<=1'b0;
          end
         end
 end
 end
endmodule 


Beim Compilieren kommt aber der Fehler
# ** Warning: C:/xxxx: [BSOB] - Bit-select into 'Data_to_RS232' is out 
of bounds.


Woran kann das liegen?


Frank

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

Bewertung
0 lesenswert
nicht lesenswert
@Frank
>Woran kann das liegen?
Das ist jetzt aber nicht ernst gemeint, oder?

>Bit-select into 'Data_to_RS232' is out of bounds.
Diese Meldung ist selbstbeschreibend.
Es werden Bits von 'Data_to_RS232' ausgewählt, die es gar nicht gibt.

>Data_to_RS232<=8'b0;
Offenbar ist das Register 'Data_to_RS232' nur 8 Bit breit.

Falls ja, wie geht das:
>Data_to_RS232[8]  <= highbits[0];
>Data_to_RS232[9]  <= highbits[1];
>Data_to_RS232[10] <= highbits[2];
>Data_to_RS232[11] <= highbits[3];
>Data_to_RS232[12] <= highbits[4];
>Data_to_RS232[13] <= highbits[5];
>Data_to_RS232[14] <= highbits[6];
>Data_to_RS232[15] <= highbits[7];


BTW:
Ich kann zwar kein Verilog, aber das müsste doch als Vector kürzer zu 
schreiben sein?

So vielleicht (immer noch falsch):
   Data_to_RS232[15:8]  <= highbits[7:0];
oder richtig:
   Data_to_RS232[7:0]  <= highbits[7:0];
oder kürzer:
   Data_to_RS232  <= highbits;

(So könnte ich das zumindest in VHDL beschreiben)

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Data_to_RS232 ist soweit ich sehe nicht definiert, deshalb wird es 
implizit als 1-Bit breit angesehen. Schreib mal eine Definition mit 16 
Bit breite hin, dann sollte es gehen.

Nebenbei scheint mir, du hast beim Signal "in" aus Versehen 13:0 (14 
Bits) statt 15:0 (16 Bits) geschrieben.

@Lothar:
Nein, es ist ganz und gar nicht selbsterklärend. Im Gegenteil ist die 
Fehlermeldung höchst irreführend, denn sie meldet ein zu "schmales" 
Signal, obwohl das eigentliche Problem die fehlende Definition ist.

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

Bewertung
0 lesenswert
nicht lesenswert
@ Morin
Wie gesagt, ich kann kein Verilog. Daher erst mal eine Frage:
>Data_to_RS232 ist soweit ich sehe nicht definiert,
>deshalb wird es implizit als 1-Bit breit angesehen
Ist es bei Verilog also (wie früher zu Basic's-Zeiten) möglich, mitten 
im Fliesstext irgendwelche Signale zu instantiieren, ganz ohne 
Deklaration, einfach indem ein Name hingeschrieben wird?
Falls ja, dann bin ich echt froh, dass es Sprachen wie C und VHDL 
gibt...

>beim Signal "in" aus Versehen 13:0 statt 15:0 geschrieben ...
Damit meint Frank wohl den "Mikrofon_editing_input[13:0]".
Der wird btw. auch nirgends deklariert.

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie gesagt, ich kann kein Verilog.

Das ist selbstverständlich keine Schande.

> Das ist jetzt aber nicht ernst gemeint, oder?
> Diese Meldung ist selbstbeschreibend.
> Offenbar[...]

Das hier dagegen ist extrem peinlich, wenn man selbst keine Ahnung hat.

> Ist es bei Verilog also (wie früher zu Basic's-Zeiten) möglich, mitten
> im Fliesstext irgendwelche Signale zu instantiieren, ganz ohne
> Deklaration, einfach indem ein Name hingeschrieben wird?

Ja, und diese sind dann 1 Bit breit (Bit-Signale sind, soweit ich mich 
erinnere, in Verilog dasselbe wie 1-Bit breite Vektoren)

> Falls ja, dann bin ich echt froh, dass es Sprachen wie C und VHDL
> gibt...

Jo, das war einer der Gründe weshalb ich trotz der grausligen Syntax 
lieber VHDL benutze.

> Damit meint Frank wohl den "Mikrofon_editing_input[13:0]".
> Der wird btw. auch nirgends deklariert.

Da hast du vermutlich Recht, wobei ich mich eigentlich auf das Signal 
"in" aus der Portliste bezogen hatte, aber möglicherweise sollte das ein 
und dasselbe Signal sein. Könnte ein weiterer Fehler zu sein, der wegen 
der impliziten Deklarationen nicht erkannt wurde.

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.