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


von sandero (Gast)


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

von Delete M. (skywalker)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?

von sandero (Gast)


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.

von Falk B. (falk)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von sandero (Gast)


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?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

1
architecture blar of foo is
2
  signal schieberegister : std_logic_vector (7 downto 0);
3
begin
4
  process(clk)
5
  begin
6
    if (clk'event and clk='1') then
7
      -- Rechts schieben
8
      schieberegister <= '0' & schieberegister (7 downto 1);
9
      -- Links schieben
10
--      schieberegister <= schieberegister (6 downto 0) & '0';
11
      -- Aber bitte nicht beides gleichzeitig ;)
12
    end if;
13
  end process;
14
end blar;

von sandero (Gast)


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;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.