Forum: FPGA, VHDL & Co. parallel 2 seriell?


von sneuser (Gast)


Lesenswert?

Hallo,
eine kleine Anfängerfrage hätte ich.
Als Bsp.:
am Eingäng liegt erst _1 an dann kommt die Taktflanke und diese sollen 
einglesen werden. im nächsten Takt liegt dann schon _2 an und soll 
eingelesen werden.
a_1=1     a_2=1
b_1=0     b_2=0

und als ergebnis hätte ich dann gerne z.B. c=10 10

wie bewerkstellige ich das das ich 2 Eingänge gleichzeitig getaktet 
auslese und nacheinander mir die anliegenden signale ausgeben lasse?

Vielen Dank für Ihre Hilfe!

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


Lesenswert?

sneuser schrieb:
> wie bewerkstellige ich das das ich 2 Eingänge gleichzeitig getaktet
> auslese und nacheinander mir die anliegenden signale ausgeben lasse?
Mit einem 2 Bit breiten Schieberegister?
1
 port (  clk : in std_logic;
2
         inp : in std_logic_vector(1 downto 0);
3
         outp : out std_logic_vector(3 downto 0)
4
       );
5
:
6
signal a,b : std_logic_vector(1 downto 0);
7
signal c : std_logic_vector(3 downto 0);
8
:
9
   process begin
10
      wait until rising_edge(clk);
11
      a <= inp;
12
      b <= a;
13
   end process;
14
15
  c <= b & a;
16
  outp <= c;
17
:
Allerdings mußt du dir noch Gedanken zur Synchronisierung machen, damit 
du weißt, bei welchem Takt die richtigen 2 Bit eingelesen wurden...

von sneuser (Gast)


Lesenswert?

es wird ja pro takt immer ein crump eingelesen und "durchgedrückt" 
inwiefern meinst du synchroniesierung?

du meinst quasi das er nicht die ganze zeit druchschiebt? sondern nur 
auf abruf wenn ich es haben möchte? dann müsste ich mir ein signal 
generieren das sagt ab hier einlesen. also so in der art wie ein sof und 
eof müsste ich mir genieren oder halt ein signal das so lange high ist 
so lang wie ich werte einlesen und seriell durchschieben möchte?

kann ich mir das erstellte serielle signal dann auch in einem byte 
abspeichern wenn ich 8 bits eingelesen habe? bleibt es mir dann wenn c 
als signal deklariert ist zeitlich erhalten oder müsste ich dann dies in 
einen speicher ablegen? könnte ich dann ein fifo nehmen? ist ja dann wie 
ein schieberegister oder? oder wäre es besser bei vielen einzulesenden 
daten einen anderen speicher zu nehmen?

danke für die schnelle antwort!

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


Lesenswert?

sneuser schrieb:
> kann ich mir das erstellte serielle signal dann auch in einem byte
> abspeichern wenn ich 8 bits eingelesen habe?
Sicher.

> bleibt es mir dann wenn c als signal deklariert ist zeitlich erhalten
> oder müsste ich dann dies in einen speicher ablegen?
Ob ein Signal speichert oder nicht, das liegt allein an der 
Beschreibung: wenn da ein Takt involviert ist, dann bedeutet das 
Flipflop und damit Speicher...

> es wird ja pro takt immer ein crump eingelesen und "durchgedrückt"
> inwiefern meinst du synchroniesierung?
Wie willst du wissen, wann die 4 Bits von C gültig sind?
Mal angenommen, du hast pro Takt die Sequenz 00, 01, 10, 11 an den 
Eingängen. Dann sieht der Ausgang C so aus 0000, 0001, 0110, 1011 und 
nur das 2. und das 4. Bitmuster wäre eigentlich "gültig"...

> könnte ich dann ein fifo nehmen? ist ja dann wie ein schieberegister oder?
Ja.
> oder wäre es besser bei vielen einzulesenden
> daten einen anderen speicher zu nehmen?
Anhand der VHDL-Beschreibung ist noch überhaupt nicht festgelegt, wie 
das Ganze letztlich implementiert wird...

