| 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;
 |