




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
EDA课程设计报告 题目:#1串口通信姓名: 学号: 班级:组员:串口通信一、 设计要求 设计一个全双工串口收发控制程序,速率为1200b/s、9600b/s、19200b/s可选,其中数据帧格式为:1位起始位+8位数据+1位奇偶校验位+1位停止位。二、 系统组成 FPGA UART由3个子模块组成: 波特率发生器; 接收模块; 发送模块。方框图如图1 所示。波特率发生器比较接收模块发送模块图 1 UART 模块组成三、 模块设计1. 顶层模块异步收发器的顶层模块由波特率发生器、UART接收和 UART发送器构成。UART 发送器的用途是将准备输出的并行数据按照基本 UART 帧格式转为 TXD 信号串行输出。UART接收器接收 RXD 串行信号, 并将其转化为并行数据。波特率发生器就是专门产生一个远远高于波特率的本地时钟信号对输入 RXD 不断采样, 使接收器与发送器保持同步。电路图如图2所示。2波特率发生器波特率发生器实际上就是一个分频器。可以根据给定的系统时钟频率 (晶振时钟) 和要求的波特率算出波特率分频因子, 算出的波特率分频因子作为分频器的分频数波特率分频因子可以根据不同的应用需要更改。本设计有三档,通sel1.0端口选择,模式一为1200b/s,模式二9600b/s,为模式三为19200b/s。3UART接收器由于串行数据帧和接收时钟是异步的, 由逻辑 1 转为逻辑0 可以被视为一个数据帧的起始位。然而, 为了避免毛刺影响, 能够得到正确的起始位信号, 必须要求接收到的起始位在波特率时钟采样的过程中至少有一半都是属于逻辑0 才可认定接收到的是起始位。由于内部采样时钟bclk 周期 (由波特率发生器产生) 是发送或接收波特率时钟频率的16 倍, 所以起始位需要至少 8 个连续 bclk 周期的逻辑0 被接收到, 才认为起始位接收到, 接着数据位和奇偶校验位将每隔16 个 bclk 周期被采样一次 (即每一个波特率时钟被采样一次) 。如果起始位的确是16 个 bclk 周期长, 那么接下来的数据将在每个位的中点处被采样。UART接收器的接收状态机如图3所示。R_STARTR_STOPR_CENTERR_SAMPLER_WAITRXD_SYNC=0RXD_SYNC=1count=”0100”AND RXD_SYNC=”0”count=1110 ANDrcnt=1011count=”1110”AND rcnt”1010”图3 UART接收器的接收状态机UART接收器的状态机一共有5 个状态:1) R_START(等待起始位) 状态当 UART接收器复位后, 接收状态机将处于这一个状态。在此状态, 状态机一直在等待 RXD的电平跳转, 从逻辑1 变为逻辑0 , 即起始位, 这意味着新的一帧 UART 数据帧的开始, 一旦起始位被确定, 状态机将转入 R_CENTER状态。图 3 中的RXD_ SYNC信号是 RXD 的同步信号, 因为在进行逻辑1或逻辑0 判断时, 不希望检测的信号是不稳定的, 所以不直接检测 RXD信号, 而是检测经过同步后的 RXD_ SYNC信号。2) R_CENTER(求中点) 状态 对于异步串行信号,为了使每一次都检测到正确的位信号, 而且在较后的数据位检测时累计误差较小, 显然在每位的中点检测是最为理想的。在本状态, 就是由起始位求出每位的中点, 通过对bclk 的个数进行计数 ( count) , 但计数值不是想当然的“1000” , 要考虑经过一个状态, 也即经过了一个 bclk周期, 所希望得到的是在采样时 1/ 2 位。另外, 可能在R_START状态检测到的起始位不是真正的起始位, 可能是一个偶然出现的干扰尖脉冲 (负脉冲) 。这种干扰脉冲的周期是很短的, 所以可以认为保持逻辑0 超过1/ 4 个位时间的信号一定是起始位。3) R_WAIT(等待采样) 状态当状态机处于这一状态, 等待计满15 个bclk , 在第16 个bclk 是进入R_SAMPLE状态进行数据位的采样检测, 同时也判断是否采集的数据位长度已达到数据帧的长度, 如果到来, 就说明停止位来临了。数据帧的长度在设计时是可更改的, 在本设计中默认为9 , 即对应的UART工作在8 位数据位和校验位格式。4) R_SAMPLE(采样) 状态即数据位采样检测, 完成后无条件状态机转入 R_WAIT状态, 等待下次数据位的到来。5) R_STOP状态 (停止位接收)无论停止位是1 位还是1.5 位, 或是2 位, 状态机在R_STOP不具体检测RXD ,只是输出帧接收完毕信号 (REC_ DONE=1 ) , 停止位后状态机转回到 R_START状态, 等待下一个帧的起始位。4UART发送器发送器只要每隔16个 bclk 周期输出 1位数据即可,次序遵循第1 位是起始位, 第8位是校验位,第9位是停止位。在本设计中加入校验位, 停止位是固定的1 位格式。发送状态机的状态图如图4所示。X_IDLEX_STOPX_STARTX_SHIFTX_WAITXMIT_CMD_P=1XCNT16=”01111”RCNT16=”01110”AND XBITCNT”1001”RCNT16=”01110”AND XEITCNT=”1001”XCNT16=”01111”AND XMIT_CMD_P=0图4 发送状态机的状态图发送状态机一共有5 个状态:1) X_ IDLE (空闲) 状态当 UART被复位信号复位后,状态机将立刻进入这一状态。UART的发送器一直在等待一个数据帧发送命令 XMIT_ CMD。XMIT_ CMD_ P信号是对 XMIT_ CMD 的处理, XMIT_CMD_P 是一个短脉冲信号。XMIT_ CMD 进行了脉冲宽度的限定, 当 XMIT_CMD_ P =1 ,状态机转入 X_ START , 准备发送起始位。2) X_ START (起始位) 状态 在这个状态下, UART的发送器一个位时间宽度的逻辑 0 信号至 TXD , 即起始位。紧接着状态机转入 X_ WAIT 状态。XCNT16 是 bclk的计数器。3) X_ WAIT (移位等待) 状态 同 UART 接收状态机中的 R_ WAIT状态类似。4) X_ SHIFT (移位) 状态当状态机处于这一状态时, 实现待发数据的并串转换。转换完成立即回到 X_ WAIT状态。5) X_ STOP (停止位) 状态停止位发送状态, 当数据帧发送完毕, 状态机转入该状态, 并发送 16 个 bclk 周期的逻辑1 信号, 即1 位停止位。状态机送完停止位后回到X_ IDL E状态, 并等待另一个数据帧的发送命令。四、 程序设计与仿真1. 顶层设计(1) 原理图(2) 仿真结果(见附图)2. 波特率发生器程序与仿真(1) 波特率发生器VHDL程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity baud isport(clk,reset:in std_logic; -假设外部时钟是固定的12Mhz sel:in std_logic_vector(1 downto 0); -对应波特率1200,bclk=19200hz - 9600,bclk=153600 - 19200,bclk=307200bclk:out std_logic);end;architecture behav of baud issignal bclkreg:std_logic;beginprocess(clk,reset)variable div_clk:integer;beginif reset=1 then -reset the systemdiv_clk:=0;bclk -rb=1200 baudif div_clk=624 THENdiv_clk:=0;bclkreg -rb=9600 baudif div_clk=77 THENdiv_clk:=0;bclkreg -rb=19200 baudif div_clk=38 THENdiv_clk:=0;bclkregif div_clk=77 THEN div_clk:=0;bclkreg= not bclkreg;else div_clk:=div_clk+1;end if;end case;bclk=bclkreg;end if;end process;end architecture;(2) 程序仿真3. UART发送器程序与仿真(1) UART发送器VHDL程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity transfer isport(bclkt,resett,xmit_cmd_p:in std_logic;txdbuf:in std_logic_vector(7 downto 0); -待发送数据入口txd:out std_logic; -数据串行输出口txd_done:out std_logic); -发送完成标记end;architecture bagav of transfer istype states is(x_idle,x_start,x_wait,x_shift,x_stop); -5个状态signal state:states:=x_idle;beginprocess(bclkt,resett,xmit_cmd_p,txdbuf)variable xparity,even:std_logic;variable xcnt16:std_logic_vector(4 downto 0):=00000;variable xbitcnt:std_logic_vector(3 downto 0):=0000;variable txds:std_logic_vector(8 downto 0):=000000000;beginif resett=1 then state=x_idle;txd_done=0;txd -x_idle 状态,等待发送命令if xmit_cmd_p=1 then txd_done=0;state=x_start;even:=0;for i in txdbufrange loop if txdbuf(i)=1 then even:=not even; end if;end loop;xparity:=even; txds:=txdbuf(7 downto 0) & xparity; -数据位并偶校验位赋予发送缓存else state -x_start 状态,发出起始位,发送周期为机器周期的16倍 if xcnt16=01111 then state=x_wait;xcnt16:=00000;else xcnt16:=xcnt16+1;txd=0;state -wait stateIf xcnt16=01110then -14 clock 后 ,状态转向x_shift状态if xbitcnt=1001 then txd_done=1;state=x_stop;xbitcnt:=0000; -发送完成标记,并复位 else state=x_shift;end if;xcnt16:=00000;else xcnt16:=xcnt16+1;state -一位一位的发送数据位(8个数据位+1个偶校验位) txd=txds(8); txds:= txds(7 downto 0) & 0; xbitcnt:=xbitcnt+1; state -发送停止位,持续16个时钟周期if xcnt16=01111 then if xmit_cmd_p=0 then state=x_idle;xcnt16:=00000;else xcnt16:=xcnt16;state=x_stop;end if;txd_done=1;else xcnt16:=xcnt16+1;txd=1;statestate=x_idle;end case;end if;end process;end;(2) 程序仿真4. UART接收器程序与仿真(1) URAT接收器VHDL程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity receiver isport(bclkr,resetr,rxdr:in std_logic; -分别是波特率接收口,复位,串行数据入口 r_ready,err:out std_logic; -分别是接收状态显示,报错显示 rbuf:out std_logic_vector(7 downto 0); -接收到数据,并行出口end receiver;architecture behav of receiver istype states is(r_start,r_center,r_wait,r_sample,r_stop);-状态机定义signal state:states:=r_start;signal rxd_sync:std_logic:=1;signal xparity:std_logic;beginprocess(bclkr,resetr,rxdr)variable rparity,even:std_logic;variable count:std_logic_vector(3 downto 0);variable rcnt:std_logic_vector(3 downto 0);variable rbufs:std_logic_vector(10 downto 0);beginif resetr=1then state=r_start;count:=0000;elsif rising_edge(bclkr)thenrxd_sync -等待起始位到来来if rxd_sync=0then state=r_center;r_ready=0;rcnt:=0000;else state=r_start;r_ready if rxd_sync=0then if count=1000then state=r_wait;count:=0000; -采样取中间值 else count:=count+1;state=r_center; end if; else state if count=1110then if rcnt=1011 then -判断是否接收完一帧的数据 state=r_stop; else state=r_sample; end if; count:=0000; else count:=count+1;state rbufs:= rbufs(9 downto 0) & rxd_sync; -读入一位数据 rcnt:=rcnt+1;state xparity=rbufs(0); -储存发送来的偶校验位 even:=0; -初始化even变量,开始检验收到的数据,获得其偶校验位for i in 9 downto 2 loop if rbufs(i)=1 then even:=not even; end if;end loop;rparity:=even;r_ready=1;rbuf=rbufs(9 downto 2); state=r_start;if rparity=xparity then -比较偶校验位的值,出错时err=1err=0;el
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年上海中医药大学附属闵行晶城中学编外教师招聘考试参考试题及答案解析
- 2025河南郑州市郑东新区龙源小学招聘语文数学体育学科教师若干名考试参考试题及答案解析
- 2025年蚌埠市12345政务服务便民热线岗位招聘20名考试参考试题及答案解析
- 工具采购合同范本
- 股权分配拟合同范本
- 2025年药学专业药物配伍禁忌知识测试答案及解析
- 2025年全科医生全科诊疗实践操作答案及解析
- 2025中国能建葛洲坝二公司成熟人才招聘4人(湖北)备考练习试题及答案解析
- 代理办理证照合同范本
- 医药附加协议合同范本
- 海天注塑机全参数DOC资料全
- Test Plan Template:测试计划模板
- (完整版)三年级下册数学开学第一课ppt
- 苏教版四年级科学上册全册课件
- JJF1101-2019环境试验设备温度、湿度校准规范-(高清现行)
- 人教版新教材高中物理实验汇总及答案详解
- 中班语言《大狮子和小老鼠》课件
- TSG11-2020 锅炉安全技术规程
- 资助业务工作培训
- 《足球运动发展史》PPT课件
- IPQAM调制器操作说明书(共36页)
评论
0/150
提交评论