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
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.
> 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?
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.
@ 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
> 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.
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?
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; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.