1 | entity Main is
|
2 | Port (
|
3 | SYS_clk : in STD_LOGIC;
|
4 | Reset : in STD_LOGIC;
|
5 | -- UART_Control
|
6 | UART_SEND_data : out STD_LOGIC_VECTOR (63 downto 0); -- zu sendende Daten
|
7 | UART_SEND_data_en : out STD_LOGIC; -- 1 -> Send_Data sollen gesendet werden
|
8 | UART_SEND_ready : in std_logic; -- 1 -> bereit zum senden
|
9 | -- QSPI-BUFF
|
10 | BUFF_RD_sampled_data : out STD_LOGIC;
|
11 | BUFF_SAMPLED_data_out : in STD_LOGIC_VECTOR(63 downto 0);
|
12 | BUFF_FIFO_empty : in STD_LOGIC;
|
13 | -- DDR_2_RAM
|
14 | DDR_R_w : out STD_LOGIC;
|
15 | DDR_R_w_en : out STD_LOGIC;
|
16 | DDR_Address : out STD_LOGIC_VECTOR(23 downto 0);
|
17 | DDR_DDR2_rdy : in STD_LOGIC;
|
18 | DDR_DATA_out : in STD_LOGIC_VECTOR(63 downto 0);
|
19 | DDR_DATA_in : out STD_LOGIC_VECTOR(63 downto 0);
|
20 | DDR_empty : out STD_LOGIC;
|
21 |
|
22 | deb_ADDR_rd : out STD_LOGIC_VECTOR(23 downto 0);
|
23 | deb_ADDR_wr : out STD_LOGIC_VECTOR(23 downto 0);
|
24 | deb_ueberlauf: out STD_LOGIC;
|
25 | deb_WR_err : out STD_LOGIC;
|
26 | deb_RD_err : out STD_LOGIC;
|
27 | deb_state : out STD_LOGIC_VECTOR(2 downto 0)
|
28 | );
|
29 | end Main;
|
30 |
|
31 | architecture Behavioral of Main is
|
32 |
|
33 | signal ADDR_rd : STD_LOGIC_VECTOR(23 downto 0);
|
34 | signal ADDR_wr : STD_LOGIC_VECTOR(23 downto 0);
|
35 | signal ueberlauf: STD_LOGIC;
|
36 | signal WR_err : STD_LOGIC;
|
37 | signal RD_err : STD_LOGIC;
|
38 | type statetype is (get_data, write_data_ddr, write_data_ddr_wait, read_data, read_data_wait, transmit_data, idle);
|
39 | signal state : statetype;
|
40 |
|
41 | begin
|
42 | P1: Process(SYS_clk)
|
43 | begin
|
44 |
|
45 |
|
46 | if rising_edge(SYS_clk) then
|
47 |
|
48 | deb_ADDR_rd <= ADDR_rd; --: STD_LOGIC_VECTOR(23 downto 0);
|
49 | deb_ADDR_wr <= ADDR_wr; --: STD_LOGIC_VECTOR(23 downto 0);
|
50 | deb_ueberlauf <= ueberlauf; --: STD_LOGIC;
|
51 | deb_WR_err <= WR_err; --: STD_LOGIC;
|
52 | deb_RD_err <= RD_err; --: STD_LOGIC;
|
53 |
|
54 | if Reset = '1' then -- Reset Aktiv
|
55 | UART_SEND_data_en <= '0';
|
56 | BUFF_RD_sampled_data <= '0';
|
57 | DDR_R_w <= '0';
|
58 | DDR_R_w_en <= '0';
|
59 | WR_err <= '0';
|
60 | RD_err <= '0';
|
61 | DDR_Address <= x"000000";
|
62 | DDR_DATA_in <= x"0000000000000000";
|
63 | UART_SEND_data <= x"0000000000000000";
|
64 | ADDR_rd <= x"000000";
|
65 | ADDR_wr <= x"000001";
|
66 | ueberlauf <= '0';
|
67 | DDR_empty <= '1';
|
68 | state <= idle;
|
69 | else -- Reset inaktiv
|
70 | if state = idle then -- Wenn IDLE
|
71 | deb_state <="000";
|
72 | UART_SEND_data_en <= '0';
|
73 | if BUFF_FIFO_empty = '0' then -- Wenn fifo != empty --> Lesen
|
74 | BUFF_RD_sampled_data <= '1';
|
75 | state <= get_data;
|
76 | end if;
|
77 | elsif state = get_data then -- Wenn daten von FIFO gelesen
|
78 | deb_state <="001";
|
79 | BUFF_RD_sampled_data <= '0';
|
80 | DDR_DATA_in <= BUFF_SAMPLED_data_out;-- Daten puffern
|
81 | state <= write_data_ddr;
|
82 | elsif state = write_data_ddr then -- Daten in DDR schreiben
|
83 | deb_state <="010";
|
84 | if DDR_DDR2_rdy = '1' then -- Wenn DDR bereit --> Schreiben
|
85 | DDR_Address <= ADDR_wr;
|
86 | if ADDR_wr > ADDR_rd and ueberlauf = '0' then
|
87 | DDR_R_w <= '0';
|
88 | DDR_R_w_en <= '1';
|
89 | if ADDR_wr < x"ffffff" then
|
90 | --Wenn Maximal Addresse erreicht --> an addresse 0 beginnen, falls bereits ausgelesen
|
91 | ADDR_wr <= ADDR_wr + 1;
|
92 | state <= write_data_ddr_wait;
|
93 | else
|
94 | state <= write_data_ddr_wait;
|
95 | ADDR_wr <= x"000000";
|
96 | ueberlauf <= '1'; -- Setzen überlauf hat stattgefunden
|
97 | end if;
|
98 | elsif ADDR_wr < ADDR_rd and ueberlauf = '1' then
|
99 | DDR_R_w <= '0';
|
100 | DDR_R_w_en <= '1';
|
101 | state <= write_data_ddr_wait;
|
102 | ADDR_wr <= ADDR_wr + 1;
|
103 | else
|
104 | DDR_R_w <= '0';
|
105 | DDR_R_w_en <= '0';
|
106 | WR_err <= '1';
|
107 | end if;
|
108 | end if;
|
109 | elsif state = write_data_ddr_wait then
|
110 | deb_state <="011";
|
111 | DDR_R_w_en <= '0';
|
112 | state <= read_data;
|
113 | elsif state = read_data then --Daten geschrieben
|
114 | deb_state <="100";
|
115 | if UART_SEND_ready = '1' then -- Wenn FIFO bereit Daten zu senden
|
116 | if DDR_DDR2_rdy = '1' then -- Daten Lesen
|
117 | DDR_Address <= ADDR_rd;
|
118 | if ADDR_wr >= ADDR_rd and ueberlauf = '0' then
|
119 | DDR_R_w <= '1';
|
120 | DDR_R_w_en <= '1';
|
121 | ADDR_rd <= ADDR_rd + 1;
|
122 | state <= read_data_wait;
|
123 | DDR_empty <= '0';
|
124 | elsif ADDR_wr < ADDR_rd and ueberlauf = '1' then
|
125 | DDR_R_w <= '1';
|
126 | DDR_R_w_en <= '1';
|
127 | state <= read_data_wait;
|
128 | if ADDR_rd < x"ffffff" then
|
129 | ADDR_rd <= ADDR_rd + 1;
|
130 | else
|
131 | ueberlauf <= '0';
|
132 | ADDR_rd <= x"000000";
|
133 | end if;
|
134 | DDR_empty <= '0';
|
135 | else
|
136 | DDR_R_w <= '0';
|
137 | DDR_R_w_en <= '0';
|
138 | DDR_empty <= '1';
|
139 | state <= idle;
|
140 | end if;
|
141 | end if;
|
142 | else
|
143 | DDR_R_w <= '0';
|
144 | DDR_R_w_en <= '0';
|
145 | state <= idle;
|
146 | end if;
|
147 | elsif state = read_data_wait then
|
148 | deb_state <="101";
|
149 | DDR_R_w_en <= '0';
|
150 | DDR_R_w <= '0';
|
151 | state <= transmit_data;
|
152 | elsif state = transmit_data then
|
153 | deb_state <="110";
|
154 | DDR_R_w <= '0';
|
155 | DDR_R_w_en <= '0';
|
156 | if DDR_DDR2_rdy = '1' then
|
157 | UART_SEND_data <= DDR_DATA_out;
|
158 | UART_SEND_data_en <= '1';
|
159 | state <= idle;
|
160 | end if;
|
161 | end if;
|
162 | end if;
|
163 | end if;
|
164 | end Process;
|
165 | end Behavioral;
|