mikrocontroller.net

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


Autor: Ralph H. (guru)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

process(clk)
begin
  if rising_edge(clk) then
    if load='1' then  -- parallel laden
      sr <= sr_in;  
    else
      sr <= sr(6 downto 0) & '0'; -- seriall schieben
    end if;
  end if;
end process;

ser_out <= sr(7);


MFG
Falk

Autor: Ralph H. (guru)
Datum:

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

Autor: Anguel S. (anguel)
Datum:

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

Autor: Ralph H. (guru)
Datum:
Angehängte Dateien:

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

Autor: Anguel S. (anguel)
Datum:

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

Autor: Ralph H. (guru)
Datum:

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

Autor: Anguel S. (anguel)
Datum:

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

Autor: Ralph H. (guru)
Datum:

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

Autor: Anguel S. (anguel)
Datum:

Bewertung
0 lesenswert
nicht 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.
   -- Stimulus process
   stim_proc: process
   begin    
      ZGOut <= "00000000"  ;    
    wait for 100 ns;  
    loadZGSR <= '0' , '1' after 10 ns , '0' after 15 ns ;
    ZGOut <= "10101011"  ;
    wait for 100 ns;
    ZGOut <= "00000000"  ;    
      -- insert stimulus here 
      wait;
   end process;

Autor: Ralph H. (guru)
Datum:

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

Autor: Anguel S. (anguel)
Datum:

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

Autor: Ralph H. (guru)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.. Du meinst den Code der zu testenden Datei oder ? Hier ist er...
process(clkVideo)
begin
  if rising_edge(clkVideo) then
    if loadZGSR= '1' then  -- parallel laden
      SR_ZGOut <= ZGOut ;  
    else
      SR_ZGOut <= SR_ZGOut(6 downto 0) & '0'; -- serial schieben
    end if;
  end if;
end process;
  SROut   <= SR_ZGOut ; -- Ausgänge laden nur zum Test
  VideoOut <= SR_ZGOut(7);
-- fertig Videodaten ausschieben

end VERHALTEN;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...
    constant CLK20_period : time := 10 ns;
:
    loadZGSR <= '0' , '1' after 10 ns , '0' after 15 ns ;


:
    if loadZGSR= '1' then  -- parallel laden
      SR_ZGOut <= ZGOut ;  

Autor: Ralph H. (guru)
Datum:

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

Autor: Annexe (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Anguel S. (anguel)
Datum:

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

Autor: berndl (Gast)
Datum:

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

Autor: Ralph H. (guru)
Datum:
Angehängte Dateien:

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

Autor: Anguel S. (anguel)
Datum:

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

Autor: Ralph H. (guru)
Datum:

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

Autor: Anguel S. (anguel)
Datum:

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

Autor: Ralph H. (guru)
Datum:

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

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.