用FPGA/CPLD设计UART

[11-20 16:14:12]   来源:http://www.88dzw.com  FPGA   阅读:8283

文章摘要:--- dout <= tsr(0) ; --- parity <= parity xor tsr(0) ; --奇偶校验 --- elsif std_logic_vector(length_no) = “1011” then --- dout <= parity ; 校验位输出 --- elsif std_logic_vector(length_no) = “1100” then --- dout <= '1' ; --停止位输出 --- tre <= '1' ; --发送完毕标志置“1” --- end if ; --- 发送器

用FPGA/CPLD设计UART,标签:fpga是什么,fpga教程,http://www.88dzw.com
--- dout <= tsr(0) ;
--- parity <= parity xor tsr(0) ; --奇偶校验
--- elsif std_logic_vector(length_no) = “1011” then
--- dout <= parity ; 校验位输出
--- elsif std_logic_vector(length_no) = “1100” then
--- dout <= '1' ; --停止位输出
--- tre <= '1' ; --发送完毕标志置“1”
--- end if ;


--- 发送器仿真波形如图4所示。



2 UART接收器


--- 串行数据帧和接收时钟是异步的,发送来的数据由逻辑1变为逻辑0可以视为一个数据帧的开始。接收器先要捕捉起始位,确定rxd输入由1到0,逻辑0要8个CLK16时钟周期,才是正常的起始位,然后在每隔16个CLK16时钟周期采样接收数据,移位输入接收移位寄存器rsr,最后输出数据dout。还要输出一个数据接收标志信号标志数据接收完。
--- 接收器的端口信号如图5所示。


--- 实现的部分VHDL程序如下。


--- elsif clk1x'event and clk1x = '1' then
--- if std_logic_vector(length_no) >= “0001” and std_logic_vector(length_no) <= “1001” then
--- --数据帧数据由接收串行数据端移位入接收移位寄存器
--- rsr(0) <= rxda ;
--- rsr(7 downto 1) <= rsr(6 downto 0) ;
--- parity <= parity xor rsr(7) ;
--- elsif std_logic_vector(length_no) = “1010” then
--- rbr <= rsr ; --接收移位寄存器数据进入接收缓冲器
--- ......
--- end if ;


--- 接收器仿真波形如图6所示。



3 波特率发生器


--- UART的接收和发送是按照相同的波特率进行收发的。波特率发生器产生的时钟频率不是波特率时钟频率,而是波特率时钟频率的16倍,目的是为在接收时进行精确地采样,以提出异步的串行数据。
--- 根据给定的晶振时钟和要求的波特率算出波特率分频数。
--- 波特率发生器仿真波形如图7所示。

三 小结


--- 通过波特率发生器、发送器和接收器模块的设计与仿真,能较容易地实现通用异步收发器总模块,对于收发的数据帧和发生的波特率时钟频率能较灵活地改变,而且硬件实现不需要很多资源,尤其能较灵活地嵌入到FPGA/CPLD的开发中。在EDA技术平台上进行设计、仿真与实现具有较好的优越性。

上一页  [1] [2] 


Tag:FPGAfpga是什么,fpga教程FPGA
分类导航
最新更新
热门排行