Gast
#201885
hallo, kann jemand mir hilfen. wie kann man programmieren ein Schaltung,der eingan=12Bit Ausgang =12 Bit sit und soll es 4 Bit links geschoben werden .
|
Anzeige
|
VHDL-links schieb Reg.
Gast
#201885
hallo, kann jemand mir hilfen. wie kann man programmieren ein Schaltung,der eingan=12Bit Ausgang =12 Bit sit und soll es 4 Bit links geschoben werden .
Gast
#201886
Du willst, den Eingang um vier bits nach links verschoben wieder ausgeben? Versehe ich das richtig? ausgang(11 downto 4)<=eingang(7 downto 0);
Gast
#201887
U1: process (eingang,clk) begin if clk = '1' and clk'event then ausgang(11 downto 4)<=eingang(7 downto 0); -- Was willst du jetzt mit den unteren 4 Bits machen ? end if; end process U1;
Gast
#201888
hallo,
danke für Antwor ,ich zeige meine Programm aber das Problem ich
ich finde an Ausgang kein 4bit geschoben, ob kann jemand meine
Prog.korrigieren ,es soll 18 Bit eingang und 4Bitgeschoben werden :
---arametrisiertes 4-Bit links Schieberegister
entity Shift is
generic( WIDTH : natural := 18; -- Registerbreite
shw : natural := 4 ); -- Schiebeweite
port ( CLK :in bit;
Reset: in BIT;
DIN : in bit_vector(width-1 downto 0);
YOUT : out bit_vector(width-1 downto 0));
end shift ;
architecture SHIFT_L of shift is
signal TEMP : bit_vector(shw -1 downto 0);
signal yint : bit_vector (width -1 downto 0);
begin
SYN_SHIFT: process (CLK,Reset)
begin
if (Reset='0') then
Yint <=DIN ;
elsif ( CLK='1' and CLK'event) then
Yint <= Yint( width-1-shw downto 0 )& Temp ;---- links schieben
end if;
end process SYN_SHIFT;
YOUT <= Yint;
end SHIFT_L;
Gast
#201889
Fehler war in der Sensity liste des Prozesses, "DIN" fehlte.
Falls ein signal in der Sensity - Liste
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
---arametrisiertes 4-Bit links Schieberegister
entity Shift is
generic( WIDTH : natural := 18; -- Registerbreite
shw : natural := 4 ); -- Schiebeweite
port ( CLK :in bit;
Reset: in BIT;
DIN : in bit_vector(width-1 downto 0);
YOUT : out bit_vector(width-1 downto 0));
end shift ;
architecture SHIFT_L of shift is
begin
SYN_SHIFT: process (CLK,Reset,DIN)
variable Yint : bit_vector(YOUT'length-1 downto 0);
begin
if (Reset='0') then
Yint :=DIN ;
elsif ( CLK='1' and CLK'event) then
YOUT <= Yint( Yint'length - (1 + shw) downto 0 )& "0000" ;----
links schieben
end if;
end process SYN_SHIFT;
end SHIFT_L;
Gast
#201890
Ich dinde man kann es auch kompliziert machen In VHDL gibt es Befehle ("ROL") mit dem man nach links oder rechts schieben kann. Davor macht macht einen Zähler der hoch oder runterzählt. Dann ist das doch schon fertig. Wie der Befehl genau lautet weiß ich net mehr. Es gab einmal einen der ein Ringregister erzeugt und einmal einen der das ganze aus dem Register rausschiebt
Gast
#201891
Danke OTabias, der Programm lauft ganz gut..
Gast
#201892
besser: library std_arith; use std_arith.all; process(clk) begin if rising_edge(clk) then if reset_n = '0' then Dout <= Yin; elsif Dout <= Yin(Yin'high - shw) downto 0) & conv_std_logicvector(0,shw); end if; end if; -- Bibliothek und Konvertierungsfunktion sind sicher falsch getippert, -- muss ich bei gelegenheit mal ausprobieren. Deine Lösung funktioniert mit shw = 4, durch den asynchronenen reset wird das design grösser und DIN brauch NICHT in die sensitity list. Das problem in der ersten Variante ist das nichtinitialisierte Signal TEMP.
Gast
#201893
Hm, tippfehler drin :-( . Noch #ne variante:
Entity wie oben, dann
architecture behave
signal temp: std_logic_vector(WIDTH -1 downto 0);
begin
for i in Witdh-1 downto shw generate
temp(i) <= Yin(i-shw);
end generate;
for i in shw-1 downto 0 generate
temp(i) <= '0';
end generate;
--das wars mit shift, jetzt FF wenn nötig:
process(clk)
begin
if rising_edge(clk) then
if reset_n = '0' then
Dout <= Yin;
else
Dout <= temp;
end if;
end if;
end architecture behave
Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|