Ladbares Schieberegister seriell auslesen

OP #1989474
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 !!
#1989483
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
OP #1989660
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.
#1989725
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.
#1989749
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;
OP #1989759
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.
#1989786
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?
OP #1989978
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;
Moderator (Firma: Titel) Persönliche Seite #1990008
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 ;
Gast #1990478
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...
OP #1990548
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?
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren