Hallo,
ich bin gerade dabei mich in VHDL einzuarbeiten und möchte eine
vermutlich "einfache" Aufgabe lösen, komme aber nicht weiter :/.
Ich müchte Daten vom PIC an den FPGA senden. Dafür habe ich den
PIC18F2450 mit einem Spartan3A-DSP-Board über 11 Leitungen verbunden.
Der FPGA arbeitet mit 100MHz.
Der PIC mit 20MHz.
Dabei sind 8 Leitungen mit Port-d des PIC verbunden (8Bit-Datenbus).
Zusätzlich verwende ich zwei Bits des Port-b (RB0 und RB1) als
Statusbits welche Art von Daten gesendet werden (Adresse, NWT, HWT). Der
PIC setzt diese zwei Pins auf die Kombinationen "10"=>Adresse,
"11"=>NWT, "01"=>HWT.
Der letzte Kanal ist dann RC2 und ist für den "shake" des FPGAs
vorgesehen.
Ein Blockschaltbild des Prinzips habe ich angehängt.
Nun möchte ich im FPGA den Status der zwei Statusbits korrekt erkennen.
Ich synchronisiere diese beiden Bits wie von http://www.lothar-miller.de
beschrieben ein und frage die einsynchronisierten Signale dann per
IF-Anweisung ab.
Dies scheint soweit auch einwandfrei zu funktionieren. Zur Überprüfung
setze ich jeweils eine von vier LED's (LED_test1,...) bei korrekter
Erkennung auf '1'.
Dazu habe ich folgenden vhdl-Code geschrieben (Der Code ist jetzt nur
für die Übergabe einer Adresse abgebildet (also RB0=1 und RB1=0) und die
Deklarationen der LED_test's habe ich mal weggelassen, der
übersichtshalber):
1 | Library IEEE;
|
2 | Use IEEE.Std_Logic_1164.All;
|
3 | Use IEEE.Numeric_Std.All;
|
4 | use IEEE.STD_LOGIC_ARITH.ALL;
|
5 | use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
6 |
|
7 | entity uCread_topModule is
|
8 | Port ( clock : In Std_Logic;
|
9 | shake : out std_logic;
|
10 | hand_uC : in std_logic;
|
11 | hand2_uC : in std_logic;
|
12 | databus_uC: in std_logic_vector(7 downto 0););
|
13 | end entity uCread_topModule;
|
14 |
|
15 | architecture RTL of uCread_topModule is
|
16 |
|
17 | -----------------------------------------------------------------
|
18 | signal sync_hand_uC, sync_hand2_uC: std_logic_vector(1 downto 0);
|
19 | signal LED_test1, LED_test2, LED_test3, LED_test4: std_logic:='0';
|
20 | signal uCData: std_logic_vector(31 downto 0);
|
21 | -----------------------------------------------------------------
|
22 |
|
23 | -----\
|
24 | begin
|
25 | -----/
|
26 |
|
27 | -- Einsynchronisieren
|
28 | process begin
|
29 | wait until rising_edge(clock);
|
30 | -- Schieberegister
|
31 | sync_hand_uC <= sync_hand_uC(0) & hand_uC;
|
32 | sync_hand2_uC <= sync_hand2_uC(0) & hand2_uC;
|
33 | end process;
|
34 |
|
35 | process begin
|
36 | wait until rising_edge(clock);
|
37 | if (sync_hand_uC(1) & sync_hand2_uC(1)= "10") then
|
38 | shake<='1';
|
39 | LED_test1<='1';
|
40 | uCData(31 downto 24)<=databus_uC;
|
41 | if (uCData(31 downto 24)="00000001") then
|
42 | LED_test2<='1';
|
43 | else
|
44 | LED_test2<='0';
|
45 | end if;
|
46 | else
|
47 | shake<='0';
|
48 | LED_test1<='0';
|
49 | LED_test2<='0';
|
50 | uCData<=(others=>'0');
|
51 | end if;
|
52 | end process;
|
53 |
|
54 | end RTL;
|
Der Ablauf ist also folgender: Haben die einsynchronisierten Bits den
Status "10", wird LED_test1=grün, der FPGA sendet sein shake-Signal, was
dem PIC signalisieren soll, das er jetzt Daten auf den Datenbus legen
darf. Um dann zu testen ob die Daten auch korrekt sind, sende ich zzt.
vom PIC nur eine definierte Adresse (00000001) und überprüfe im FPGA ob
er diese auch erkannt hat. Falls ja, schaltet er die zweite LED=grün.
Der PIC-Code dazu ist folgender (Reiner Testcode, die eingebauten
delay's sind nur dazu da, um die LED's noch in einem Takt blinken zu
lassen den ich mit blossem Auge auch erkennen kann ;)
1 | while(1)
|
2 | {
|
3 | portd=0x0;
|
4 | portb=0x0;
|
5 | portb=0x01; //Setze Bits auf Kombination für send:Adresse
|
6 | delay_ms(500);
|
7 |
|
8 | if(portc.2==1) //Wenn shake=1, sende Daten
|
9 | {
|
10 | portd=0x01; //Sende Daten
|
11 | portb=0x0; //setze Hand-Signale wieder auf 0
|
12 | }
|
13 | delay_ms(500);
|
14 | }
|
Das Problem was ich jetzt habe ist: Der FPGA erkennt zwar immer korrekt
die hand-Signale (RB0, RB1-Kombinationen), allerdings nie die auf dem
Bus anliegenden Daten. Das Problem wird ja höchstwahscheinlich die 5fach
höhere Taktrate des FPGA's sein. Bis der PIC dazu kommt die Daten auf
den 8bit-Bus zu legen ist der FPGA schon wieder einige Schritte weiter.
Ich hoffe mir kann jemand einen Tip/Ansatz zur Problemlösung geben und
ich habe nicht zuviel rumgetextet. Sollte ich den Thread noch einmal
überarbeiten weil er zu undurchsichtig ist, bitte einfach bescheid geben
:)
THX for RE!