用CPLD实现串行通信时的波特率自动侦测

合集下载

基于CPLD的串行通信模块设计

基于CPLD的串行通信模块设计

图 1 发送接收框 图
1 5 ・ 7
维普资讯
第 3 卷 O
0 引 言
串行通信广泛应用于数字通信和控制 系统中 , 通常采 用专用的 UA T( R 通用异步接收发送器) 口芯片 , 接 能够实 现全面的通信功能 , 但其 引脚较多, 体积较大, 与其他器件 接口 复杂, 而很多时候不需要使用完整的串口功能。对于多 串口的设备或需要加密通讯的场合, 使用通用的集成电路也 不是最合适的。如果使用 ( 器件, 可以将所需要的串行 通信接 口 功能集成到 ( 内部, 简化电路, 提高可靠性。
维普资讯
电 子
EU研 R0NNo【 GY H o
第3 O卷 第 1 期
2 0 年 1月 07
基 于 C L 的 串行 通信 模 块 设 计 P D
黄 丽薇
( 南京工业 大学 南京 2 0 0 ) 1 0 9
摘 要 :串行通 信广泛应用于数字通信和控制 系统 中 , 串口通信芯 片引脚 多接 口复杂 , 编程 逻辑 器件 C L 专用 可 P D体 积小 功能强大 。将串 口功能集成在一片 C L 芯片里 , PD 整个系统将 变得 简洁 。本设计 使用逻辑 关系清 晰设计语 言简 练的硬件描述语言 V ro L 将 串行通信核心 功能 集成 到 C L e l HD , ig P D内部 , C L 使 P D成 为串行通 信模 块 , 成 串并收 完 发的功能 。该方法简单快捷 , 易于实现 , 的模块 紧凑 小巧 , 设计 可以作为 串行通信 接 口的标 准模块 接入 到用户 的各种
设计 中。 关键词 : Vei g P D;串行通信 r o ;C L l
中圈分 类号 :1 P1 . 13 1 H 文献标识码 :A

【CN109739772A】一种实现CPLD刷新自动测试的方法和装置【专利】

【CN109739772A】一种实现CPLD刷新自动测试的方法和装置【专利】

权利要求书1页 说明书7页 附图3页
CN 109739772 A
CN 109739772 A
权 利 要 求 书
1/1 页
1 .一种实现CPLD刷新自动测试的方法,其特征在于,包括以下步骤: 步骤s1:获取预刷新次数并定义表示当前刷新次数的变量; 步骤s2:判断当前刷新次数是否等于所述预刷新次数; 步骤s3 :响应于所述当前 刷新次数不等于所述预 刷新次数 ,执行CPLD 刷新指令并保存 刷新日志; 步骤s4:从所述刷新日志中读取关键词; 步骤s5:响应于读取到刷新成功关键词,使当前刷新次数加1并执行CPLD版本查询指令 且返回步骤s3,以及响应于读取到刷新失败关键词,在终端输出当前刷新日志并结束测试; 步骤s6:响应于在步骤s3中所述当前刷新次数等于所述预刷新次数,结束测试。 2 .根据权利要求1所述的方法,其特征在于,所述方法还包括:在执行测试之前,将CPLD 固件和执行所述方法的测试脚本拷贝至BMC系统下,并运行所述测试脚本。 3 .根据权利要求2所述的方法,其特征在于,所述方法还包括:在运行所述测试脚本之 前,通过指令将所述测试脚本权限修改为可读可写可执行权限。 4 .根据权利要求3所述的方法,其特征在于,所述测试脚本为基于shell语言的脚本。 5 .根据权利要求1所述的方法,其特征在于,所述步骤s1包括:从键盘读取用户输入的 所述预刷新次数。 6 .根据权利要求1所述的方法,其特征在于,所述步骤s5包括:响应于读取到刷新成功 关键词,将所述刷新成功关键词和加1后的所述当前刷新次数保存到另一文档中。 7 .根据权利要求6所述的方法,其特征在于,所述步骤s5还包括:执行CPLD版本查询指 令后,将查询到的CPLD版本信息保存到所述另一文档中。 8 .根据权利要求1所述的方法,其特征在于,所述CPLD刷新指令根据编译所产生的可执 行文件而定。 9 .根据权利要求1所述的方法,其特征在于,所述CPLD版本查询指令根据硬件设计电路 而定。 10 .一种实现CPLD刷新自动测试的装置,其特征在于,包括: 至少一个处理器;和 存储器 ,所述存储器存储有处理器可运行的 程 序代码 ,所述程 序代码在被处理器运行 时实施如权利要求1-9中任一项所述的方法。

用vhdl语言在cpld上实现串行通信

用vhdl语言在cpld上实现串行通信

用vhdl语言在cpld上实现串行通信一、概述串行通信是现代通信领域中最为常见的一种通信方式。

通过串行通信,现代社会中的各种设备可以以最高效的方式进行数据传输,实现快速、准确的信息交换。

而vhdl语言则是数字电路设计领域中最为常用的一种描述语言,因为vhdl 语言可以描述数字电路的不同行为,对于数字电路的模拟和仿真非常方便。

在本文中,我们将介绍如何使用vhdl语言在cpld 上实现串行通信。

二、串行通信的基本原理串行通信是指在数据传输过程中,数据位是按照顺序一个一个相继传输的。

串行通信的传输速率相对较慢,但是传输距离远,主要是通过数据信号占用两个或者三个核心线来完成的。

串行通信的数据信号一般由三个部分构成:开始位、数据位和停止位。

开始位一般用于启动数据传输,而停止位则用于结束数据传输。

三、vhdl语言概述VHDL(VHSIC Hardware Description Language)是美国国防工业联合会(VHSIC)在80年代末期为了解决数字电路设计中的复杂性而开发的一种硬件描述语言,是一种基于文本的语言。

VHDL语言主要用来描述数字逻辑和数字电路。

VHDL语言本身就是一种结构化的、层次化的语言,可以很好地体现出数字电路的层次关系。

四、使用vhdl语言在cpld上实现串行通信的步骤1、确定串行通信的传输速率和数据格式。

在确定串行通信的传输速率和数据格式之前,需要确定串行通信的基本参数,包括其传输速率、在接收端进行判定数据是否有效的时间程度、以及在发送端和接收端之间互相传输数据的位数。

这些参数对于后续的设计极为重要。

2、编写串行通信的vhdl模块。

在vhdl模块中,需要包括发送和接收两个部分,分别对应于硬件接口中的发送和接收部分。

发送部分主要是将数据按照规定的格式进行串行传输,而接收部分则主要是将串行传输的数据再转换为并行数据。

3、完成vhdl模块的仿真测试。

在完成vhdl模块的设计之后,需要进行仿真测试,以验证vhdl模块的正确性和稳定性。

51单片机串行通讯中波特率的自动检测

51单片机串行通讯中波特率的自动检测

51 单片机串行通讯中波特率的自动检测本文介绍一种在80C51 串行通讯应用中自动检测波特率的方法。

按照经验,程序起动后所接收到的第1个字符用于测量波特率。

这种方法可以不用设定难于记忆的开关,还可以免去在有关应用中使用多种不同波特率的烦恼。

人们可以设想:一种可靠地实现自动波特检测的方法是可能的,它无须严格限制可被确认的字符。

问题是:在各种的条件下,如何可以在大量允许出现的字符中找出波特率的定时间隔。

显然,最快捷的方法是检测一个单独位时间(single bit time),以确定接收波特率应该是多少。

可是,在RS-232 模式下,许多ASCII 字符并不能测量出一个单独位时间。

对于大多数字符来说,只要波特率存在合理波动(这里的波特率是指标准波特率),从起始位到最后一位“可见”位的数据传输周期就会在一定范围内发生变化。

此外,许多系统采用8 位数据、无奇偶校验的格式传输ASCII 字符。

在这种格式里,普通ASCII 字节不会有MSB 设定,并且,UART总是先发送数据低位(LSB),后发送数据高位(MSB),我们总会看见数据的停止位。

在下面的波特率检测程序中,先等待串行通讯输入管脚的起始信号(下降沿),然后起动定时器T0。

在其后的串行数据的每一个上升沿,将定时器T0的数值捕获并保存。

当定时器T0溢出时,其最后一次捕获的数值即为从串行数据起始位到最后一个上升沿(我们假设是停止位)过程所持续的时间。

CmpTable 表格列出了每一波特率的最大测量时间。

这些数据是经过选择的,所以,4 个数据位时间(加上起始位时间)仍可产生正确的波特率。

使用这种方法时,必须遵守一个假设:这种技术仅取决于所接收到的一个字符,接收这个字符的波特率必须大于最低波特率。

本质上来说,这意味着这个字符必须来自正常敲击键盘时所产生的字符。

在PC上,我们不可能快速、连续地敲击两个字符,以欺骗程序。

但是,PC的功能键具有一个问题,因为它会连续发送两个紧挨着的字符,使程序检测得到错误的波特率。

CPLD的串口电路设计

CPLD的串口电路设计

CPLD的串口电路设计
一、硬件电路设计
本文选用CPLD 是ALTERA 公司的EPM240T100,结合MAX232 接口芯片进行串口通信设计,框图如下图1 所示。

图1 CPLD 串口通信模块硬件设计
二、VHDL 程序模块设计及描述
使用VHDL 对CPLD 进行编程,设计3 个模块,波特率发生模块,接收器,发送器。

1. 波特率发生模块
波特率发生器实际是一个分频器,如前所述,本文设计的波特率为19.2kb/ 秒,设计使用的时钟频率为10MHz,所以计数器进行计数时计数到260 进行翻转。

程序如下(关键部分保留,非必要部分用代替):
ENTITY uart IS
GENERIC(d_len:INteGER:=8);
PORT (
f10MHz:IN STD_LOGIC;-- 系统时钟
reset:IN STD_LOGIC;-- 复位信号
rxd:IN STD_LOGIC; -- 串行接收
txd:OUT STD_LOGIC;-- 串行发送
);
END uart;
ARCHITECTURE behav of uart IS。

基于CPLD设计串行通信的发送与接受

基于CPLD设计串行通信的发送与接受

module wang_js (clk400hz,count);input clk400hz;output[1:0] count;reg[1:0] count;always @(negedge clk400hz)count=count+1'b1;endmodulemodule wang_variable(clk1hz,count,control,out);input clk1hz;input[3:0] control;input[1:0] count;output[3:0] out;reg[3:0] out;reg[3:0] normal;wire[3:0] ck;always @(count)begincase(count)2'b00:normal=4'b0111;2'b01:normal=4'b1011;2'b10:normal=4'b1101;2'b11:normal=4'b1110;endcaseendassign ck=control|normal;always@(clk1hz or ck or normal)begincase(clk1hz)1'b0:out=normal;1'b1:out=ck;endcaseendendmodulemodule wang_4to1(in0,in1,in2,in3,k,out);input[3:0] in0,in1,in2,in3;input[1:0] k;output[3:0] out;reg[3:0] out;always @(k or in0 or in1 or in2 or in3)begincase(k)2'b00:out=in0;2'b01:out=in1;2'b10:out=in2;2'b11:out=in3;endcaseendendmodulemodule wang_show4(in,out);input[3:0] in;output[7:0] out;reg[7:0] out;always @(in)begincase(in)4'b0000:out=8'hc0;4'b0001:out=8'hf9;4'b0010:out=8'ha4;4'b0011:out=8'hb0;4'b0100:out=8'h99;4'b0101:out=8'h92;4'b0110:out=8'h82;4'b0111:out=8'hf8;4'b1000:out=8'h80;4'b1001:out=8'h90;4'b1010:out=8'h88;4'b1011:out=8'h83;4'b1100:out=8'hc6;4'b1101:out=8'ha1;4'b1110:out=8'h86;4'b1111:out=8'hbf;endcaseendendmodulemodule wang_show8(clk1hz,way,k,out);input k;input clk1hz;input[1:0] way;output[7:0] out;reg[7:0] out;reg[7:0] reg_out;wire ck;always@(way)begincase(way)2'b00:reg_out=8'h54;2'b01:reg_out=8'h79;2'b10:reg_out=8'h3f;default:reg_out=8'h00;endcaseendassign ck=k&clk1hz;always@(ck or reg_out)begincase(ck)1'b0:out=reg_out;1'b1:out=8'h00;endcaseendendmodulemodule show(clk400hz,clk1hz,in0,in1,in2,in3,way,k1,k4,out,kout,out8);input k1;input[3:0] k4;input clk400hz,clk1hz;input[3:0] in0,in1,in2,in3;input[1:0] way;output[7:0] out;output[7:0] out8;output[3:0] kout;wire[1:0]count;wire[3:0]out3;wang_js wang_js0(clk400hz,count);wang_variable wang_variable0(clk1hz,count,k4,kout);wang_4to1 wang_4to10(in0,in1,in2,in3,count,out3);wang_show4 wang_show40(out3,out);wang_show8 wang_show80(clk1hz,way,k1,out8);endmodule//显示模块//控制模块module qdd(clk50hz,button,Q);//去抖动模块input clk50hz;input button;output Q;reg Q;always@(negedge clk50hz)Q=button;endmodulemodule yima_shine(in,out);//闪烁控制子的译码input[1:0] in;output[4:0] out;reg[4:0] out;always@(in)begincase(in)2'b00:out=5'b00000;2'b01:out=5'b10000;2'b10:out=5'b01100;2'b11:out=5'b00011;endcaseendendmodulemodule data_assign(count,k3,way,bote,data);//数据分配,通过计数器选择按键的信号分配input[1:0] count;input k3;output[1:0] way,bote,data;reg[1:0] way,bote,data;always@(negedge k3)begincase(count)2'b01:beginif(way==2'b10)way=2'b00;elseway=way+1'b1;end2'b10:bote=bote+1'b1;2'b11:data=data+1'b1;endcaseendendmodulemodule yima_show2(bote,out);//四位数码管的高两位显示的数字input[1:0] bote;output[7:0] out;reg[7:0] out;always@(bote)begincase(bote)2'b00:out=8'b10010110;//选择波特率为96002'b01:out=8'b01001000;//选择波特率为48002'b10:out=8'b00100100;//选择波特率为24002'b11:out=8'b00010010;//选择波特率为1200 endcaseendendmodulemodule yima_show0(data,out);//四位数码管的低一位显示的数字input[1:0] data;output[3:0] out;reg[3:0] out;always@(data)begincase(data)2'b00:out=4'b1000;//选择数据位为82'b01:out=4'b0111;//选择数据位为72'b10:out=4'b0110;//选择数据位为62'b11:out=4'b0101;//选择数据位为5endcaseendendmodulemodule control(clk50hz,K2,K3,enable,shine,way,bote,show2,data,show0,show);input K2,K3,clk50hz;output enable;output[4:0] shine;output[1:0] way,bote,data;output[7:0] show2;output[3:0] show,show0;wire[1:0] count;wire k2,k3;qdd qdd2(clk50hz,K2,k2);qdd qdd3(clk50hz,K3,k3);wang_js js(k2,count);yima_shine yima_shine1(count,shine);data_assign data_assign1(count,k3,way,bote,data);yima_show2 yima_show21(bote,show2);yima_show0 yima_show01(data,show0);assign enable=~(|count);assign show=4'b1111;endmodule//控制模块//时钟信号分频模块module clock_fp1(in,out);//分频的到clk28800hz信号input in;output out;reg out;reg[8:0] count;always@(negedge in)beginif(count==9'h1a0)begincount=9'h000;out=~out;endelsecount=count+1'b1;endendmodulemodule clock_fp2(in,out);//得到clk400hzinput in;output out;reg out;reg[14:0] count;always@(negedge in)beginif(count==15'h7530)begincount=15'h0000;out=~out;endelsecount=count+1'b1;endendmodulemodule clock_fp3(in,out);//得到clk1000hzinput in;output out;reg out;reg[13:0] count;always@(negedge in)beginif(count==14'h2ee0)begincount=14'h0000;out=~out;endelsecount=count+1'b1;endendmodulemodule clock_2(in,out);//将输入的信号进行二分频input in;output out;reg out;always@(negedge in)out=~out;endmodulemodule clock_3(in,out);input in;output out;reg[1:0] count;always@(negedge in)beginif(count==2'b10)count=2'b00;elsecount=count+1'b1;endassign out=count[1]; endmodulemodule clock_8(in,out);input in;output out;reg out;reg[1:0] count;always@(negedge in)begincount=count+1'b1;if(count==2'b11)out=~out;endendmodulemodule clock_50(in,out);input in;output out;reg out;reg[4:0] count;always@(negedge in)beginif(count==5'h19)begincount=5'h00;out=~out;endelsecount=count+1'b1;endendmodulemoduleclock_bote(bote,clk288hz,clk144hz,clk72hz,clk36hz,clk96hz,clk48hz,clk24hz,clk12hz,clk_send,cl k_receive);input[1:0] bote;input clk288hz,clk144hz,clk72hz,clk36hz,clk96hz,clk48hz,clk24hz,clk12hz;output clk_send,clk_receive;reg clk_send,clk_receive;always@(bote or clk288hz or clk144hz or clk72hz or clk36hz or clk96hz or clk48hz or clk24hz or clk12hz)begincase(bote)2'b00:beginclk_receive=clk288hz;clk_send=clk96hz;end2'b01:beginclk_receive=clk144hz;clk_send=clk48hz;end2'b10:beginclk_receive=clk72hz;clk_send=clk24hz;end2'b11:beginclk_receive=clk36hz;clk_send=clk12hz;endendcaseendendmodulemodule clock(clk,bote,clk_send,clk_receive,clk1hz,clk50hz,clk1khz,clk400hz);input clk;input[1:0] bote;output clk_send,clk_receive,clk1hz,clk50hz,clk1khz,clk400hz;wire clk288hz,clk144hz,clk72hz,clk36hz,clk96hz,clk48hz,clk24hz,clk12hz;clock_fp1 clock_fp11(clk,clk288hz);clock_3 clock_31(clk288hz,clk96hz);clock_2 clock_21(clk288hz,clk144hz);clock_2 clock_22(clk144hz,clk72hz);clock_2 clock_23(clk72hz,clk36hz);clock_2 clock_24(clk96hz,clk48hz);clock_2 clock_25(clk48hz,clk24hz);clock_2 clock_26(clk24hz,clk12hz);clock_boteclock_bote(bote,clk288hz,clk144hz,clk72hz,clk36hz,clk96hz,clk48hz,clk24hz,clk12hz,clk_send,cl k_receive);clock_fp2 clock_fp21(clk,clk400hz);clock_8 clock_81(clk400hz,clk50hz);clock_50 clock_501(clk50hz,clk1hz);clock_fp3 clock_fp31(clk,clk1khz);endmodulemodule move_11(clk,Q,key,txd);input clk;input[8:0] key;input Q;output txd;reg[10:0] send_reg;always@ (negedge clk)beginif(Q==1'b0)send_reg[10:1]={key,1'b0};elsesend_reg[10:0]={1'b1,send_reg[10:1]};endassign txd=send_reg[0];endmodulemodule send_chioce(odd,eve,way,w);input odd,eve;input[1:0] way;output w;reg w;always @(way or odd or eve)begincase (way)2'b00: w=1'b1;2'b01: w=eve;2'b10: w=odd;2'b11: w=1'b1;endcaseendendmodulemodule send_yima1(data,key3,k3);input[1:0] data;input[2:0] key3;output[2:0] k3;reg[2:0] k3;always @(data or key3)begincase(data)2'b00:k3=key3;2'b01:k3={1'b0,key3[1:0]};2'b10:k3={2'b00,key3[0]};2'b11:k3=3'b000;endcaseendendmodulemodule send_yima2(data,k3,w,high4);input[1:0] data;input[2:0] k3;input w;output[3:0] high4;reg[3:0] high4;always @(data or k3 or w)begincase(data)2'b00:high4={w,k3};2'b01:high4={1'b1,w,k3[1:0]};2'b10:high4={2'b11,w,k3[0]};2'b11:high4={3'b111,w};endcaseendendmodulemodule send_control(key,way,data,enable,clk_send,clk,last_key);input[1:0] data,way;input[7:0] key;input clk_send,enable;output[8:0] last_key;output clk;wire[2:0] k3;wire odd,eve,w;assign clk=clk_send & enable;assign odd=^{k3,key[4:0]};assign eve=~odd;send_chioce chioce(odd,eve,way,w);send_yima1 yima1(data,key[7:5],k3);send_yima2 yima2(data,k3,w,last_key[8:5]);assign last_key[8:0]={last_key[8:5],key[4:0]};endmodulemodule send(clk50hz,clk_send,enable,way,data,key,K1,txd);input clk_send,clk50hz,enable;input[1:0] way,data;input[7:0] key;input K1;output txd;wire Q,clk;wire[8:0] last_key;qdd qdda(clk50hz,K1,Q);send_control control(key,way,data,enable,clk_send,clk,last_key);move_11 move_111(clk,Q,last_key,txd);endmodulemodule receive_yiwei3(clk_3,in,out3,first);//三位移位寄存器灯鹗夹藕?input clk_3,in;output [2:0]out3;output first;wire [2:0]out3;reg [2:0]m;always@(negedge clk_3)beginm[2:0]={in,m[2:1]};endassign out3=m;assign first=m[1]|m[0];endmodulemodule receive_panduo(in,out);//判多模块input[2:0] in;output out;reg out;always@(in)begincase(in)3'b000:out=1'b0;3'b001:out=1'b0;3'b010:out=1'b0;3'b100:out=1'b0;3'b011:out=1'b1;3'b101:out=1'b1;3'b110:out=1'b1;3'b111:out=1'b1;endcaseendendmodulemodule receive_yiwei10(clk,in,move);//十为移位寄存器input clk;input in;output[9:0] move;reg[9:0] m;always@(negedge clk)beginm[9:0]={in,m[9:1]};endassign move=m;endmodulemodule way_chioce(way,eve,odd,out);input[1:0] way;input eve,odd;output out;reg out;always@(way or eve or odd)begincase(way)2'b00:out=1'b1;2'b01:out=eve;2'b10:out=odd;default: out=1'b1;endcaseendendmodulemodule led_chioce(xinhao,way,led);input[8:0] xinhao;input[1:0] way;output[7:0] led;reg[7:0] led_reg;wire w;assign w=^way;always@(xinhao or w)beginif(w==1'b1)led_reg=xinhao[8:1];elseled_reg=xinhao[7:0];endassign led=~led_reg;endmodulemodule receive_yima(data,way,weik,pb);input [1:0] data,way;output[3:0] weik,pb;reg[3:0] weik,pb;wire w;assign w=^way;always@(w or data)begincase({w,data[1:0]})3'b100:beginweik=4'b1101;pb=4'b1110;end3'b000:beginweik=4'b1111;pb=4'b1111;end3'b101:beginweik=4'b1100;pb=4'b1100;end3'b001:beginweik=4'b1101;pb=4'b1110;end3'b110:beginweik=4'b0100;pb=4'b1000;end3'b010:beginweik=4'b1100;pb=4'b1100;end3'b111:beginweik=4'b0101;pb=4'b0000;end3'b011:beginweik=4'b0100;pb=4'b1000;endendcaseendendmodulemodule receive_geleima(in,clk,weik,b);input in,clk;input[3:0] weik;output b;reg [3:0]out4;always@(negedge clk or negedge in)beginbeginif(in==0) //当r为0时,让计数器置一out4=4'b0001;else if(weik==out4)out4=4'b0000;elsebegincase(out4) //否则进行计数器进行加一4'b0001:out4=4'b0011;4'b0011:out4=4'b0010;4'b0010:out4=4'b0110;4'b0110:out4=4'b0111;4'b0111:out4=4'b0101;4'b0101:out4=4'b0100;4'b0100:out4=4'b1100;4'b1100:out4=4'b1101;4'b1101:out4=4'b1111;default:out4=4'b0000;endcaseendendendassign b=|out4;endmodulemodule receive_control(clk1khz,enable,clk_receive,first,data,way,move,clk_3,clk,led,buzzout);input clk1khz,clk_receive,first,enable;input[1:0] data,way;input[9:0] move;output clk_3,clk;output[7:0] led;output buzzout;wire a,b,m,n,out,in,y;wire[3:0] weik,pb,low4;wire[8:0] xinhao;assign clk_3=enable&clk_receive;assign a=clk_3&b;assign in=first|b;clock_3 clock_receive(a,clk);receive_yima yima(data,way,weik,pb);receive_geleima geleima(in,clk,weik,b);assign low4[3:0]=move[3:0]&pb;assign xinhao[8:0]={move[8:4],low4[3:0]};assign m=^xinhao;assign n=~a;way_chioce chioce(way,n,m,out);assign y=out&move[9];assign buzzout=y|b|clk1khz;led_chioce led_chioce(xinhao,way,led);endmodulemodule receive(clk1khz,clk_receive,enable,way,data,rxd,buzzout,led);input clk1khz,clk_receive,enable,rxd;input[1:0] way,data;output buzzout;output[7:0] led;wire clk_3,clk;wire[2:0] out3;wire first,out;wire[9:0] move;receive_yiwei3 yiwei3(clk_3,rxd,out3,first);receive_panduo panduo(out3,out);receive_yiwei10 yiwei10(clk,out,move);receive_controlcontrol(clk1khz,enable,clk_receive,first,data,way,move,clk_3,clk,led,buzzout); endmodulemodule wang(clk,K1,K2,K3,rxd,key,buzzout,led,txd,wout,out_4,out_1);input clk,K1,K2,K3,rxd;input[7:0] key;output buzzout,txd;output[7:0] led;output[3:0] wout;output[7:0] out_4,out_1;wire[1:0] bote,data,way;wire[4:0] shine;wire clk_receive,clk_send,clk1khz,clk1hz,clk50hz,clk400hz;wire enable;wire[7:0] show2;wire[3:0] show0,show;control control1(clk50hz,K2,K3,enable,shine,way,bote,show2,data,show0,show);clock clock1(clk,bote,clk_send,clk_receive,clk1hz,clk50hz,clk1khz,clk400hz);send send1(clk50hz,clk_send,enable,way,data,key,K1,txd);receive receive1(clk1khz,clk_receive,enable,way,data,rxd,buzzout,led);showshow1(clk400hz,clk1hz,show2[7:4],show2[3:0],show,show0,way,shine[4],shine[3:0],out_4,wout,o ut_1);endmodule。

串行编码检测器的原理及其CPLD硬件实现

串行编码检测器的原理及其CPLD硬件实现

入信 号 加 以记 忆 ,需 记 忆 的 信 号为 1 1 l l … ,0,O ,
1 10 1X 等 1 .收到各佗 有效 编码 的状 态记 为 0 111 0种 T作状 态 S, i此外 , 还要再 加 上其 他非编码 状态 ( 包括 初始状 态统计为 一种 ) 检码器 一共有 l 种 状态 显 . 1
论 了 串行 编码检 测嚣 的分析 手段 、 计方 法 、 设 注意事 项。最后 给 出了使 用 C L 器件 完成的 一种 串行 PD
编码 检测 器的具 体 实现 , 并添 附 A E — L语 言源代码 。本 文对 同类谩 计具 有一定 的理论 和 实践 参 B L HD
考价 值 关 键词 :CDMA;串行编 码 ;状 态机 :CP D L
望码元 , 迁移到 下一个有 效状 态 , 为非 期望码 元 , 则 若
算 字编码 , 特定 串行编 码序列 的检 出称为 串行编 码 对一 机



_ 一
第 宽 的要 求 , 发送 端要 对 原始 信 号 ( 元 ) 行编 码 、 在 码 进
多 位量 化处理 、 冲整形 。 脉 接受 端则要 通过 时钟 同步 ,
现 计
代 2 原理 说 明
串行 编码 就是 由 0 1 成 的脉 冲 序列 构成 的数 、组 检 测器技 术 。
在状态迁移法 中, 状态机先处于待机状态 , 等待
接 受 信号 输 入 。 接 收 到前 导信 号 ( 常是 一 串 “ ” 在 通 0 之后接 一 个 … ’ 变 ) , 入初 始有 效状 态 , 后 在 1跳 后 进 随 接 受到每 一位码 元 , 比较器 将其 与已知 的要 求序列码 元 比较 , 决定状 态机 的迁移 状态 。如果 接收码 元为期

基于CPLD的RS485通信实现方法研究

基于CPLD的RS485通信实现方法研究

基于CPLD的RS485通信实现方法研究殷忠诚,郝华重庆通信学院基础部,重庆(400035)摘要:本文对基于CPLD的RS485通信实现方法进行了研究,并通过测试给出了相关实现方法的可靠性。

关键词:CPLD,RS485,串行通信1. 引言串行通信作为一种常用的通信手段,具有使用方便,编程简单等特点。

其中的RS422和RS485广泛地用于设备分布范围较广的系统的控制和数据传输,比如在工业生产、智能楼宇和安防系统中。

同时,随着电子技术的发展,CPLD器件由于具有灵活、保密、方便、快速等特点而广泛地使用到各种设备之中,并在一定程度上取代了部分以前由单片机所承担的功能。

例如在某些由CPLD构成的系统中,各功能单元和设备可能需要和上位机(PC机)之间进行数据交换和信息传递,可采用RS485进行通信,显然,如果能充分利用CPLD剩余的资源而不增加其它控制器件(如单片机)来完成通信可以带来节约成本等好处。

针对此类应用,本文主要就基于CPLD的RS485通信作一些探讨。

2. 硬件结构硬件结构如图1所示。

由于RS485信号是差分信号[1],而CPLD的输入输出是TTL电平信号,因此用国家半导体(National Semiconductor)出产的DS75176实现差分信号与电平信号的相互转换,同时实现将本设备与信号总线的隔离,完成RS485的一对多的双向通信功能。

CPLD采用Xilinx的XC9572XL。

图1 系统与RS485相关的电路图3. 系统方案3.1 异步串行信号的帧格式及波特率选择图3 CPLD 内部模块图RS485来源于RS232,它们采用相同的帧结构。

一般由起始位、数据位和停止位组成[2]。

起始位用一位的“0”表示,数据位由5到8位数据组成,然后由一位到两位“1”表示停止位。

有时可带一位奇偶校验位。

其帧结构如图2所示。

数据的MSB 到LSB 从右到左排列,即先收到的是LSB 。

数据的波特率根据需要设定。

利用VHDL在CPLD上实现串口通信

利用VHDL在CPLD上实现串口通信

学校名字University电子信息科学与技术专业本科生专题设计报告学校徽标题目利用VHDL在CPLD上实现串口通信专业电子信息工程学生姓名年级 2008级班级 5班指导教师职称年月日内容摘要:随着EDA技术得发展,CPLD已经在许多方面得到了广泛应用,而串行通信是实现远程测控的重要手段。

本文利用VHDL语言在CPLD上实现了串行通信,完全可以脱离单片机使用,克服了单片机的许多缺点。

本设计采用的是异步通信的方式,输入端口有一个时钟信号和一个8位的数据端口,输出端也是一个8位数据端口。

输入数据为8位的ASCII码,为了对数据传输速度进行正确控制于(9.6kb/s~64kb/s),选取发送每个二进制位数据用4个时钟周期,那么传送8个二进制位(既1B)需要32个时钟周期,传送1K则需要4*8*1024个时钟周期,当选取1000kHz位时钟信号时,传送速度大约为30.52kb/s。

8位数据可为0到F的十六进制数据,传人的ASCII码最后通过转换为BCD 码,可把0到F的十六进制数据显示在数码管上。

目录摘要 (2)设计要求 (4)1 选题背景 (4)2 方案论证 (4)1.1 方案1 (4)1.2 方案2 (4)3 设计过程及原理 (5)4 模块设计及仿真 (5)4.1 顶层文件的设计 (5)4.2 4进制计数器count4的设计 (6)4.3 8进制计数器count8的设计 (6)4.4 数据接收模块reg1的设计 (7)4.5 数据锁存器reg的设计 (8)4.6 数据发送模块reg2的设计 (9)4.7 ASCII码转换模块tobcd的设计 (9)5 结束语 (11)6 致谢 (11)附:组员工作安排如下:组长: ---- 系统整体设计及报告整理组员: ---- 4进制计数器与8进制计数器设计---- 数据接收模块reg1的设计---- 数据发送模块reg2的设计---- 数据锁存器及BCD转换模块的设计设计要求:异步通信方式;通过修改发送(接收)每一位的时间来控制波特率(9.6kb/s~64kb/s);并将接受到的数据(或者字符串)显示出来。

单片机串行通信波特率的自适应实现方法

单片机串行通信波特率的自适应实现方法

摘要:串行数据通信是各种单片机多机应用系统和开发系统中不可或缺的功能,而如何实现通信双方速率的匹配极为重要。

文中提出了一种由从机自动适应主机波特率的新方法,此法方便实用,握手时间快。

此方法成功地应用于SST89C54/58构成的IAP编程系统中,同样也适用于各种类型的单片机系统。

关键词:串行通信;波特率;自适应;SST89C54/58;IAP;在串行异步通信中,目前实现波特率自动检测并适应的设计思想有多种,可是他们或者需要额外的硬件支持,或者实现时方法繁杂且软件开销大。

文章介绍了一种简单可靠的用软件实现波特率自动适应的方法,并给出了仿真调试电路原理图,给出了同步程序的详细框图。

该方法提高了波特率解调的便捷性和兼容性。

1 仿真电路SST89C54/58单片机是MCS-51系列单片机的派生产品,他们在指令系统、硬件结构和片内资源上与标准8052单片机完全兼容。

实际上 SST公司的SST89C54/58是一款使用非常方便51系列单片机,如不考虑其看门狗定时器和内部Flash程序存储器,可以将其看成是一个可在线编程的标准8052单片机。

图1为实现串行通信仿真调试硬件原理图,这是一个通用的串行通信接口电路,INT0脚用来启动从机同步适应。

同步建立后的数据传送过程中外部中断0被禁止,而一批数据传送完毕后进入待机监控状态时则开放外中断。

2 波特率自适应实现原理2.1 波特率对于8052单片机,串行通信用定时器1或定时器2作波特率发生器,波特率取决于他们的溢出率。

当串行口在工作方式1,3,用定时器1作波特率发生器时,则波特率计算如下:当定时器1工作方式2时,n=8,X为定时器1初值。

当定时器1工作方式1时,n=16,X为定时器1初值。

若用定时器2作波特率发生器时,则波特率计算公式如下:其中:X为定时器2的初值。

2.2 波特率自适应原理主机端要求和从机建立通信时,先发送同步字符80H,从机根据此同步字符来计算当前的通信速率,并设置此值为本从机的波特率,从而完成通信速率的自适应。

CPLD与单片机串行通信

CPLD与单片机串行通信

CPLD与单片机串行通信一、实验目的1、了解单片机串口的构成及原理。

2、掌握单片机串口数据接收和发送原则。

3、掌握UART设计方法。

4、掌握用定时/ 计数器设置波特率的方法。

5、掌握EDA自顶向下的设计方法。

二、实验任务通过VHDL语言和C51语言的编程,设计完成CPLD和AT89S51(AT89S52)的串行通信,首先让单片机处于串行发送状态,单片机每一秒向CPLD发送八位数码管阳码从0--9,CPLD进行接受并送显示,让数码管一秒显示一个数字,当显示显示到9后,单片机停止发送,CPLD自动的转向发送状态向单片机发送LCD12232F所能识别的液晶码,每0.1秒发送一次,单片机接受并送显示,每0.1秒显示一个字符,每0.2秒显示一个汉字,使液晶的第一行显示“串口通信成功”。

三、实验原理1、简易通用异步收发机(UART)设计原理:(1)首先是是波特率的设置,由于单片机选择1模式可以设置的最大波特率是62.5kHz,所以CPLD的波特率也是设置此值,并采用此波特率的4倍250kHz进行采样并判断.采样的原则,进行4次的采样,如果中间两位是一致的,就认定此值为正确的可以接收;否则丢弃,重新采样。

再采样之前要对单片机发来的信号进行同步平滑处理,消除毛刺,使用于采样的信号更加的稳定。

采样可以采用16倍采样,这样采样更加的精确,在此为了节省硬件资源所以采用4倍采样。

(2)无论接收还是发送对是采用的循环结构,每发送完8位数据就重新回到发送其实点,重新赋初值进行下一轮的发送,直到发送完成。

接收时,也一样接收8位,回到起点重新接收下8位,依次循环接收。

(3)由于采用4倍速率的接受(发送)方式,因此在拨特率一致方面要特别注意,每一次状态转换也要一个时钟周期,一定要计算在内,这样才能使拨特率完全同步。

2、单片机串口设置原理:四、实验模块电路图及引脚分配1、CPLD模块电路图:2、单片机模块电路图:3、LCD12232F模块电路图:4、数码管模块电路图:5、引脚分配:五、实验步骤六、实验程序。

串行通信波特率的自动检测方法-电子开发网

串行通信波特率的自动检测方法-电子开发网

图1 回车符的位序列
串行通信中一个二进制位的传输时间(记为T)取决于通信的波特率,9600波特时一个 二进制位的传输 时间是19200波特时一个二进制位传输时间的两倍,即:2*T19200=T 9600。因此,9600波特时一个位的传 输时间,19200波特时可以传输两个位。同样地,9600波特传输两个位的时间在4800波特时只能传送一个 位。主机设定接收波特率为9600,终端只有也以9600波特发送的字符,主机才能正确地接收。发送波特率高 于或低于9600都会使主机接收到的字符发生错误。接收波特率为9600,终端以不同的波特率发送回车符时, 主 机接收到的二进制序列如表1所示。 从表1中可以看出,除了19200和1800波特时两种特例情况,其他情形的二进制序列都是 9600波特时二 进制序列的变换。取前十个二进制位与9600波特时的二进制位相对应。忽略缺少停止位‘1’引发的数据帧错 误,把接收到的字符表示成字节方式(如表1的最右列所示)。例如:在发送速率为1200波特,接收速率为 9600波特时,主机得到的字节是0x80,而不是正确的回车符0x0D。因为在不同的发送速率下(9600, 4800,2400,1200)得到的字节不同,所以通过接收字符的判定就可以确定发送波特率。 发送波特率为19200时,其发送速度正好是接收速度(9600波特)的两倍,因此发送端 的两个二进制位 会被接收端看作一个。取决于不同的串行接口硬件,‘01’和‘10’这两种二进制位组合可能被认为是‘1’或者‘0’。 幸运的是,只有0~4位存在这样的歧义问题,后面的位因为都是停止位,所以都是‘1’。因此,发送速率为 19200波特时接收到的字符其高半个字节为0xF。低半个字节可能是多个值中的一个,但不会是0x0,因为 0x0D中有相邻 的两个‘1’,这就会至少在低半个字节中产生一个‘1’。因此,整个字节的形式为0xF?, 且低半 个字节不为0。

用VHDL语言在CPLD上实现串行通信1

用VHDL语言在CPLD上实现串行通信1

用VHDL语言在CPLD上实现串行通信引言随着EDA技术得发展,CPLD已经在许多方面得到了广泛应用,而串行通信是实现远程测控的重要手段。

本文利用VHDL语言在CPLD上实现了串行通信,完全可以脱离单片机使用,克服了单片机的许多缺点。

串口结构及内容本设计所采用的是异步通信方式,可以规定传输的一个数据是10位,其中最低位为启动位(逻辑0低电平),最高位为停止位(逻辑1高电平),中间8位是数据位。

为了方便对数据进行正确控制,选取发送(接受)每位数据用4个时钟周期。

为了能够达到串行通信的波特率,例如4800B/s,则需把时钟频率设为19.2kHz。

系统结构如图1所示:图1系统原理首先介绍串行通信发送器的工作原理。

6位计数器用于判断发送的数据是否发送完毕及在发送完毕后装入新的数据,其VHDL语言程序如下:由于本设计中选取一位数据4个时钟周期,因此当计数到“100111”时,表示10位数据发送完毕;此时将加载信号“load”置1,则向移位寄存器加载10位数据。

此计数器的时钟信号由3位计数器的进位信号提供,3位计数器程序为如下:当计数脉冲为3时,计数器清零并发出进位信号“carry”,“carry”既是6位计数器的时钟信号,又是移位寄存器的移位脉冲,移位寄存器实际上在发送器中是一个并串转换器,其程序为如下:当加载信号高有效时,10位数据从外部寄存器中并行载入REG10,载入后在“carry”有效时,即每4个C LK周期右移一位进入锁存器,进而从TXD发出。

发送器的仿真波形如图2所示。

图2接收器的结构与模块的功能与发送器相似。

通过判断接收锁存器中的起始位是否为零,来确定接收与否。

若有效时,3位计数器开始计数,将锁存器中的数据逐位右移到移位寄存器中,6位计数器同样计数到“10 0111”,此时表示已接收10位数据,发出信号把移位寄存器中的数据并行读出。

接收器中的移位寄存器其实是一个串并转换器。

结论以上就是串行通信的基本结构和原理,在工程中可能对波特率的要求不同。

串行编码检测器的原理及其CPLD硬件实现

串行编码检测器的原理及其CPLD硬件实现

串行编码检测器的原理及其CPLD硬件实现
谢辉
【期刊名称】《现代计算机(专业版)》
【年(卷),期】2006(000)001
【摘要】串行编码检测技术是CDMA等现代通信技术的重要内容之一,因其灵活性和实用性,在各种领域中都有广泛应用.本文详细介绍了串行编码检测器的工作原理,并以基于状态机的状态迁移法具体讨论了串行编码检测器的分析手段、设计方法、注意事项.最后给出了使用CPLD器件完成的一种串行编码检测器的具体实现,并添附ABEL-HDL语言源代码.本文对同类设计具有一定的理论和实践参考价值.【总页数】3页(P98-100)
【作者】谢辉
【作者单位】重庆三峡学院,万州,404000
【正文语种】中文
【中图分类】TP3
【相关文献】
1.用CPLD实现串行通信时的波特率自动侦测 [J], 杨李莎
2.基于CPLD的序列信号检测器设计与实现 [J], 罗朝霞
3.用CPLD技术实现高速数据识别码检测器 [J], 王长海;王飞
4.使用CPLD实现通用串行总线接口收发模块 [J], 赵虹
5.基于CPLD的嵌入式硬件防火墙原理设计 [J], 冯鸥
因版权原因,仅展示原文概要,查看原文内容请购买。

单片机串口通信波特率自动识别

单片机串口通信波特率自动识别

毕业设计说明书设计题目:单片机串口通信波特率自动识别学院计算机科学与信息工程学院专业年级自动化2008级学生姓名何泽宏学号 2008133220 指导教师刘传文职称讲师设计地点重庆工商大学日期2012.02.27——2012.05.18单片机串口通讯波特率的自动识别重庆工商大学自动化 2008级 2班何泽宏指导教师:刘传文摘要:本设计是基于串口通信,设计能够自动识别上位机波特率的系统。

要自动识别串口通信波特率,通常的实现方法是,上位机首先发出规定的字符或数据,系统收到该字符或数据后,下位机计算对方的波特率,以适应对方的波特率进行工作。

本系统正是利用这种方法,让上位机先发送一段字符,下位机使用软件的方法检测出一位数据发送时间,从而计算出上位机发送数据波特率。

关键词:串行通信波特率自动识别发送检测Abstact:The design is based on serial communication, designed to automatically identify thebaud rate of the host computer system. To automatically identify the serial communication baud rate, the usual method, the host computer by first issuing acharacter or data, the system receives the character or data, the next bit machine, theother baud rate to adapt to each other's baud rate to work. The system took advantage ofthis method, the host computer first sends a character, the machine software to detect adata transmission time, in order to estimate the host computer to send data baud rate.Key words:serial communication baud rate automatically send detect目录第一章绪论 (1)1.1 课题研究背景 (1)1.2 串口通信基础 (2)1.2.1 同步通信(Synchronous Communication) (2)1.2.2 异步通信(Asynchronous Communication) (2)1.2.3 串行通信波特率 (3)1.2.4 串行通信制式 (3)1.2.5 串行通信校验 (4)1.3 波特率自动识别研究现状 (5)1.3.1 标准波特率穷举法 (5)1.3.2 码元宽度实时检测法 (5)1.3.3 最大公约数法 (6)1.4 设计任务及要求 (6)第二章系统方案设计 (7)2.1 系统功能指标 (7)2.2 系统设计思路及方案论证 (7)2.3 系统方案确定 (10)第三章硬件设计 (11)3.1 设计系统框图 (11)3.2 芯片选择 (12)3.2.1 单片机选择 (12)3.2.2 串行总线通信芯片 (15)3.2.3 显示芯片 (15)3.3 其它模块电路图 (17)3.3.1 电源电路 (17)3.3.2 复位电路 (17)3.3.3 时钟电路 (19)3.3.4 系统总电路 (19)第四章软件设计 (21)4.1 程序结构设计 (21)4.2 程序流程图 (21)4.2.1 一位低电平脉宽测量程序框图 (21)4.2.2 主函数框图 (22)4.3 一位低电平脉宽测量程序 (22)4.4 编译环境 (24)第五章系统调试及运行结果 (25)5.1 硬件调试 (25)5.1.1 LCD调试结果 (25)5.1.2 单片机外围电路调试 (25)5.1.3 串口调试 (25)5.2 软件调试 (25)5.3 联合调试 (26)5.3.1 生成HEX文件 (26)5.3.2 将生成的HEX文件烧录到单片机 (27)5.3.3 联合调试效果 (28)第六章结论及总结 (30)致谢 (31)参考文献 (32)附录: (32)第一章绪论1.1 课题研究背景近年来,随着科学技术的发展,PC机以其优越的性价比和丰富的软件资源成为计算机应用的主流机种。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用CPLD实现串行通信时的波特率自动侦测
杨李莎1朱华福 2
(1.长安大学研究生部,陕西西安 710064;2.云南昆船设备有限公司昆明 650236)
摘要:本文介绍了一种利用CPLD实现波特率自动侦测的方法,文章最后给出其仿真结果关键词:串行通信波特率自动侦测复杂可编程逻辑器件
Abstract: In this paper, it introduces a way to automatically detect baud rate by using CPLD, and in the end indicates it’s emulation results .
Key words: serial communication baud rate auto detected CPLD
1、引言
串行数据通信是应用极为广泛的技术,通过数据传输控制或监测中心可以对远端设备进行控制和监测设备的工作状态。

串行外设都会用到RS-232C 异步串行接口.传统上采用专用的集成电路即UART实现,如TI、EXAR、EPIC 的550、452等系列,但是我们一般不需要使用完整的UART的功能,而且对于多串口的设备或需要加密通讯的场合使用UART也不是最合适的。

如今的许多的电器都有串口,主要用于软件的升级或者用于自诊断。

通常单机设备的串行通信波特率设置都是采用硬件拨码的方式进行的,对于一些拨码开关特别多的设备来说难于记忆,因此能否寻求一种波特率自适应的方法来解决这个问题呢?回答是肯定的,本文就介绍一种用复杂可编程逻辑器件来实现波特率自动侦测的方法。

系统只设计了数据接收模块,利用VHDL语言对其进行编程,最后给出其仿真结果。

2、系统设计
2.1系统介绍
图1所示为数据接收模块结构框图,数据接收模块由波特率发生基准时钟、开始位下降沿检测、接收控制、串并转换器、锁存器、缓冲器等部分组成。

为了能准确地侦测出接收数据的波特率,数据接收模块中采用了波特率发生基准时钟,首先用基准时钟对RXD端的数据进行接收采样,然后按波特率自动侦测原理进行波特率自动侦测,最后产生一个与发送端发送的数据相同的波特率,利用波特率进行通信。

1【作者简介】杨李莎(1981—)女,长安大学研究生部04级交通信息工程及控制专业硕士研究生,主要从事高速公路和城市道路的交通控制及管理研究。

图1 数据接收模块结构框图
1) 串行数据接收采样
为了能对位进行正确的操作,以基准波特率16倍的速率采样RXD端的电平,这就把接收一位的时间分成16份,当检测到开始位的下降沿时,就开始进行数据采样。

采样的数据为一个位的第6、7、8三个状态,然后三个里面取两个以上相同的值作为采样结果,这样可以避免干扰。

2)串行数据接收控制
当开始位的采样结果不是0的时候就判定为接收出错,把串行接收控制器的位计数器复位。

在波特率未侦测之前,当接收完波特率自动侦测原理需要的位数后就进行数据的输出,并把串行数据接收控制器的位计数器复位,等待正式数据的传输开始。

当波特率确定之后,按照设计的数据传输格式(开始位、8位数据、停止位、无校验位)当接收完10位数据后就进行数据的输出,并把串行数据接收控制器的位计数器复位,等待下一数据的到来。

2.2 波特率自动侦测原理
众所周知,微机键盘中的回车键(CR)常用于命令的执行,许多程序中的命令都是以回车键来结束的,因此在波特率自动侦测中也采用回车键。

因为回车键在ASCII码中的值为0X0D(十六进制),用二进制来表示即为00001101B,在异步传输过程中,数据的传输是以高电平来代表‘1’,用低电平来代表‘0’,在10位数据(1个起始位、8位数据、1个停止位)的格式下传输回车键的传输格式如下:
1
LSB MSB
所以规定在数据发送前,先发送回车字符,数据在传输过程中,低位在前、高位在后,再加上开始位和停止位其二进制表达式为010*******(开始位加数据加停止位,其中数据低位在前、高位在后),根据数据传输格式可看出,只要能测出开始位和数据位的最低位之间的时间间隔,即可知道数据传输的波特率(由波特率的定义知每位数据传输的时间为波特率的倒数,又每位数据的传输时间即为两位数据传输的时间间隔)。

因此我们采用一种以“帧”(此处的“帧”为在数据传输过程中,每发送一个字符加上开始位和停止位)为单位来进行波特率自侦测的方法,同样是以回车字符为先导。

我们假设设备的通信速率在9600bps~115200bps之间,系统时钟频率为44MHz。

根据设备通信的波特率都有一定的规律性,所以我们在9600bps~115200bps之间列出所有常用的波特率:9600bps、14400bps、19200bps、28800bps、38400bps、57600bps、76800bps、115200bps 。

在这些波特率当中把9600bps、19200bps、38400bps、76800bps归为第一组;把14400bps、28800bps、57600bps、115200bps归为第二组,在第一组中使用一个波特率基准发生时钟把它称之为基准时钟1,在第二组中也使用一个波特率发生基准时钟把它称之为基准时钟2。

两组基准时钟同时对系统接收端的数据进行接收,当任一组接收完10位数据之后,取中间的8位数据(除数据位0和数据位9)然后再根据这8位数据确定发送数据的波特率,其具体过程如下。

取第一组中的基准时钟的波特率为76800bps ,第二组中的基准时钟的波特率为115200bps 。

以第一组为例,假设发送数据的波特率为76800bps,则接收的数据为回车字符(0X0D)。

若发送数据的波特率为38400bps,则因基准时钟的周期为发送数据的波特率时钟周期的1/2,所以基准时钟每两个时钟周期接收一个数据,故所接收的数据用二进制表示为00110011110000000011B(低位在前,高位在后),取前10位(0011001111),除去第一位和最后一位所得数据为01100111B(0XE6),其它波特率以此类推。

下面所示为发送数据的波特率与接收到的数据的关系图。

第一组:
波特率以76800bps速率接收数据字节分频系数76800 0 10110000 1 0X0D 33
38400 0 01100111 1 0000000011 0XE6 65
19200 0 00011110 0 0011111111 0X78 130
9600 0 00000001 1 1111110000 0X80 260
第二组:
波特率以115200bps速率接收数据字节分频系数
115200 0 10110000 1 0X0D 22
57600 0 01100111 1 0000000011 0XE6 43
28800 0 00011110 0 0011111111 0X78 87
14400 0 00000001 1 1111110000 0X80 174 从上面的关系图可看出,第一组中的波特率为9600bps的2n倍(其中n=1、2、4、8);第二组中的波特率为14400bps的2n倍(其中n=1、2、4、8)。

虽然第一组和第二组中接收的字节当n相同时是一样的,但是若发送数据的波特率在第一组所列的波特率中,则按第一组来锁定波特率,这时第二组接收的字节就不是关系图中所列的字节。

同理,第二组也是一样。

其算法如图2所示。

在算法中设置标志位FLAG,程序初始化时就设置FLAG为‘1’(默认设置),当接收完10位数之后,取出取中间的8位数据(除数据位0和数据位9)用第一组所列波特率来判断,若不满足置FLAG为‘0’,启用第二组所列波特率来判断。

这样便能侦测出第一组和第二组中所列的所有波特率。

图2 算法流程图
3、功能编译、设计仿真与硬件下载
本系统采用Altera 公司生产的FLEX10K系列的CPLD芯片,应用该公司的MAX+PLUS II 软件完成设计后,需对各种源文件从底层到顶层逐个编译,再进行逻辑仿真。

选择器件后,打开检查项目中所有设计文件,通过检测发现在编程器件中可能存在的不可靠性不好的逻辑器件引脚分配。

Altera 公司推荐的编译器可自动为项目进行引脚分配,也可人工调整引脚。

在编译器窗口选择Start按钮,将对所有设计的项目进行处理,出现错误将给出具体错误提示。

为了保证设计的正确性,在编译通过后,还需要进行逻辑仿真。

仿真通过后再运用MAX+PLUS II的编程器对所选可编程逻辑器件下载编程,便完成了数据接收模块的ASIC芯片设计和硬件固化。

最后给出数据接收仿真波形图,如图3所示:
图3 数据接收仿真波形图
从图3中可看出,外围系统发送过来的数据为“0x0D”(回车符),系统接收解码之后,自动侦测出发送来的数据的波特率,然后锁定波特率继续接收下一个字符“0xF8”,从接收的结果可以看出,数据接收正确。

参考文献:
1、周立功等:单片机与CPLD综合应用技术,北京航空航天大学出版,2003年9月
2、诸振勇等:FPGA设计及应用,西安电子科技大学,2002年7月
3、黄正瑾等: CPLD系统设计技术入门与应用,电子工业出版社,2002年3月
4、陈耀和: VHDL语言设计技术,电子工业出版社,2004年3月
5、林明权等: VHDL数字控制系统设计范例,电子工业出版社,2003年1月
6、朱如琪等:在系统可编程技术实践教程,科学出版社,2002年1月
7、Altera Corporation : Altera Digital Library, March 2002。

相关文档
最新文档