Moin, ich versuche seit zwei Tagen in VHDL eine UART zu entwickeln ( nur Daten empfangen ). Bin ein Anfänger in sachen FPGA und VHDL. Ich habe nun den untenstehenden Code geschrieben und in Modelsim getestet wo er wunderbar funktioniert. Aber im FPGA (Xilinx Spartan3 @50Mhz) läuft nichts. Die Zeichen vom PC (Terminal) kommen an. Wenn ich die RX Leitung und TX Leitung im FPGA verbinde habe ich ein Echo. Daran liegts nicht. Ich hoffe der Code ist verständlich. Vielleicht etwas wirr. Die Zähler die ich benutze um die Baudrate (Takt) zu erzeugen und um die empfangende Bits zu zählen werden je über ein DFF synchron resettet. Deswegen einmal rising_edge und einmal falling_edge. Was mache ich Falsch. In der Sim. funktionierts.
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.STD_LOGIC_ARITH.ALL; |
4 | use IEEE.STD_LOGIC_UNSIGNED.ALL; |
5 | |
6 | entity UART_RXCON is |
7 | Port ( rx_line : in STD_LOGIC; |
8 | clk : in STD_LOGIC; |
9 | run : out STD_LOGIC; |
10 | Data : out STD_LOGIC_VECTOR (9 downto 0)); |
11 | end UART_RXCON; |
12 | |
13 | architecture Behavioral of UART_RXCON is |
14 | signal start : STD_LOGIC := '0'; |
15 | signal RX_reg : STD_LOGIC_VECTOR (9 downto 0) := "0000000000"; |
16 | |
17 | signal bit_syncclr : STD_LOGIC := '0'; |
18 | signal bit_count : integer range 0 to 15 := 0; |
19 | |
20 | signal uclk_count : integer range 0 to 511 := 0; |
21 | signal uclk_syncclr : STD_LOGIC := '0'; |
22 | begin
|
23 | process (clk) |
24 | begin
|
25 | if falling_edge(clk) then |
26 | -- start FF --
|
27 | start <= ((not start) and (not rx_line)) or ((not bit_syncclr) and start); |
28 | ----------------
|
29 | -- bit_counter -
|
30 | if bit_syncclr = '0' then |
31 | if uclk_count = 217 then |
32 | bit_count <= bit_count + 1; |
33 | end if; |
34 | else
|
35 | bit_count <= 0; |
36 | end if; |
37 | ----------------
|
38 | -- uclk_syncclr ----
|
39 | if uclk_count = 434 then --434 |
40 | uclk_syncclr <= '1'; |
41 | else
|
42 | uclk_syncclr <= '0'; |
43 | end if; |
44 | --------------------
|
45 | -- RX_reg ----------
|
46 | if uclk_count = 217 then |
47 | RX_reg(9 downto 1) <= RX_reg(8 downto 0); |
48 | RX_reg(0) <= rx_line; |
49 | end if; |
50 | --------------------
|
51 | end if; |
52 | if rising_edge(clk) then |
53 | -- bit_syncclr FF --
|
54 | if bit_count = 10 then |
55 | bit_syncclr <= '1'; |
56 | else
|
57 | bit_syncclr <= '0'; |
58 | end if; |
59 | --------------------
|
60 | -- uclk_counter ----
|
61 | if uclk_syncclr = '1' or start = '0' then |
62 | uclk_count <= 0; |
63 | else
|
64 | uclk_count <= uclk_count + 1; |
65 | end if; |
66 | --------------------
|
67 | end if; |
68 | end process; |
69 | |
70 | Data <= RX_reg; |
71 | run <= start; |
72 | |
73 | end Behavioral; |
mfg