Forum: FPGA, VHDL & Co. Ladbares Schieberegister seriell auslesen


von Ralph H. (guru)


Lesenswert?

Irgendwie komm ich grad nicht weiter.. Hab wohl zuviel Stollen gegessen 
;)
Ich brauche ein 8bit Schieberegister welches mit einer L/H Flanke 
parallel geladen wird und mit CLK (40Mhz) permanent diese 8Bits an OUT 
rausschiebt.
Die Herausforderung ist nun, das Ganze mit den minimalsten Ressorcen zu 
machen, denn ich die sparen weil es langsam eng im CPLD wird.
Könnt Ihr mir nen Tipp geben, wie ich das anstelle ?

Frohe Weihnachten und Danke für Eure Hilfe !!

von Falk B. (falk)


Lesenswert?

@  Ralph H. (guru)

>Ich brauche ein 8bit Schieberegister welches mit einer L/H Flanke
>parallel geladen wird und mit CLK (40Mhz) permanent diese 8Bits an OUT
>rausschiebt.

74AC165.

>Die Herausforderung ist nun, das Ganze mit den minimalsten Ressorcen zu
>machen, denn ich die sparen weil es langsam eng im CPLD wird.

Aha, du willst das in einen CPLD pressen. Und warum sagst du das nicht 
direkt?

>Könnt Ihr mir nen Tipp geben, wie ich das anstelle ?

Einfach ein Schieberegister halt, braucht 8 Makrozellen.

1
process(clk)
2
begin
3
  if rising_edge(clk) then
4
    if load='1' then  -- parallel laden
5
      sr <= sr_in;  
6
    else
7
      sr <= sr(6 downto 0) & '0'; -- seriall schieben
8
    end if;
9
  end if;
10
end process;
11
12
ser_out <= sr(7);

MFG
Falk

von Ralph H. (guru)


Lesenswert?

Danke Falk !! aber darf ich mal dumm fragen, ob das so wirklich richtig 
ist ? Bei mir funktioniert das so nicht.. ich bekomm bei ser_out immer 
0.

von Anguel S. (anguel)


Lesenswert?

Ralph H. schrieb:
> Danke Falk !! aber darf ich mal dumm fragen, ob das so wirklich richtig
> ist ? Bei mir funktioniert das so nicht.. ich bekomm bei ser_out immer
> 0.

Hast Du ihn denn geladen? :) Zeig mal die Testbench.

von Ralph H. (guru)


Angehängte Dateien:

Lesenswert?

Hallo Anguel.. ja klar hab ich das SR geladen.. nur der Wert wird nicht 
übernommen.. Offensichtlich liegt es nur daran, denn das schieben 
funktioniert doch ! Nur am Anfang 1x bis alle Ausgänge vom SR=0..
Hier noch die Testbench.. Danke sagt Ralph

von Anguel S. (anguel)


Lesenswert?

Du lädst ihn irgendwie nur 1 einziges Mal am Anfang, und zwar mit 
Nullen. Bei den anderen Werten machst du load nicht mehr auf '1'...

von Ralph H. (guru)


Lesenswert?

