Hi Leutz!
Ich versuche momentan ein Interface für den FTDI 2232H auf meinem FPGA
zu implementieren. Jedoch funktioniert die Verbindung je nach Kompilat
nur manchmal, häufig nicht und auch die Verbindung bricht immer wieder
ab. Wie sich zeigt, habe ich wohl ordentliche Laufzeitprobleme, als
Neuling aber nicht viel Ahnung davon, wie ich diese beseitigen kann. Ich
weiß, dass ich gewisse Pfade im SDC-File per Constraints anpassen kann,
jedoch finde ich kaum Literatur dafür.
Laut Simulation sollte meine Implementierung funktionieren(?), ich habe
den Read und Write Fall in zwei Prozesse unterteilt, wobei der Read die
Priorität genießt und sich beide gegenseitig von der Verwendung des
Datenbusses ausschließen. Wie man in Signaltap sieht, wird mein A4 einen
Takt zu spät auf den Datenbus gelegt (der Preload sollte es, wie in der
Simulation, einen Takt vor dem LOW der oWR-Leitung anlegen) und das
letzte Datenwort kommt erst nach dem HIGH auf oWR auf der Datenleitung
an. Beim Lesen habe ich ein ähnliches Problem.
1 | Write_USB: process(iUSB_clk)
|
2 | begin
|
3 | if(falling_edge(iUSB_clk)) then
|
4 | if(ireset_n = '0') then
|
5 | oWR <= '1';
|
6 | oTXRead <= '0';
|
7 | nTXRun <= '0';
|
8 | Datainout <= (others => 'Z');
|
9 | stateTX <= idle;
|
10 | nTXE_Int <= '0';
|
11 | else
|
12 | case stateTX is
|
13 | when idle =>
|
14 | Datainout <= (others => 'Z');
|
15 | nTXRun <= '0'; -- Release interface for RX
|
16 | oWR <= '1'; -- Set Write enable to high
|
17 | oTXRead <= '0'; -- Stop reading from FIFO
|
18 | if(iTXEmpty = '0' AND iTXE = '0' AND iRXF = '1' AND nRXRun = '0') then -- If TX Data available, TX to USB possible,no Read data available and RX not running
|
19 | Datainout <= iTXData; -- Send Data to bus
|
20 | nTXRun <= '1'; -- Allocate USB Interface by blocking out RX
|
21 | stateTX <= prepare_data; -- Change state
|
22 | end if;
|
23 |
|
24 | when prepare_data =>
|
25 | oWR <= '0';
|
26 | oTXRead <= '1'; -- Send Read Acknowledge to FIFO
|
27 | stateTX <= write_to_USB; -- Change state
|
28 | when write_to_USB =>
|
29 | if(iRXF = '0' AND iTXEmpty = '0') then -- If Read data available AND TX FIFO not empty
|
30 | stateTX <= idle; -- Change state back to idle
|
31 | -- oTXRead <= '0'; -- Stop reading from FIFO
|
32 | Datainout <= iTXData; -- Send out last Byte to USB
|
33 | end if;
|
34 | if((iTXE = '1' OR iTXEmpty = '1') OR -- If TX not possible OR TX FIFO is empty
|
35 | (iTXEmpty = '1' AND iRXF = '0')) then -- OR Read Data available AND TX FIFO empty simultaneous
|
36 | stateTX <= idle; -- Change state to idle
|
37 | oTXRead <= '0'; -- Stop writing Read Acknowledge to FIFO
|
38 | oWR <= '1'; -- Set Write enable to high
|
39 | Datainout <= (others => 'Z'); -- Set Output to high impedence
|
40 | end if;
|
41 | if(iTXE = '0' AND iTXEmpty = '0' AND iRXF = '1') then -- If TX available and TX FIFO not empty and no Data to receive
|
42 | Datainout <= iTXData; -- Send Data to Bus
|
43 | oTXRead <= '1'; -- Send Read Acknowledge to FIFO
|
44 | oWR <= '0'; -- Pull down Write Enable
|
45 | stateTX <= write_to_USB; -- Stay in state
|
46 | end if;
|
47 | when others =>
|
48 | stateTX <= idle;
|
49 | end case;
|
50 | end if;
|
51 | end if;
|
52 | end process;
|
Hier mal exemplarisch der Write-Fall.
Hat einer 'ne Idee, wie ich die Daten constrainen muss und/oder einen
guten Link an der Hand, mit dem ich mich ein bisschen belesen kann?