基于fpga的数据采集卡内容摘要:

WHEN 0010 = 发送第 2 位 IF (clkbaud_tras = 39。 139。 ) THEN txd_reg = txd_buf(0)。 txd_buf(6 DOWNTO 0) = txd_buf(7 DOWNTO 1)。 南昌航空大学学士学位论文 14 state_tras = state_tras + 0001。 END IF。 WHEN 0011 = 发送第 3 位 IF (clkbaud_tras = 39。 139。 ) THEN txd_reg = txd_buf(0)。 txd_buf(6 DOWNTO 0) = txd_buf(7 DOWNTO 1)。 state_tras = state_tras + 0001。 END IF。 WHEN 0100 = 发送第 4 位 IF (clkbaud_tras = 39。 139。 ) THEN txd_reg = txd_buf(0)。 txd_buf(6 DOWNTO 0) = txd_buf(7 DOWNTO 1)。 state_tras = state_tras + 0001。 END IF。 WHEN 0101 = 发送第 5 位 IF (clkbaud_tras = 39。 139。 ) THEN txd_reg = txd_buf(0)。 txd_buf(6 DOWNTO 0) = txd_buf(7 DOWNTO 1)。 state_tras = state_tras + 0001。 END IF。 WHEN 0110 = 发送第 6 位 IF (clkbaud_tras = 39。 139。 ) THEN txd_reg = txd_buf(0)。 txd_buf(6 DOWNTO 0) = txd_buf(7 DOWNTO 1)。 state_tras = state_tras + 0001。 END IF。 WHEN 0111 = 发送第 7 位 南昌航空大学学士学位论文 15 IF (clkbaud_tras = 39。 139。 ) THEN txd_reg = txd_buf(0)。 txd_buf(6 DOWNTO 0) = txd_buf(7 DOWNTO 1)。 state_tras = state_tras + 0001。 END IF。 WHEN 1000 = 发送第 8 位 IF (clkbaud_tras = 39。 139。 ) THEN txd_reg = txd_buf(0)。 txd_buf(6 DOWNTO 0) = txd_buf(7 DOWNTO 1)。 state_tras = state_tras + 0001。 END IF。 WHEN 1001 = 发送停止位 IF (clkbaud_tras = 39。 139。 ) THEN txd_reg = 39。 139。 txd_buf = 01010101。 state_tras=state_tras+0001。 END IF。 when 1111 = IF (clkbaud_tras=39。 139。 ) then state_tras=0000。 trasstart=39。 039。 key_entry2=39。 039。 end if。 WHEN OTHERS= IF (clkbaud_tras=39。 139。 ) then state_tras=state_tras+0001。 南昌航空大学学士学位论文 16 trasstart=39。 139。 END IF。 END CASE。 END IF。 END IF。 END IF。 END PROCESS。 波特率发生模块 设计的 UART 接收和发送按照相同的波特率进行,波特率可以通过接口模块的总线接口进行设置。 UART 收发的每一个数据宽度都是波特率发生器输出的时钟周期的16 倍,即假定当前按照 9600bit/s 进行收发,那么波特率发生器的输出时钟频率应该位 9600*16HZ,目的是为 在接受时进行精确地采样,以提出异步的串行数据。 根据给定的晶振时钟和要求的波特率发生器波特率的分频系数。 假定提供的外部时钟位12MHZ,可以很简单的通过总线写入不同的数值到波特率发生器保持寄存器,然后用计数器的方式生成所需要的各种波特率,即分频器,计算公式为: 12020000/9600*16。 如果希望输出 9600HZ 的波特率,可以得出从总线写入的数值为: 0000000001001110; 波特率发生器的状态机如图 44所示。 图 44 波特率发生器的状态机 实现波特率功能的部分 VHDL 程序如下: 空闲 状态 配置 完毕 复位 完毕 计算时钟分频比 复位首发状态机 复位握手信号线 位时钟计数器清零 配置波特率控制寄存器 起始位 南昌航空大学学士学位论文 17 CONSTANT div_par : std_logic_vector(15 DOWNTO 0) := 0000000001001110。 分频参数,其值由对应的波特率计算而得,按此参数分频的时钟频率是波倍特率的 16 倍,此处值对应 9600 的波特率,即分频出的时钟频率是 9600*16 PROCESS(clk,rst) BEGIN IF (NOT rst = 39。 139。 ) THEN div_reg = 0000000000000000。 ELSIF(clk39。 EVENT AND clk=39。 139。 )THEN IF (div_reg = div_par 0000000000000001) THEN div_reg = 0000000000000000。 ELSE div_reg = div_reg + 0000000000000001。 END IF。 END IF。 END PROCESS。 PROCESS(clk,rst) 分频得到 16倍波特率的时钟 BEGIN IF (NOT rst = 39。 139。 ) THEN clkbaud8x = 39。 039。 ELSIF(clk39。 EVENT AND clk=39。 139。 )THEN IF (div_reg = div_par 0000000000000001) THEN clkbaud8x = NOT clkbaud8x。 END IF。 END IF。 END PROCESS。 UART 接收模块 在异步串行通信中,需要采取有效的措施来避免错误的出现,在找准帧头起始位;选择比较可靠的采集点,确保数据判断的正确。 接收端不断检测线路的状态,若连续为 1后又检测到一个 0,就知道发来一个新字符,应马上准备接受。 所以只需要每个时钟周期都循环检测数据线,当发现数据线南昌航空大学学士学位论文 18 为低电平时就认为找到了起始位,显然这个时刻落后于起始位跃变沿的时间。 要保证异步通信的双方准确无误的交换信息,必须有效控制采集通信线路上电平信号的时 机,根据时机选择恰当的时机能够使系统准确稳定。 如图 35 所示的 D 点是每一数据位周期的中心点,所以一般系统中的 D点是最佳采集时机。 当所用的开发系统的时钟频率和波特率不匹配就容易产生固定的频差。 采用高稳定度的时钟可以将误差缩小,只要流出比较小的余度就可以。 因此,稍微靠近 A 点的 B点和 C 点是最佳采集时期。 采样过程分析 图如图 45所示。 图 45 采样过程分析 在异步串口接受中,帧结构起了至关重要的作用。 如果在数据 帧的结尾第一个停止位的位置抽取到了低电平,说明发生了帧错误。 接受模块的完成上述功能的 VHDL 语句的有限状态机 FSM( finite state machine)流程图如 46 所示。 图 46 接受模块有限状态机 起始位 数据 D0 B C D E F 空闲 状态 数据正 确 停止位确认 起始位确认 起始位有效 采采样数据 虚假起始位 检测到起始位 寄入数据存储器 没有检测到起始位 南昌航空大学学士学位论文 19 程序在侦测到起始位后,计 16个时钟周期,便开始接收数据,移位输入到 rxd_buf中,最后输出数据 seg_data。 实现该功能的部分 VHDL 程序如下: PROCESS(clkbaud8x,rst) 接受 PC 机的数据 BEGIN IF (NOT rst =‘ 139。 ) THEN rxd_reg1 =‘039。 rxd_reg2 =‘039。 rxd_buf = 00000000。 state_rec = 0000。 recstart =‘039。 recstart_tmp =‘039。 ELSE IF(clkbaud8x39。 EVENT AND clkbaud8x =‘139。 ) THEN。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。