Nein ich lade ihn am Anfang eben gar nicht !! Planmäßig ist der 
Dateneingang immer "00000000" und wird dann auf "10101011" gesetzt. 
Dieser Werte sollte ins SR übernommen werden (mit der 0-1 Flanke) von 
LoadSRZG
und der geladene Wert sollte rausgeschoben werden. Da aber das SR 
bereits komplett mit 0 ist und das Laden nicht geht, wird auch nichts 
mehr geschoeb :-(.. Ich denke das Laden ist das Problem.

von Anguel S. (anguel)


Lesenswert?

Ralph H. schrieb:
> Nein ich lade ihn am Anfang eben gar nicht !! Planmäßig ist der
> Dateneingang immer "00000000" und wird dann auf "10101011" gesetzt.
> Dieser Werte sollte ins SR übernommen werden (mit der 0-1 Flanke) von
> LoadSRZG
> und der geladene Wert sollte rausgeschoben werden. Da aber das SR
> bereits komplett mit 0 ist und das Laden nicht geht, wird auch nichts
> mehr geschoeb :-(.. Ich denke das Laden ist das Problem.

Nachdem Du den Dateneingang auf "10101011" setzt, machst Du eben kein 
loadZGSR <= '1'; Das ist das Problem.

von Ralph H. (guru)


Lesenswert?

Ne mein Guter das stimmt nicht !
Ich mach sehr wohl nach dem "10101011" am Eingang anliegt,
ein Load = '1! nämlich genau 10 ns NACHDEM am Eingang
das "10101011" anliegt ! Ist auch im ISIM prima zu sehen.

von Anguel S. (anguel)


Lesenswert?

Ralph H. schrieb:
> Ne mein Guter das stimmt nicht !
Ich bin nicht Dein Guter.

> Ich mach sehr wohl nach dem "10101011" am Eingang anliegt,
> ein Load = '1! nämlich genau 10 ns NACHDEM am Eingang
> das "10101011" anliegt ! Ist auch im ISIM prima zu sehen.
Unten ist dein Code. Zeigst Du mir bitte, wo genau? Ich sehe es nicht.
1
   -- Stimulus process
2
   stim_proc: process
3
   begin    
4
      ZGOut <= "00000000"  ;    
5
    wait for 100 ns;  
6
    loadZGSR <= '0' , '1' after 10 ns , '0' after 15 ns ;
7
    ZGOut <= "10101011"  ;
8
    wait for 100 ns;
9
    ZGOut <= "00000000"  ;    
10
      -- insert stimulus here 
11
      wait;
12
   end process;

von Ralph H. (guru)


Lesenswert?

Anguel S. schrieb:
> Ich bin nicht Dein Guter.
Sorry, wollte Dir nicht zu nahe treten. Dennoch Danke für die Hilfe!

>     loadZGSR <= '0' , '1' after 10 ns , '0' after 15 ns ;
>     ZGOut <= "10101011"  ;
Nach meiner Interpretation (und auch ISIM Simulation) werden
loadZGSR=0 und ZGOut="10101011" parallel geladen.
Das Signal loadZGSR wechselt aber nach 10 ns auf 1 und nach 15 ns
wieder auf 0 zurück, erzeugt sozusagen einen 1 Impuls.
ZGOut bleibt auf "10101011" und müsste ins SR übernommen werden.

von Anguel S. (anguel)


Lesenswert?

Ralph H. schrieb:
> Nach meiner Interpretation (und auch ISIM Simulation) werden
> loadZGSR=0 und ZGOut="10101011" parallel geladen.
> Das Signal loadZGSR wechselt aber nach 10 ns auf 1 und nach 15 ns
> wieder auf 0 zurück, erzeugt sozusagen einen 1 Impuls.
> ZGOut bleibt auf "10101011" und müsste ins SR übernommen werden.

Ok, tut mir leid. Du hast Recht, das "after" hatte mich etwas verwirrt. 
Kannst du auch den Register-Code posten?

von Ralph H. (guru)


Lesenswert?

Hallo.. Du meinst den Code der zu testenden Datei oder ? Hier ist er...
1
process(clkVideo)
2
begin
3
  if rising_edge(clkVideo) then
4
    if loadZGSR= '1' then  -- parallel laden
5
      SR_ZGOut <= ZGOut ;  
6
    else
7
      SR_ZGOut <= SR_ZGOut(6 downto 0) & '0'; -- serial schieben
8
    end if;
9
  end if;
10
end process;
11
  SROut   <= SR_ZGOut ; -- Ausgänge laden nur zum Test
12
  VideoOut <= SR_ZGOut(7);
13
-- fertig Videodaten ausschieben
14
15
end VERHALTEN;

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


Lesenswert?

Ralph H. schrieb:
> Ich denke das Laden ist das Problem.
Ja, klar, denn wenn du das Ladesignal nur für 5 ns aktivierst und in 
diesen 5 ns keine Taktflanke kommt...
1
    constant CLK20_period : time := 10 ns;
2
:
3
    loadZGSR <= '0' , '1' after 10 ns , '0' after 15 ns ;
4
5
6
:
7
    if loadZGSR= '1' then  -- parallel laden
8
      SR_ZGOut <= ZGOut ;

von Ralph H. (guru)


Lesenswert?

doch Lothar.. es kamen Taktflanken,, aber auch mal testweise die 
Verlängerung des 1 Impulses auf 30ns ändert nichts...
Bin bald am Verzweifeln hier.. das kann doch ni so schwer sein ???

von Annexe (Gast)


Lesenswert?

Die Component hat doch nirgendwo einen Eingang für das Load-Signal?!

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


Lesenswert?

Ralph H. schrieb:
> Bin bald am Verzweifeln hier.. das kann doch ni so schwer sein ???
Zeig doch mal die gesamte Datei (und am besten auch die aktuelle TB) als 
Anhang...

>  es kamen Taktflanken,,
... und/oder mach mal einen Screenshot von der Simulations-Waveform.

von Anguel S. (anguel)


Lesenswert?

Genau, schick mal die kompletten Dateien, weil der Fehler wahrscheinlich 
in einer Kleinigkeit steckt.

von berndl (Gast)


Lesenswert?

Ralph H. schrieb:
> Ich brauche ein 8bit Schieberegister welches mit einer L/H Flanke
> parallel geladen wird und mit CLK (40Mhz) permanent diese 8Bits an OUT
> rausschiebt.

Also nur beim kurz drueber gucken faellt mir auf: Du schiebst in dein 
Schieberegister eine '0' nach, also nach ein paar Clocks kommen dann 
auch Nullen raus...

Und wie schon angemerkt, du hast keinen 'load' Eingang in deine 
Komponente...

von Ralph H. (guru)


Angehängte Dateien:

Lesenswert?

@Berndl... also ich hab sehr wohl ein load (nämlich mein loadZGSR) !!
Auch die 0 im Schieberegister nachzuschieben ist richtig !
aaaaber.. ich lade ja normalerweise das Schieberegister mit nem Wert der 
rauszuschieben ist. Nur genau eben das laden geht nicht :-(
Hier meine Daten... Habt ihr noch nen Tipp wie ich das Bild von ISIM 
einfacher als über nen Hardcopy hier rauskriege?

von Anguel S. (anguel)


Lesenswert?

Ralph H. schrieb:
> @Berndl... also ich hab sehr wohl ein load (nämlich mein loadZGSR) !!
loadZGSR geht aber nicht in den UUT der Testbench rein. Dein Unit Under 
Test bekommt also nicht mit, dass sich das Signal ändert. Du hast das 
Signal wahrscheinlich nachträglich zur Komponente zugefügt und die 
Testbench nicht upgedatet.

von Ralph H. (guru)


Lesenswert?

Juchhu.. Anguel.. Danke ! das wars nämlich... grrrrrr.. So ne 
Kleinigkeit in der Testbench... Menno.. Vielen Dank !!

von Anguel S. (anguel)


Lesenswert?

Ralph H. schrieb:
> Juchhu.. Anguel.. Danke ! das wars nämlich... grrrrrr.. So ne
> Kleinigkeit in der Testbench... Menno.. Vielen Dank !!

Kann passieren ;) Freut mich, dass das endlich gelöst ist! Frohe 
Restweihnachten und viel Erfolg noch.

Grüße,
Anguel

von Ralph H. (guru)


Lesenswert?

Jo Dir auch .. ich bin ja grad an meinem Hobby und hab Freude :)

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.