java怎么拦截某个对象
222
2022-11-14
基于FPGA芯片的UART接口电路设计
1 UART简介
图1 UART数据帧格式
2 UART功能实现
UART可以分解为3个子模块:波特率发生器模块;发送模块;接收模块。UART的功能主要由VHDL硬件描述语言编程,图2是编译后生成的图元SCI,它包括了UART的最主要的部分,即发送模块和接收模块。SCI的外部口线可分为3类:
一是与数字系统的接口,包括数据DATA[7.0],片选CS,读写RD、WR,状态RDFULL、TDEMPTY.这部分接口完成的功能是将待发送的数据写入SCI或从SCI读出已接收到的数据。
二是串行通信接口2条线RXD、TXD,其中RXD是接收数据线、TXD是发送数据线,因此,SCI实现的是全双工通信的设计。
图2 UART的图元模块结构
TDEMPTY为输出寄存器空标志,高电平表示由CS、WR有效写入到输出寄存器的数据已经发送完毕,可以向输出寄存器写入另外待发送的数据,低电平时表示数据目前正在发送中。
2.1 发送模块设计
-----数据发送控制进程-----
PROCESS(clk,reset)
variablescit_v:integerrange0to63;
variablescit_s:STd_LOGIC_vector(tdownto0);
BEGIN
scit_v:=0;--“000000”
ELSIF(clkE‘VENTANDclk=1’)‘THEN
IF(scit_v<=27)THEN
IF(tdEMPTY_s=0’‘ANDwr=1’)‘THEN
scit_v:=28;--sci_v=“011100”
ELSE
scit_v:=0;
ENDIF;
ELSE
scit_v:=scit_v+1;
ENDIF;
ENDIF;
scit_s:=conv_std_logic_vector(scit_v,6);
scit<=TO_STDULOGICVECTOR(scit_s);
ENDPROCESS;
------数据的串行发送-----
PROCESS(sh_t)
BEGIN
WHEN“0111”=>txd<=0’;‘
WHEN“1000”=>txd<=din_latch(0);
WHEN“1001”=>txd<=din_latch(1);
WHEN“1010”=>txd<=din_latch(2);
WHEN“1011”=>txd<=din_latch(3);
WHEN“1100”=>txd<=din_latch(4);
WHEN“1101”=>txd<=din_latch(5);
WHEN“1110”=>txd<=din_latch(6);
WHEN“1111”=>txd<=din_latch(7);
WHENOTHERS=>txd<=1’;‘
ENDCASE;
ENDPROCESS;
图3给出的是发送数据的仿真图。当CS和WR有效时写入数据55H,同时EMPTY被置成无效状态,开始数据的发送,从图中可以看到TXD上电平的变化过程,当发送结束后EMPTY变为有效。
图3 发送数据的仿真波形
2.2 接收模块设计
UART接口模块由接收控制进程、读数据进程、接收数据串/并转换进程、状态操作进程等进程构成。
----接收行数据的串/转换进程---
PROCESS(clk,reset)
BEGIN
IF(reset=0’)‘THEN
d_fb<=“00000000”;
ELSIF(clkE’VENTANDclk=0‘)’THEN
IF((sh_r>=“1000”)AND(sh_r<=“
1111”)AND(sl_r=“01”))THEN
d_fb(7)<=rxd;
d_fb(i)<=d_fb(i+1);--d_fb(0)被移
出;d_fb(7)被移空
ENDLOOP;
ENDIF;
ENDIF;
ENDPROCESS;
图4给出的是接收数据的仿真图。当rxd出现低电平后便启动一次接收过程,当8比特的数据接收完毕后,rxd变为高电平,同时将RDFULL信号置为高电平有效,RDFULL有效表示接收寄存器已经存储了一个刚刚接收到的数据,当CS和RD有效时将数据(实际接收到的数据是2AH)读出,同时RDFULL被置成无效状态。
图4 接收数据的仿真波形
2.3 波特率发生器模块
3 结论
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~