⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.txt

📁 A badic controller for the UART. It incorporates a -- transmit and receive FIFO (fr
💻 TXT
字号:
---------------------------------------------------------------------------
-- UART Control
-- Author       : Josh Chong
-- Date         : November 12, 1999
-- File Name    : uart_ctrl.vhd
-- Description  : A badic controller for the UART.  It incorporates a
--                transmit and receive FIFO (from Max+Plus II's MegaWizard
--                plug-in manager).  Note that no checking is done to see
--                whether the FIFOs are overflowing or not.  This strictly
--                handles the transmitting and receiving of the data.
---------------------------------------------------------------------------

library ieee;
use ieee.std_logic_1164.all;
--use ieee.std_logic_unsigned.all;
library work;
use work.uart_ctrl_pkg.all;

entity uart_ctrl is
port (
   clock      : in std_logic;
   reset      : in std_logic;
   receive    : in std_logic;
   datain     : in std_logic_vector(7 downto 0);
   dataout    : out std_logic_vector(7 downto 0);
   transmit   : out std_logic;
   write_data : in std_logic;
   read_data  : in std_logic;
   parityerr  : OUT  std_logic;
   framingerr : OUT  std_logic;
   overrun    : OUT  std_logic);
end entity;

   
architecture control of uart_ctrl is

-- Signals for controlling the UART
   signal write_sig: std_logic;
   signal txrdy_sig: std_logic;
   signal read_sig: std_logic;
   signal rxrdy_sig: std_logic;
-- Signals from the Transmit FIFO
   signal TXfifo_out: std_logic_vector(7 downto 0);
   signal TXwrreq: std_logic;
   signal TXrdreq: std_logic;
   signal TXempty: std_logic;
   signal TXfull: std_logic;  --Not used in ctrl
   signal TXfifo_used: std_logic_vector(3 downto 0);  --Not used in ctrl
-- Signals from the Receive FIFO
   signal RXfifo_in: std_logic_vector(7 downto 0);
   signal RXwrreq: std_logic;
   signal RXrdreq: std_logic;
   signal RXempty: std_logic;
   signal RXfull: std_logic;  --Not used in ctrl
   signal RXfifo_used: std_logic_vector(3 downto 0);  --Not used in ctrl
-- For use in transmitter control logic
   signal TxDataRdy: std_logic;
   signal ok2transmit: std_logic;
   signal prev_TxDataRdy: std_logic;
   signal send2TXfifo: std_logic;
-- For use in receiver control logic
   signal RxDataRdy: std_logic;
   signal RXok2read: std_logic;
   signal prev_RxDataRdy: std_logic;
   signal send2decoder: std_logic;

begin
   TXmap: txmit port map (
      mclkx16 => clock,
      write => write_sig,
      reset => reset,
      data => TXfifo_out,
      tx => transmit,
      txrdy => txrdy_sig);

   RXmap: rxcver port map (
      mclkx16 => clock,
      read => read_sig,
      rx => receive,
      reset => reset,
      rxrdy => rxrdy_sig,
      parityerr => parityerr,
      framingerr => framingerr,
      overrun => overrun,
      data => RXfifo_in);

   TXfifomap: fifo port map (
      data => datain,
      wrreq => TXwrreq,
      rdreq => TXrdreq,
      clock => clock,
      sclr => reset,
	  q => TXfifo_out,
      full => TXfull,
      empty => TXempty,
      usedw => TXfifo_used);

   RXfifomap: fifo port map (
      data => RXfifo_in,
      wrreq => RXwrreq,
      rdreq => RXrdreq,
      clock => clock,
      sclr => reset,
	  q => dataout,
      full => RXfull,
      empty => RXempty,
      usedw => RXfifo_used);

   --Control for Transmission (Through UART and TXfifo)
   TXctrl: process(clock, reset)
   begin
      if clock = '1' and clock'event then
         if reset = '1' then
            TXwrreq <= '0';
            TXrdreq <= '0';
            write_sig <= '1';
            ok2transmit <= '1';
         else
            --Enqueue data when DSP and fifo ready
            if (send2TXfifo = '1') then
               send2TXfifo <= '0';
               TXwrreq <= '1';
            else
               TXwrreq <= '0';
            end if;
            prev_TxDataRdy <= TxDataRdy;
            if (prev_TxDataRdy = '0') and (TxDataRdy = '1') then
               send2TXfifo <= '1';
            end if;

            --Dequeue data when ready to transmit
            --Puts a 1 cycle delay between telling fifo to dequeue one value
            --and telling the UART to read in data for transmission
            if (txrdy_sig = '1') and (ok2transmit = '1') and (TXempty = '0') then
               --Tell TXfifo to Dequeue 1 data value
               TXrdreq <= '1';
               ok2transmit <= '0';
            elsif (TXrdreq = '1') and (ok2transmit = '0') and (write_sig = '1') then
               --Tell UART TX to transmit this data
               write_sig <= '0';
               TXrdreq <= '0';
            else
               --elsif ( = '0') then
               write_sig <= '1';
            end if;
            --Ok to read again once txrdy goes high after going low
            if (txrdy_sig = '0') then
               ok2transmit <= '1';
            end if;
         end if;
      end if;
   end process;

   --Control for Receiving (Through UART and RXfifo)
   RXctrl : process(clock, reset)
   begin
      if clock = '1' and clock'event then
         if reset = '1' then
            RXwrreq <= '0';
            RXrdreq <= '0';
            read_sig <= '1';
            RXok2read <= '1';
            prev_RxDataRdy <= '0';
            send2decoder <= '0';

         else
            --Enqueue data when UART and fifo ready
            if (rxrdy_sig = '1') and (read_sig = '1') and (RXok2read = '1') then
               RXok2read <= '0';
               read_sig <= '0';
            elsif (read_sig = '0') and (RXwrreq = '0') and (RXok2read = '0') then
               RXwrreq <= '1';
            else
               RXwrreq <= '0';
               read_sig <= '1';
            end if;
            --Ok to read again once txrdy goes high after going low
            if (rxrdy_sig = '0') then
               RXok2read <= '1';
            end if;

            --Dequeue data when DSP ready
            --When fifo not empty and decryptor ready
            if (RXempty = '0') and (send2decoder = '1') then
               --Tell RXfifo to Dequeue 1 data value
               send2decoder <= '0';
               RXrdreq <= '1';
            else
               RXrdreq <= '0';
            end if;
            if (RxDataRdy = '1') and (prev_RxDataRdy = '0') then
               send2decoder <= '1';
            end if;
            prev_RxDataRdy <= RxDataRdy;
         end if;
      end if;
   end process;

   TxDataRdy <= write_data;
   RxDataRdy <= read_data;

end architecture;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -