www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Bit stuffing / Bit einfügen


Autor: sandero (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich soll fürs Studium ein Programmstück schreiben, das Bit stuffing 
erfüllt. Also ich erhalte eine Datenmenge von Nullen und Einsen,
und das Programm soll nach jeweils 5 gleichen Bits jeweils das negierte 
Bit einfügen.
Beispiel: nach fünf Nullen soll eine Eins eingefügt werden.
Schreibe das Programm in Xilinx9. Ich habe nur leichte VHDL Kenntnisse.

Weiß jemand wie man so etwas schreiben könnte, bzw. wo man nachschlagen 
kann?

MfG

sandero

Autor: Delete Me (skywalker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am Anfang solltest du dich zunächst erstmal hinsetzen und dir ein 
Grundlagenbuch zu VHDL besorgen. Grundlagenkenntnisse dazu hast du ja 
schon, aber als Nachschlagewerk ist das empfehlenswert.
Dann solltest du versuchen das Programm auf dem Papier zu formulieren.

Ich kann mir mehrere Möglichkeiten vorstellen, wie man sowas umsetzen 
könnte. Am einfachsten (oder, aus meiner Sicht, überschaubarsten) dürfte 
das wohl mit einer Finite State Machine (FSM) gehen 
(http://de.wikipedia.org/wiki/Endlicher_Automat).
Dabei erstellt man zuerst den Zustandsgraphen (dafür gibt es auch 
diverse Softwareprogramme) und setzt diesen dann (ggf. über die 
Generierung einer Zustandstabelle) in Code um.

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

Bewertung
0 lesenswert
nicht lesenswert
> Also ich erhalte eine Datenmenge von Nullen und Einsen,
Woher kommen diese Daten?
Ist das ein serieller Bitstrom?
Wieviele Bits hat ein Paket?
Darfst du die Daten zwischenspeichern?

Autor: sandero (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also die Daten erhalte ich als Bit_vector (81 downto 0), das ganze soll 
nur ein Programmstück werden, also ohne Hardware, wird nur simuliert. 
Ich darf alles machen, also auch zwischenspeichern.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  sandero (Gast)

>Also die Daten erhalte ich als Bit_vector (81 downto 0), das ganze soll
>nur ein Programmstück werden, also ohne Hardware, wird nur simuliert.
>Ich darf alles machen, also auch zwischenspeichern.

Und wo ist dann das Problem? ;-)
State Machine mit Zähler für Eingangsbits und Anzahl gleicher, 
aufeinanderfolgender Bits. Fertig. Kann man ggf. sogar diskret in States 
reinpressen, ist dann etwas übersichtlicher.

MFG
Falk

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

Bewertung
0 lesenswert
nicht lesenswert
> wird nur simuliert.
Gib ganz einfach einen noch breiteren Vektor zurück.
Überleg dir, wie lang der Ausgangsvektor werden könnte, wenn z.B. alle 
Bits auf '0' oder '1' wären. Es werden maximal 82/5= 16 Stuff-Bits 
benötigt, der Ausgangsvektor wäre dann also 98 Bits lang. Dazu käme ein 
zweiter Ausgangswert, der angibt, wieviele Stuff-Bits eingefügt wurden.
Dann reicht eine for-Schleife und eine Zählvariable aus. Daraus wird 
dann eine hübsch große Kombinatorik gebaut.

Wenn du allerdings noch andere Signale (wie z.B. einen Takt und ein 
Übergabe/Valid-Signal) erhältst, dann kannst du den Vektor seriell 
ausgeben und dazu ein Frame-Signal generieren.

Also gilt es erst mal die Frage zu beantworten, in welchem Format du die 
bearbeiteten Daten weitergeben sollst. Erst mal sollte die Schnittstelle 
sauber definiert werden.

Autor: sandero (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, unser professor möchte dass wir es mit schieberegistern machen.
Hab mir auch schon einen entwurf gezeichnet, nun muss ichs nur noch so 
programmieren, wie es aufn Blatt ist :-)

Dennoch eine Frage habe ich noch, wie mache ich aus einem Vector, dass 
alle Bits taktweise weitergeschoben werden, bzw. dann die seriellen Bits 
wieder zu einem Vector zusammengefügen werden?

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
architecture blar of foo is
  signal schieberegister : std_logic_vector (7 downto 0);
begin
  process(clk)
  begin
    if (clk'event and clk='1') then
      -- Rechts schieben
      schieberegister <= '0' & schieberegister (7 downto 1);
      -- Links schieben
--      schieberegister <= schieberegister (6 downto 0) & '0';
      -- Aber bitte nicht beides gleichzeitig ;)
    end if;
  end process;
end blar;

Autor: sandero (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, hab mein Programm soweit fertig, nun habe ich aber das Problem, dass 
mein eingefügtes Bit irgendwie verloren geht. Vielleicht sieht ein Profi 
den Fehler, ich kann ihn jedenfalls nicht finden. Denke dass meine 
If-Bedingung (Temp=00,11,01) irgendwie fehlerhaft ist. sonst 
funktioniert es aber schon ganz gut.

hier mein Programm:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity bitstuffing is
    Port ( clk : in  bit;
           res : in  bit;
           datenin : in  bit_vector (98 downto 0); --Daten die ankommen
           enable : in  bit;              --wenn 1 dann beginnen, senden
           datenout : out  bit_vector (118 downto 0));
end bitstuffing;

architecture Behavioral of bitstuffing is


signal   regpar : bit_vector (98  downto 0); --Datenin werden übernommen
signal  regser : bit_vector (5   downto 0);  -- 5 Bits werden geschoben
signal  regout : bit_vector (118 downto 0);  --Datenausgang
signal   temp   :  bit_vector (1 downto 0);
begin  --temp zum festellen ob 5 gleiche bits



einlesen_senden : process(clk, res, enable)
begin
if (res = '1') then
regpar <= ('0',others => '0');

elsif (clk'event and clk = '1')Then

regser (5 downto 1) <= regser (4 downto 0);
regpar (98 downto 1) <= regpar(97 downto 0);
regout (118 downto 1) <= regout(117 downto 0);
if temp = "00" then             --hier evtl. ein Fehler
regser(0)<='1';
regser (5 downto 0) <= regpar(98 downto 93);
regout (5 downto 0) <= regser (5 downto 0);
elsif temp = "11" then
regser(0)<='0';
regser (5 downto 0) <= regpar(98 downto 93);
regout (5 downto 0) <= regser (5 downto 0);
elsif temp ="01" then
regser (5 downto 1) <= regpar(98 downto 94);
regout (5 downto 1) <= regser (5 downto 1);
end if;

if (enable ='1') then

regpar (98 downto 0) <= datenin (98 downto 0);
datenout (118 downto 0) <= regout (118 downto 0);

end if;
end if;


end process einlesen_senden;


abfrage_stuffing: process(regser)
begin

if (regser(5 downto 1) = "00000") then
temp <= "00";
elsif (regser(5 downto 1) = "11111") then
temp <= "11";
else
temp <= "01";
end if;
end process abfrage_stuffing;

end Behavioral;

Hier meine Testbench:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;

ENTITY test_vhd IS
END test_vhd;

ARCHITECTURE behavior OF test_vhd IS

  -- Component Declaration for the Unit Under Test (UUT)
  COMPONENT bitstuffing
  PORT(
    clk : IN bit;
    res : IN bit;
    datenin : IN bit_vector (98 downto 0);
    enable : IN bit;
    datenout : OUT bit_vector (118 downto 0)
    );
  END COMPONENT;

  --Inputs
  SIGNAL clk :  bit := '0';
  SIGNAL res :  bit := '0';
  SIGNAL enable :  bit := '0';
  SIGNAL datenin :  bit_vector (98 downto 0) := 
("1111111111111000001010101010101010101010101010101010101011111111111100 
00000000000000000011111111111");
  --Outputs
  SIGNAL datenout :  bit_vector (118 downto 0);

BEGIN

  -- Instantiate the Unit Under Test (UUT)
  uut: bitstuffing PORT MAP(
    clk => clk,
    res => res,
    datenin => datenin,
    enable => enable,
    datenout => datenout
  );
process
  begin
  for i in 99 downto 0 loop
  wait for 5 ns; clk <= not clk;
  end loop;
  end process;
  tb : PROCESS
  BEGIN

    -- Wait 100 ns for global reset to finish

    wait for 5 ns;
    enable <='1'; wait for 15 ns; enable <='0';
    wait for 450 ns;
    enable <='1'; wait for 15 ns; enable <='0';



    wait; -- will wait forever
  END PROCESS;

END;

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.