名称:数据位为48的UART接收器设计VHDL代码ISE仿真
软件:ISE
语言:VHDL
代码功能:
数据位为48的UART接收器
1、数据位宽为48位,其中1起始,48数据,1停止位。
2、使用移位寄存器依次接收48位。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序运行
4. Testbench
测试文件产生rx信号,按115200的波特率输出(低位在前)10101010101010...这样01交替变换的数据,相当于应该接收到48位的010101010101010...这样的并行数据。新组合的6bit数据应该为111111。
5. 仿真图
Rx交替变换
接收到48位010101010101010...,取第0,8,16,24,32,40位,组成new_data=111111
延迟输出new_data=111111
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ENTITY uart_rx_module IS PORT ( clk_100M : IN STD_LOGIC; rst_p : IN STD_LOGIC;--高电平复位 uart_rx : IN STD_LOGIC; data_receive_48 : OUT STD_LOGIC_VECTOR(47 DOWNTO 0); data_serial_out : OUT STD_LOGIC_VECTOR(5 DOWNTO 0) ); END uart_rx_module; ARCHITECTURE trans OF uart_rx_module IS SIGNAL bps_cnt : STD_LOGIC_VECTOR(15 DOWNTO 0):= "0000000000000000"; SIGNAL bps_cnt_mid : STD_LOGIC_VECTOR(15 DOWNTO 0):= "0000000000000000"; SIGNAL rx_mid : STD_LOGIC := '0';--中间位置采样 SIGNAL rx_en : STD_LOGIC := '0';--rx_en是接收数据使能信号 SIGNAL cnt : STD_LOGIC_VECTOR(15 DOWNTO 0) := "0000000000000000"; SIGNAL num : STD_LOGIC_VECTOR(5 DOWNTO 0) := "000000";--num表示对应数据位 SIGNAL rx_r0 : STD_LOGIC:= '0'; SIGNAL rx_r1 : STD_LOGIC:= '0'; SIGNAL rx_req : STD_LOGIC:= '0'; SIGNAL rx_done : STD_LOGIC:= '0'; SIGNAL rx_data : STD_LOGIC_VECTOR(47 DOWNTO 0):= "000000000000000000000000000000000000000000000000"; SIGNAL receive_data : STD_LOGIC_VECTOR(47 DOWNTO 0) := "000000000000000000000000000000000000000000000000"; SIGNAL receive_data_1 : STD_LOGIC_VECTOR(7 DOWNTO 0):= "00000000"; SIGNAL receive_data_2 : STD_LOGIC_VECTOR(7 DOWNTO 0):= "00000000"; SIGNAL receive_data_3 : STD_LOGIC_VECTOR(7 DOWNTO 0):= "00000000"; SIGNAL receive_data_4 : STD_LOGIC_VECTOR(7 DOWNTO 0):= "00000000"; SIGNAL receive_data_5 : STD_LOGIC_VECTOR(7 DOWNTO 0):= "00000000"; SIGNAL receive_data_6 : STD_LOGIC_VECTOR(7 DOWNTO 0):= "00000000"; SIGNAL new_data : STD_LOGIC_VECTOR(5 DOWNTO 0):= "000000"; SIGNAL data_count : STD_LOGIC_VECTOR(5 DOWNTO 0) := "000000"; BEGIN bps_cnt <= "0000001101100011"; bps_cnt_mid <= "0000000110110001"; PROCESS (clk_100M, rst_p) BEGIN IF (rst_p = '1') THEN rx_mid <= '0'; ELSIF (clk_100M'EVENT AND clk_100M = '1') THEN IF (rx_en = '1') THEN IF (cnt = bps_cnt_mid) THEN rx_mid <= '1'; ELSE rx_mid <= '0'; END IF; ELSE rx_mid <= '0'; END IF; END IF;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1146
阅读全文
750