Forum: FPGA, VHDL & Co. Links schieben geht nicht, warum?


von peter (Gast)


Lesenswert?

Links schieben geht nicht.

Dieses links schieben geht nicht! LED leuchten noch nicht mal beim 
loslaufen :
1
signal shift_l : std_logic_vector(7 downto 0) :="00001111" ;
2
signal c : integer range 0 to 50000000 := 0; 
3
4
begin 
5
   process(clk)    
6
   begin  
7
     if rising_edge(clk) then
8
       if (c<25000000 ) then        
9
         c <= c+1; 
10
       else                         
11
        c <= 0;                                       
12
        shift_l <= shift_l(6 downto 0) & '0';
13
       end if; 
14
     end if;  
15
    
16
     led <= shift_l;   
17
   end process;

Dieses rechts schieben geht! :
1
signal shift_r : std_logic_vector(7 downto 0) :="11110000" ;
2
signal c : integer range 0 to 50000000 := 0; 
3
4
begin 
5
   process(clk)    
6
   begin  
7
     if rising_edge(clk) then
8
       if (c<25000000 ) then        
9
         c <= c+1; 
10
       else                         
11
        c <= 0;                                       
12
        shift_r <= '0' & shift_r(7 downto 1);    
13
       end if; 
14
     end if;  
15
    
16
     led <= shift_r;   
17
   end process;

Danke.
Gruss

von Dennis G. (dennisgann)


Lesenswert?

shift_l <= shift_l(6 downto 0) & '0';

fällt mir spontan ins auge.
sollte denke ich auch so lauten:

 shift_l <= shift_l(7 downto 0) & '0';


Gruß

von berndl (Gast)


Lesenswert?

an den Codeausschnitten sehe ich jetzt erstmal (beim fluechtig drueber 
gucken) keinen Fehler. Was sagt denn die Simulation?

Vlt. nen Tipp fuer die Simulation: Du koenntest einen GENERIC in deine 
Entity uebergeben, der fuer HW halt auf 50.000.000 steht, in der 
Testbench (die deinen Design sozusagen instanziert) aber mit z.B. 50 
ueberschrieben wird. Dann deine 'c' halt mit dem GENERIC vergleichen. So 
geht die Simulation super fix. Du solltest dir wirklich mal mit der ISE 
eine TB generieren lassen und dann den ISIM bemuehen

von berndl (Gast)


Lesenswert?

Dennis Gann schrieb:
> shift_l <= shift_l(6 downto 0) & '0';
>
> fällt mir spontan ins auge.
> sollte denke ich auch so lauten:
>
>  shift_l <= shift_l(7 downto 0) & '0';

noe, die shifts sehen (fuer einmaliges shiften der 8 LEDs) erstmal 
richtig aus. Deine Loesung wuerde aus einem 9-bit Vektor einen 8-bit 
Vektor erzeugen wollen...

von blu (Gast)


Lesenswert?

led ist 8 bit?

von peter (Gast)


Lesenswert?

Der ganze Code.
1
library IEEE; 
2
use IEEE.STD_LOGIC_1164.ALL; 
3
use IEEE.NUMERIC_STD.ALL; 
4
 
5
entity shift is 
6
    Port ( clk  : in  STD_LOGIC; 
7
           led  : out STD_LOGIC_VECTOR(7 downto 0);
8
           key  : in STD_LOGIC_VECTOR(3 downto 0)
9
           ); 
10
end shift; 
11
 
12
architecture Behavioral of shift is 
13
14
signal shift_l : std_logic_vector(7 downto 0) :="00001111" ;
15
signal c : integer range 0 to 50000000 := 0; 
16
17
begin 
18
   process(clk)    
19
   begin  
20
     if rising_edge(clk) then
21
       if (c<25000000 ) then        
22
         c <= c+1; 
23
       else                         
24
        c <= 0;                                       
25
        shift_l <= shift_l(6 downto 0) & '0';
26
       end if; 
27
     end if;  
28
    
29
     led <= shift_l;   
30
   end process; 
31
end Behavioral;

von peter (Gast)


Lesenswert?

shift_l <= shift_l(7 downto 0) & '0';

Die haben alle  nur 8 Elemente. Das oben ist 9.

GRuss

von peter (Gast)


Lesenswert?

Jup die clk war nicht verkabelt beim linksschieben.vhdl

Habe mal beide Pinbelegungsdateien verglichen 
linkschieben/rechtsschieben

Danke.
Gruss

von peter (Gast)