von sneuser (Gast)


Lesenswert?

Lothar Miller schrieb:
>> es wird ja pro takt immer ein crump eingelesen und "durchgedrückt"
>
>> inwiefern meinst du synchroniesierung?
>
> Wie willst du wissen, wann die 4 Bits von C gültig sind?
>
> Mal angenommen, du hast pro Takt die Sequenz 00, 01, 10, 11 an den
>
> Eingängen. Dann sieht der Ausgang C so aus 0000, 0001, 0110, 1011 und
>
> nur das 2. und das 4. Bitmuster wäre eigentlich "gültig"...

aber ich dachte jetzt wenn ich 10, 10 anliegn hab kommt 1010 für c raus. 
wieso kommt denn nun in deinem beispiel dieser c ausgang zustanden? nach 
deiner erklärung wäre ich da jetzt von ausgegangen das 0001 und 1011 
rauskommt.

oder wie bekomme ich sonst parallel anliegende daten in einen seriellen 
"datenstrom" oder missverstehe ich grad etwas?

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


Lesenswert?

sneuser schrieb:
> nach deiner erklärung wäre ich da jetzt von ausgegangen
> das 0001 und 1011 rauskommt.
Tja, Pech. Drum habe ich dich drauf hingewiesen.
Simulier das einfach mal...

In meinem Code wird nicht unterschieden, welcher der "erste" oder der 
"zweite" Taktimpuls ist. Wie denn auch?

sneuser schrieb:
> oder wie bekomme ich sonst parallel anliegende daten in einen seriellen
> "datenstrom" oder missverstehe ich grad etwas?
Du machst hier gerade die andere Richtung: seriell ankommende Daten 
werden zusammengefasst und parallel ausgegeben...

sneuser schrieb:
> aber ich dachte jetzt wenn ich 10, 10 anliegn hab kommt 1010 für c raus.
Mal langsam zum Mitschreiben:
clk       ^     ^     ^     ^     ^     ^(^= steigende Flanke)
inp 00      10    10    11    11    00
a   uu    00    10    10    11    11    00
b   uu    uu    00    10    10    11    11
C   uuuu  uu00  0010  1010  1011  1111  1100

von sneuser (Gast)


Lesenswert?

Lothar Miller schrieb:
>> aber ich dachte jetzt wenn ich 10, 10 anliegn hab kommt 1010 für c raus.
>
> Mal langsam zum Mitschreiben:
>
> clk       ^     ^     ^     ^     ^     ^(^= steigende Flanke)
>
> inp 00      10    10    11    11    00
>
> a   uu    00    10    10    11    11    00
>
> b   uu    uu    00    10    10    11    11
>
> C   uuuu  uu00  0010  1010  1011  1111  1100


Okay ich glaube das habe ich verstanden das beim durchschieben da werte 
zusammenkommen die ich eigentlich nicht haben will. Und wie kann ich 
diese dann ausmerzen? also wie achte ich auf die richtige 
Synchronisierung?

Gut das du das sagst ich hab die ganze Zeit gedacht ich mach parallel zu 
seriell. Aber ist es dann ein Datenstrom? also wenn c=0010 1011 usw 
ausgebe? ich bin nämlich am überlegen wie ich die daten von meinem 
ethernet mac weiter verwenden kann. dieso kommen nämlich mit 2 signalen 
rein und diese muss ich ja in einen bitstream bzw möchte ich in einem 
bitstream einlesen und speichern. Da es sich hierbei um ein RMII handelt 
kommen nur RXD0 und RXD1 rein und werden mit 50MHz reingetaktet und 
nicht wie bei MII 4 Bit auf einmal mit 25MHz. WIe fasse ich diese dann 
zusammen. Ist der weg da dann richtig mit den Schieberegistern?

Vielen Dank nochmal hast mir einige Ahhhs und Ooohs verschafft ;)

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.