Files
DESD/LAB3/ip/AXI4-Stream_UART/hdl/UART_Manager.vhd
Cd16d b11c65043f Add AXI4-Stream UART IP and associated files
- Created board.xit for physical constraints related to UART interface.
- Added vv_index.xml to define the AXI4-Stream UART IP with relevant metadata.
- Implemented GUI for AXI4-Stream UART parameters in AXI4Stream_UART_v1_0.tcl and AXI4Stream_UART_v1_1.tcl.
- Initialized Vivado project files for diligent_jstk and loopback_I2S designs, including synthesis and implementation settings.
- Configured file sets and simulation options for both projects.
2025-05-12 18:16:58 +02:00

239 lines
9.5 KiB
VHDL
Raw Blame History

-------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------
---- * ) ----
----` ) /( ( ) ( ( ( ( ( ( ( ( ( ( ( ----
---- ( )(_)))\ ( ))\ )\ ( )\))( )\ ( ))\ ))\ )( )\ ( )\))( ----
----(_(_())((_) )\ ' /((_) ((_) )\ ) ((_))\((_) )\ ) /((_)/((_)(()\((_) )\ ) ((_))\ ----
----|_ _| (_) _((_)) (_)) | __| _(_/( (()(_)(_) _(_/( (_)) (_)) ((_)(_) _(_/( (()(_) ----
---- | | | || ' \()/ -_) | _| | ' \))/ _` | | || ' \))/ -_)/ -_) | '_|| || ' \))/ _` | ----
---- |_| |_||_|_|_| \___| |___||_||_| \__, | |_||_||_| \___|\___| |_| |_||_||_| \__, | ----
---- |___/ |___/ ----
-------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------
---- _____ _ ___ __ _ _ _ __ _ ----
---- o O O |_ _| (_) _ __ ___ | __| _ _ / _` | (_) _ _ ___ ___ _ _ (_) _ _ / _` | ----
---- o | | | | | ' \ / -_) | _| | ' \ \__, | | | | ' \ / -_) / -_) | '_| | | | ' \ \__, | ----
---- TS__[O] _|_|_ _|_|_ |_|_|_| \___| |___| |_||_| |___/ _|_|_ |_||_| \___| \___| _|_|_ _|_|_ |_||_| |___/ ----
---- {======|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""| ----
----./o--000'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-' ----
------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------DESCRIPTION------------------------------------------
------------------------------------------------------------------------------------------
-- Modulo di pi<70> basso livello per la gestione dei dati tra FIFO in e FIFO out ed il --
-- modulo FTDI 2232H in modalita FT245 Asynchronous. La priorit<69> <20> data ai dati in --
-- arrivo dal PC verso FPGA. --
-- Il clock in ingresso deve avere un periodo di 10 ns per garantire i tempi --
-- rischiesti dal 2232H --
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity UART_Manager is
generic(
UART_BAUD_RATE : positive;
UART_CLOCK_FREQUENCY : positive --The associated clock frequency
);
Port (
---------Global---------
clk_uart : IN STD_LOGIC;
reset : IN STD_LOGIC;
------------------------
---------Connessioni comunicazione UART-----------
UART_TX : OUT STD_LOGIC;
UART_RX : IN STD_LOGIC;
---------------------------------------------------
------------FIFO_DATA_RX (8bit)-------------
FIFO_DATA_RX_rst : OUT STD_LOGIC;
FIFO_DATA_RX_clk : OUT STD_LOGIC;
FIFO_DATA_RX_din : OUT STD_LOGIC_VECTOR(8-1 DOWNTO 0);
FIFO_DATA_RX_wr_en : OUT STD_LOGIC;
FIFO_DATA_RX_full : IN STD_LOGIC;
FIFO_DATA_RX_almost_full : IN STD_LOGIC;
--------------------------------------------
------------FIFO_DATA_TX (8bit)-------------
--FIFO_DATA_RX_rst : OUT STD_LOGIC;
FIFO_DATA_TX_clk : OUT STD_LOGIC;
FIFO_DATA_TX_dout : IN STD_LOGIC_VECTOR(8-1 DOWNTO 0);
FIFO_DATA_TX_rd_en : OUT STD_LOGIC;
FIFO_DATA_TX_empty : IN STD_LOGIC;
FIFO_DATA_TX_almost_empty : IN STD_LOGIC
--------------------------------------------
);
end UART_Manager;
architecture Behavioral of UART_Manager is
-------------------COMPONENT------------------
COMPONENT UART_engine
GENERIC(
BAUD_RATE : positive;
CLOCK_FREQUENCY : positive
);
PORT(
--SYSTEM UART
clock : IN std_logic;
reset : IN std_logic;
-- FPGA-->PC
data_stream_in : IN std_logic_vector(7 downto 0);
data_stream_in_stb : IN std_logic;
data_stream_in_ack : OUT std_logic;
data_stream_in_done : OUT std_logic;
tx : OUT std_logic;
-- PC-->FPGA
data_stream_out : OUT std_logic_vector(7 downto 0);
data_stream_out_stb : OUT std_logic;
rx : IN std_logic
);
END COMPONENT;
----------------------------------------------
--------------------SIGNALS-------------------
signal state : STD_LOGIC_VECTOR(7 DOWNTO 0):=x"00";
--TX:fromFPGAtoPC
signal data_stream_in : STD_LOGIC_VECTOR(7 DOWNTO 0) := (others=>'0');
signal data_stream_in_stb : STD_LOGIC := '0';
signal data_stream_in_ack : STD_LOGIC := '0';
signal data_stream_in_done : STD_LOGIC := '0';
signal state_TX : STD_LOGIC_VECTOR(7 DOWNTO 0):=x"FF";
--RX:fromPCtoFPGA
signal data_stream_out : STD_LOGIC_VECTOR(7 DOWNTO 0) := (others=>'0');
signal data_stream_out_stb : STD_LOGIC := '0';
----------------------------------------------
begin
Inst_uart: UART_engine
GENERIC MAP (
BAUD_RATE => UART_BAUD_RATE,
CLOCK_FREQUENCY => UART_CLOCK_FREQUENCY
)
PORT MAP(
clock => clk_uart,
reset => reset,
-- FPGA-->PC
data_stream_in => data_stream_in, --byte FPGA->PC, (in)
data_stream_in_stb => data_stream_in_stb, --'1' per 1 clock inizia la fase di trasmisisone a PC di data_stream_in (in)
data_stream_in_ack => data_stream_in_ack, --'1' per 1 clock vuol dire che START TX (data_stream_in_stb='1') <20> stata capita (in)
data_stream_in_done => data_stream_in_done, --'1' indica la fine della trasmisione (out)
tx => UART_TX,
-- PC-->FPGA
data_stream_out => data_stream_out, --byte PC->FPGA, (out)
data_stream_out_stb => data_stream_out_stb, --'1' per 1 clock indica che su data_stream_out c'<27> un nuovo dato (out)
-- data_stream_out => FIFO_RX_din,
-- data_stream_out_stb => FIFO_RX_wr_en,
rx => UART_RX
);
fromFPGAtoPC : process(clk_uart, reset)
begin
if (reset = '1') then
state_TX <= x"00";
--UART
data_stream_in <= (others => '0');
data_stream_in_stb <= '0';
--FIFO_TX
FIFO_DATA_TX_rd_en <= '0';
elsif rising_edge(clk_uart) then
case state_TX is
when x"FF" =>
if(reset = '0') then
state_TX <= x"00";
else
state_TX <= x"FF";
end if;
--UART
data_stream_in <= (others => '0');
data_stream_in_stb <= '0';
--FIFO_TX
FIFO_DATA_TX_rd_en <= '0';
when x"00" =>
FIFO_DATA_TX_rd_en <= '0';
data_stream_in_stb <= '0';
if (FIFO_DATA_TX_empty = '0') then --nessun dato da trasmettere al PC
state_TX <= x"01"; --si hanno dati in FIFO TX da passare al PC
FIFO_DATA_TX_rd_en <= '1'; --abilita lettura FIFO
data_stream_in <= FIFO_DATA_TX_dout; --dai alla UART il byte in uscita dalla fifo gi<67> pronto
data_stream_in_stb <= '1'; --abilita TX della UART
end if;
when x"01" =>
FIFO_DATA_TX_rd_en <= '0'; --blocca la lettura FIFO
--tieni data_stream_in_stb attivo finche la UART non inizia a trasferire data_stream_in_ack='0'
if (data_stream_in_ack = '1') then
state_TX <= x"02";
data_stream_in_stb <= '0';
end if;
when x"02" =>
-- data_stream_in_done = '1' significa fin trasmisisone UART
if (data_stream_in_done = '1') then
state_TX <= x"00";
end if;
when others =>
state_TX <= x"00";
end case;
end if;
end process;
fromPCtoFPGA : process(clk_uart, reset)
begin
if (reset = '1') then
FIFO_DATA_RX_din <= (others => '0');
FIFO_DATA_RX_wr_en <= '0';
elsif rising_edge(clk_uart) then
FIFO_DATA_RX_wr_en <= '0';
if (data_stream_out_stb = '1') then --arrivato nuovo dato sulla UART, caricalo in FIGO RX
FIFO_DATA_RX_wr_en <= '1';
FIFO_DATA_RX_din <= data_stream_out;
end if;
end if;
end process;
--------------------ASSIGMENT------------------
FIFO_DATA_RX_clk <= clk_uart;
FIFO_DATA_TX_clk <= clk_uart;
FIFO_DATA_RX_rst <= reset;
-----------------------------------------------
end Behavioral;