mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL-links schieb Reg.


Autor: mazin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 .

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du willst, den Eingang um vier bits nach links verschoben wieder
ausgeben? Versehe ich das richtig?

ausgang(11 downto 4)<=eingang(7 downto 0);

Autor: OTobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;

Autor: mazin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;

Autor: OTobias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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;

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: mazin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke OTabias,
der Programm lauft ganz gut..

Autor: Volker Urban (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Volker Urban (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 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.