library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; -- Οντότητα του UART loopback module entity uart_loopback is generic ( CLKFREQ : integer := 50E6; -- 50 MHz clock BAUDRATE : integer := 9600; -- Baud rate επικοινωνίας DATA_WIDTH : integer := 8; -- Πλάτος δεδομένων PARITY : string := "NONE"; -- Παράμετρος για parity (NONE, EVEN, ODD) STOP_WIDTH : integer := 1 -- Πλάτος stop bit ); port ( clk : in std_logic; -- Ρολοι συστήματος reset_n : in std_logic; -- Εξωτερικό reset (active low) -- Σήματα εξωτερικής διεπαφής i_rxData : in std_logic; -- Είσοδος δεδομένων RX o_txData : out std_logic; -- Έξοδος δεδομένων TX o_rxLed : out std_logic; -- Ένδειξη λήψης o_txLed : out std_logic; -- Ένδειξη αποστολής o_led : out std_logic_vector(7 downto 0); -- Εμφάνιση των δεδομένων στα LED o_seg_data_high : out std_logic_vector(6 downto 0); -- Ψηφίο υψηλών 4-bit σε 7-seg o_seg_data_low : out std_logic_vector(6 downto 0); -- Ψηφίο χαμηλών 4-bit σε 7-seg o_seg_data_vhigh : out std_logic_vector(6 downto 0) -- Ψηφίο υψηλών 4-bit σε 7-seg ); end uart_loopback; architecture rtl of uart_loopback is -- Εσωτερικά σήματα για την αποθήκευση και επεξεργασία δεδομένων signal s_paralel_data : std_logic_vector(DATA_WIDTH-1 downto 0); signal s_paralel_data_r : std_logic_vector(DATA_WIDTH-1 downto 0); signal s_uartData_ready : std_logic; signal s_uartData_valid : std_logic; signal s_paralel_data_7seg: std_logic_vector(DATA_WIDTH-1 downto 0); -- Σήματα για τα BCD ψηφία των δεδομένων (για τα δύο 7?seg) signal s_bcd_high : std_logic_vector(3 downto 0); signal s_bcd_low : std_logic_vector(3 downto 0); signal s_bcd_vhigh : std_logic_vector(3 downto 0); -- Δημιουργία του UART RX module component uart_rx is generic ( CLKFREQ : integer := 50E6; BAUDRATE : integer; DATA_WIDTH : integer := 8; PARITY : string := "NONE"; STOP_WIDTH : integer := 1 ); port ( clk : in std_logic; i_rxData : in std_logic; i_data_ready : in std_logic; o_rxData : out std_logic_vector(DATA_WIDTH-1 downto 0); o_rxData_valid: out std_logic; o_rxLed : out std_logic ); end component; -- Δημιουργία του UART TX module component uart_tx is generic ( CLKFREQ : integer := 50E6; BAUDRATE : integer; DATA_WIDTH : integer := 8; PARITY : string := "NONE"; STOP_WIDTH : integer := 1 ); port ( clk : in std_logic; o_txData : out std_logic; i_txData_valid : in std_logic; i_txData : in std_logic_vector(DATA_WIDTH-1 downto 0); o_txData_ready : out std_logic; o_txLed : out std_logic ); end component; component bin_to_bcd_div is port ( bin_in : in std_logic_vector(7 downto 0); -- 8-bit δυαδική είσοδος (0-255) bcd_hundreds : out std_logic_vector(3 downto 0); -- Δεκάδες (εκατοντάδες) bcd_tens : out std_logic_vector(3 downto 0); -- Δεκάδες bcd_units : out std_logic_vector(3 downto 0) -- Μονάδες ); end component; begin -- Σύνδεση του UART RX module rx0 : entity work.uart_rx(rtl) generic map (CLKFREQ=>CLKFREQ, BAUDRATE=>BAUDRATE, DATA_WIDTH=>DATA_WIDTH, PARITY=>PARITY, STOP_WIDTH=>STOP_WIDTH) port map (clk=>clk, i_rxData=>i_rxData, i_data_ready=>s_uartData_ready, o_rxData=>s_paralel_data_r, o_rxData_valid=>s_uartData_valid, o_rxLed=>o_rxLed); -- Καταχώρηση των ληφθέντων δεδομένων όταν είναι έγκυρα process(clk, reset_n) begin if reset_n = '0' then s_paralel_data_7seg <= (others => '0'); elsif rising_edge(clk) then if s_uartData_valid = '1' then s_paralel_data_7seg <= s_paralel_data_r; end if; end if; end process; -- Διάσπαση των ληφθέντων δεδομένων σε δύο 4-bit για την εμφάνιση σε 7-segment --s_bcd_vhigh <= s_paralel_data_7seg(7 downto 7); --s_bcd_high <= s_paralel_data_7seg(7 downto 4); --s_bcd_low <= s_paralel_data_7seg(3 downto 0); -- Τα LED εμφανίζουν το περιεχόμενο των ληφθέντων δεδομένων o_led <= s_paralel_data_7seg; -- Μετατροπή των BCD ψηφίων σε 7-segment bcd_to_dec : entity work.bin_to_bcd_div port map ( bin_in => s_paralel_data_7seg, bcd_hundreds => s_bcd_vhigh, bcd_tens => s_bcd_high, bcd_units => s_bcd_low ); -- Μετατροπή των BCD ψηφίων σε 7-segment seg_high_inst : entity work.bcd_to_7segment port map ( bcd => s_bcd_high, seg => o_seg_data_high ); seg_low_inst : entity work.bcd_to_7segment port map ( bcd => s_bcd_low, seg => o_seg_data_low ); seg_vhigh_inst : entity work.bcd_to_7segment port map ( bcd => s_bcd_vhigh, seg => o_seg_data_vhigh ); -- Αυξάνουμε την τιμή των δεδομένων πριν την αποστολή μέσω TX s_paralel_data <= std_logic_vector(unsigned(s_paralel_data_r)); -- Σύνδεση του UART TX module tx0 : entity work.uart_tx(rtl) generic map (CLKFREQ=>CLKFREQ, BAUDRATE=>BAUDRATE, DATA_WIDTH=>DATA_WIDTH, PARITY=>PARITY, STOP_WIDTH=>STOP_WIDTH) port map (clk=>clk, o_txData=>o_txData, i_txData_valid=>s_uartData_valid, i_txData=>s_paralel_data, o_txData_ready=>s_uartData_ready, o_txLed=>o_txLed); end rtl;