Lesenswert?

Wie kann man jetzt bitte ein "Carry" einrichten welches das 
herausfallende höchste Bit auffängt und dann auf eine 9. LED geht?

Danke.
GRuss

von berndl (Gast)


Lesenswert?

peter schrieb:
> Jup die clk war nicht verkabelt beim linksschieben.vhdl
>
> Habe mal beide Pinbelegungsdateien verglichen
> linkschieben/rechtsschieben
>
> Danke.
> Gruss

Aber jetzt mal bitte, bitte, bitte! Lass dir doch mal von der ISE eine 
Testbench bauen. Und dann aendere auch bitte mal deine Signaldeklaration 
des Integers von 50.000.000 und deine if-Abfrage mit 25.000.000 
dahingehend, dass ein GENERIC in die entity uebergeben wird. (Wahlweise 
ums fuer den Anfang einfacher zu machen, definiere da oben bei den 
Signalen eine 'constant hugo : positive := 25.000.000'. Dann die 
integer-signal-deklaration mit 'range 0 to $GENERIC-1' und die 
if-Abfrage mit z.B. '<$GENERIC'. Und dann simuliere es mal!)

von berndl (Gast)


Lesenswert?

peter schrieb:
> Wie kann man jetzt bitte ein "Carry" einrichten welches das
> herausfallende höchste Bit auffängt und dann auf eine 9. LED geht?

da wo du dein shift_l/r setzt, da kannst du ja das rausfallende Bit auch 
in einem 'signal' carry <= ... festhalten. Wobei Carry hier ja nicht 
richtig ist, ein Carry ist der Ueberlauf einer arithmetischen Funktion. 
Du koenntest das Signal also auch einfach 'muelleimer' nennen...

von peter (Gast)


Lesenswert?

Hmm.. danke.

Ich brauche aber auch dieses shift_l zur Anzeige.

GRuss

von peter (Gast)


Lesenswert?

Hmm..
Ich benutze jetzt dieses hier:
signal ct : integer range 0 to 4 := 1;  mit:
shift_r <= std_logic_vector(unsigned(shift_r) srl ct);

Nur mit SRA SLA funktioniert es nicht so , wenn ich es dort oben
reinsetze.

Wozu braucht man SRA und SLA?

GRuss

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


Lesenswert?

peter schrieb:
> signal ct : integer range 0 to 4 := 1;  mit:
> shift_r <= std_logic_vector(unsigned(shift_r) srl ct);
> Nur mit SRA SLA funktioniert es nicht so , wenn ich es dort oben
> reinsetze.
Wenn du was wie wo reinsetzt?

> Nur mit SRA SLA funktioniert es nicht so , wenn ich es dort oben
> reinsetze.
Diese Aussgae ist, wie wenn du dein Auto in die Werkstatt fährst und 
sagst: Kaputt! Machen!

Zu Recht wird dich irgendwer fragen:
Was geht nicht?
Wie merkst du das?
Was würdest du erwarten?
Was passiert sonst?


Ok, zur Sache. Die Suche nach "VHDL SRA SLA" findet ganz schnell das 
hier:
1
shift_operator ::= sll | srl | sla | sra | rol | ror
2
3
The shift operators are defined for the one-dimensional array with 
4
the elements of the type BIT or BOOLEAN.
Deine verwendeten Datentypen sind aber std_logic und unsigned. Kann also 
ohne Typumwandlung nicht gehen...

Für unsigned gibt es aber in der numeric_std was:
http://www.eda.org/rassp/vhdl/models/standards/numeric_std.vhd
Es gibt darin zum Schieben der Datentypen signed und unsigned die 
Funktionen
function "sll" (ARG: UNSIGNED; COUNT: INTEGER) return UNSIGNED;
function "sll" (ARG: SIGNED; COUNT: INTEGER) return SIGNED;
function "srl" (ARG: UNSIGNED; COUNT: INTEGER) return UNSIGNED;
function "srl" (ARG: SIGNED; COUNT: INTEGER) return SIGNED;
Eine davon wird dann schon passen...

von peter (Gast)


Lesenswert?

> signal ct : integer range 0 to 2 := 1;  mit:
> shift_r <= std_logic_vector(unsigned(shift_r) srl ct);
> Nur mit SRA SLA funktioniert es nicht so , wenn ich es dort oben
> reinsetze.
Wenn du was wie wo reinsetzt?

Hier: sla
 shift_r <= std_logic_vector(unsigned(shift_r) sla ct);

Gruss

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.