基于Verilog语言的等精度频率计设计_Verilog串口通讯设计
引言
传统测量频率的方法主要有直接测量法、分频测量法、测周法等,这些方法往往只适用于测量一段频率,当被测信号的频率发生变化时,测量的精度就会下降。本文提出一种基于等精度原理的测量频率的方法,在整个频率测量过程中都能达到相同的测量精度,而与被测信号的频率变化无关。本文利用FPGA(现场可编程门阵列)的高速数据处理能力,实现对被测信号的测量计数;利用单片机的运算和控制能力,实现对频率、周期、脉冲宽度的计算及显示。
等精度测量原理等精度测量的一个最大特点是测量的实际门控时间不是一个固定值,而是一个与被测信号有关的值,刚好是被测信号的整数倍。在计数允许时间内,同时对标准信号和被测信号进行计数,再通过数学公式推导得到被测信号的频率。由于门控信号是被测信号的整数倍,就消除了对被测信号产生的士1误差,但是会产生对标准信号士1的误差。如图1所示。
系统中,如果采用的标准信号源的精度很高,就叮以达到一个很高的测量精度,一般情况下都是采用晶体作为标准信号源,因此可以达到很高的精度,满足一般系统的要求。
2、FPGA模块设计
本系统在传统的等精度测量原理基础上进行了改进和优化。增加了测量占空比的功能,同时由FPGA内部产生清零信号,节省了资源。改进后的FPGA核心模块如图2所示。FPGA部分主要由门控信号产生模块、计数器控制模块、计数器模块、锁存器、中断输出、数据选择输出、顶层模块组成。
1)门控信号为了测量频率为1H:的信号,要求系统的开门时间不小于1s;同理,为了测量0.1H:频率的信号,要求开门时间最短为109。但是如果系统一直采用10s的门控信号,测量高频信号的等待时间太长,显然不合理,因为测量结果的显示必须要等到一个测量周期结束之后才能更新。本系统采用的方法是,由单片机给FPGA提供一个门控的选择信号,如果FPG人测得的频率小于1Hz,那么单片机自动给出一个启动10s门控的控制信号;反之,如果发现测量的频率大于1Hz,自动切换回1。门控,实现了一个闭环的自动控制,很好地解决了门控的时间问题。
2)计数器控制模块
该模块是本文的创新点所在,主要用来同步被测信号。由前面的分析可知,门控信号启动(上升沿)后,在被测信号的上升沿启动计数允许模块,允许计数器计数;门控信号关闭(下降沿)后,在被测信号的下一个上升沿关闭计数允许模块,停止计数,从而保证了门控信号是被测信号的整数倍,达到了等精度的目的。该模块有GATE,CLKx这2个输人端;ENh,ENx,Load,CLR这4个输出端。GATE为上一级给出的门控信号汉LKesx为被测信号;EN-h,高电平期间对标准信号进行计数,得到CNT_h;EN_x为给出的允许计数信号,在EN-x的高电平期间,对被测信号、标准信号同时计数,得到CNT-x,CNT-b;Load为锁存信号;CLR为计数器清零信号。
由CNTx和CNT_b可以计算出被测信号的频率和周期;由CNTex和CNTh可以计算出被测信号的脉冲宽度。佑直图加图3所式。
3)计数器模块
在设计计数器的过程中需要注意计数器的宽度设置,系统中采用的最大门控时间为10a,标准信号源的频率为50MHz,则在计数的允许时间内计数的最大值为:536870912,为了方便数据传输,系统中采用了32位位宽的计数器。
4)锁存器模块
在门控信号关闭的同时,停止计数,同时启动锁存模块,把测量的数据锁存起来,以便传输。
5)中断输出
锁存数据的同时,给单片机一个低电平的中断信号,通知单片机读取数据。
6)数据选择输出模块
系统中采用了3个32位的计数器,由于单片机采用的是51系列单片机,只有8位的数据总线,所以一次通信只能传输8位数据,3x32/8二12,所以设计了一个数据输出控制模块,由单片机提供4根地址线,译码后可以选择16组数据,单片机得到中断通知后,分12次读取测量的数据。
7)顶层模块
实例化所有的底层模块,同时为了调试方便,加入了一些测试点。FPGA部分的整体结构图如图4所示。
3、单片机模块控制
3.1理论分析
在计数允许EN-x时间内,对被测信号和标准信号同时进行进行计数,得到CNT_x和CNT_b,设被测信号的周期为T,,频率为Fx,标准信号周期为F6.频率为Fb。则有:
系统中采用式(6)一式(8)进行计算,得到最终的测量数据,单片机中采用浮点数进行运算,计算的精度可以满足系统的要求。
3.2硬件电路
系统硬件电路比较简单,就是单片机的最小系统加上液晶显示模块,设计时需要注意,51单片机端口电压是5V输出,而FPGA是3.3V输出,所以在数据传输时要串联一个电阻一般1000一300f2即可。电路原理图如图5所示。
3.3软件设计
单片机软件主要由系统初始化、数据传输、频率、周期、占空比计算、液晶显示等程序模块组成。
下面简单介绍主函数及计算子函数。软件流程如图6所示。
中断服务子程序如图7所示。
4、结束语
本系统设计采用FPGA和单片机结合的方式实现等精度测量频率,充分发挥了FPGA高速的数据处理能力以及单片机的计算、控制能力。采用Verilog硬件描述语言对系统进行仿真测试.最终下载到FPGA内部。单片机采用C语言编写程序,利用浮点数进行计算,精度高。同时设计了门控信号自动选择的闭环控制,大大地提高了系统的性能。等精度测量技术在生产、实验等环境中得到了广泛的应用。
Verilog串口通讯设计
1 串口通信基本特点
随着多微机系统的应用和微机网络的发展,通信功能越来越显得重要。串行通信是在一根传输线上一位一位地传送信息.这根线既作数据线又作联络线。串行通信作为一种主要的通信方式,由于所用的传输线少,并且可以借助现存的电话网进行信息传送,因此特别适合于远距离传送。在串行传输中,通信双方都按通信协议进行,所谓通信协议是指通信双方的一种约定。约定对数据格式、同步方式、传送速度、传送步骤、纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。异步起止式的祯信息格式为:每祯信息由四部分组成:
a.1位起始位。
b.5~8位数据位。传送顺序是低位在前,高位在后.依次传送。
c.一位校验位,也可以没有。
d.最后是1位或是2位停止位。
FPGA(Field Pmgrammable Gate Array)现场可编程门阵列在数字电路的设计中已经被广泛使用。这种设计方式可以将以前需要多块集成芯片的电路设计到一块大模块可编程逻辑器件中,大大减少了电路板的尺寸,增强了系统的可靠性和设计的灵活性。本文详细介绍了已在实际项目中应用的基于FPGA的串口通讯设计。
本设计分为硬件电路设计和软件设计两部分,最后用仿真验证了程序设计的正确性。
2 系统的硬件设计
本方案的异步串行通信的硬件接口电路图如图1所示,主要由四部分组成:RS-485数据发送模块、FPGA串口模块、MAX3223和DB9。各部分功能简述如下:
RS-485数据发送模块是将前续电路的数据发送到FPGA,供本电路处理,亦即本电路的输入。RS485是符合RS-485和RS-4225串口标准的低功耗半双工收发器件,有3.3V和5V两种,在本设计中选用了3.3V的器件SP3485。SP3485的内部结构示意图如图2所示
在本设计中。485的7脚和8脚与前端信号相连接,用于接收输入的数据。数据格式是这样的:一帧数据有25位,报头是16个高电平和1个低电平,接下来是 8位有效的数据。传输速率为700k波特率。2脚是使能端,与FPGA的I/O口相连,由FPGA提供逻辑控制信号。1脚和4脚也与FPGA相连,由 FPGA对输入数据进行处理。
图1异步串行通信硬件接口功能框图
图2 SP3485的内部结构示意图
FPGA串口模块是将由RS-485发送过来的数据进行处理,提取出8位有效数据,并按异步串口通讯的格式要求输出到MAX3223的12脚。FPGA选用Xilinx公司的Spartan II系列xc2s50。此部分为该设计的主体。如上所述,输入数据的传输速率为700k波特率。为了使FPGA能够正确地对输入数据进行采样,提高分辨率能力和抗干扰能力,采样时钟必须选用比波特率更高的时钟,理论上至少是波特率时钟的2倍。在本设计中选用4倍于波特率的时钟,利用这种4倍于波特率的接收时钟对串行数据流进行检测和定位采样,接收器能在一个位周期内采样4次。如果没有这种倍频关系,定位采样频率和传送波特率相同,则在一个位周期中,只能采样一次,分辨率会差。比如,为了检测起始位下降沿的出现,在起始位的前夕采样一次之后,下次采样要到起始位结束前夕才进行。而假若在这个周期期间,因某种原因恰恰使接收时钟往后偏移了一点点,就会错过起始位。造成整个后面位的检测和识别错误。针对本设计,FPGA的软件共分了三个模块:
1.时钟分频模块。模块的功能是用来产生所需要的数据采集时钟和数据传输时钟。系统主频是40M的。数据采集时钟是2.8M的,发送时钟是11.2k。
2. 提取数据模块。由RS485发送过来的数据共有25位,其中只有8位是有效数据。为了发送这8位有效数据。必须先将其提取出来。提取的办法是这样的:通过连续检测到的16个高电平和一个低电平。判断8位有效数据的到来。然后按照串行数据传输的格式,在加上起始位和停止位后,将其存储于输出缓冲寄存器中。在这里,我们的串行数据输出格式是这样规定的,一位起始位,八位数据位,一位停止位,无校验位。
3.串行数据输出模块。这一模块相对比较简单,波特率选为11.2k,模块的功能是在移位输出脉冲的作用下,将输出缓冲寄存器中的数据移位输出。
MAX3223是实现电平转换的芯片。由于RS-232c是用正负电压来表示逻辑状态。与TTL以高低电平表示逻辑状态的规定不同。因此,为了能够同计算机接口或终端的TTL器件连接,必须在RS-232与TTL电路之间进行电平和逻辑关系的变换。实现这种变换的方法可用分立元件,也可用集成电路芯片。 MAXIM公司的MAX3223是为满足RS-232c的标准而设计的具有功耗低、波特率高、价格低等优点,外接电容仅为0.1uF或1uF,为双组 RS232收发器。由MAX3223的12脚输入的数据,经过电平转换后由8脚输出,再经过DB9的TxD端输出,由PC机接收并做后续处理。
3 系统软件设计
FPGA模块是本设计的主体,使用Verilog硬件描述语言进行编写,本段代码共有两个子模块,分别实现提取八位数据和串行数据发送的功能。
下面是verilog源代码
module SIMO(din,clk,rst,dout_ser);
input din; //串行输入数据
input clk; //时钟信号
input vat; 复位信号
reg[7:0] indata_buf; //输入缓冲寄存器,存提取的有效位
reg[9:0] dout_buf; //输出缓冲寄存器,加了起停位
output reg dout_ser; //串行数据输出
reg nclk; //提取八位有效数据的采样时钟.是4倍于波特率的时钟
reg txclk; //发送数据时钟。发数据取11.2k的波特率
integer bitpos=7; //当前位
parameter s0=0,s1=1,s2=2,s3=3;
reg[2:0]state;
reg[4:0]counter; //用来计算报头报尾中1的个数
reg tag,tag1;
reg[2:0]cnt3;
reg txdone=1'b1;//一个字节数据传输完毕标志
*********提取有效数据位并按串行通讯格式装载数据********
always@ (posedge nclk or posedge rst) begin
if(rst)
begin
state=0;
counter=0;
tag1=0;
tag=0;
indata_buf=8'bz;
dout_buf=10'bz;
bitpos=7;
cnt3=0;
end
else case(state)
s0:begin
tag=0;//表示数据没有装好
if(din)
begin
counter=counter+1;
state=s0;
if(counter==15)//如果检测到16个1则转入s1状态检测接下来的是不是0
begin
state=s1;
counter=0;
end
end
else begin
counter=0;
state=s0;
end
end
s1:if(!din)//如果是0的话,转入s2状态,提取八位有效数据
state=s2;
else //否则转到s0状态重新检测
state=s0;
s2:if(cnt3==3)//是否采集四次数据
begin
cnt2=0;
indata_buf[bitpos]=din; //先进来的是高位数据
bitpos=bitpos-1;
if(bitpos==-1)
begin
bitpos=7;state=s3;end
end
else cnt3=cnt3+1;
s3:begin
tag1=tag;
tag=1'b1; //标志输入寄存器满。表明已把有用数据装入寄存器
if(tag~tag1)txdone) //检测到tag的上升沿以及txdone为高才把输入缓冲数据放到输出缓冲去
dout_buf={1'b1,indata_buf[7:0],1'b0};//停止位,高位,低位,起始位
state=s0;
end
endcase
end
//***********发送数据模块
reg[3:0] state_tx=0;
always@(posedge txclk or posedge rst)
begin
if(rst)
begin
dout_ser=1'bz;
state_tx=0;
txdone=1;
end
else
case(state_tx)
0:begin
dout_ser=dout_buf[0];state_tx=state_tx+1;txdone=1'b0;end
1:begin
dout_ser=dout_buf[1];state_tx=state_tx+1;end
2:begin
dout_ser=dout_buf[2];state_tx=state_tx+1;end
3:begin
dout_ser=dout_buf[3];state_tx=state_tx+1;end
4:begin
dout_ser=dout_buf[4];state_tx=state_tx+1;end
5:begin
dout_ser=dout_buf[5];state_tx=state_tx+1;end
6:begin
dout_ser=dout_buf[6];state_tx=state_tx+1;end
7:begin
dout_ser=dout_buf[7];state_tx=state_tx+1;end
8:begin
dout_ser=dout_buf[8];state_tx=state_tx+1;end
9:begin
dout_ser=dout_buf[9];state_tx=state_tx+1;end
endcase
end
endmodule
注:两个频率信号nclk、txclk由相应的分频程序产生。由于篇幅所限未在文中列出。
FPGA模块接收从RS-485发送过来的串行数据。25位为一个字符。数据的传输速率是700kbps,用四倍于波特率的速率进行采样,这样可以大大降低系统的噪声。数据的串行输出波特率选为11200bps。
由输入输出波形图可以看出:本段程序实现了对输入数据的有效数据位的提取,并按照一定的波特率进行串行输出。程序中,波特率可以根据需要通过分频程序进行改动。硬件电路搭建简单,程序代码书写容易。数据传输稳定可靠,可以满足串口通信的要求。
Verilog介绍
Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。
以模块为基础的设计
描述复杂的硬件电路,设计人员总是将复杂的功能划分为简单的功能,模块是提供每个简单功能的基本结构。设计人员可以采取“自顶向下”的思路,将复杂的功能模块划分为低层次的模块。这一步通常是由系统级的总设计师完成,而低层次的模块则由下一级的设计人员完成。自顶向下的设计方式有利于系统级别层次划分和管理,并提高了效率、降低了成本。“自底向上”方式是“自顶向下”方式的逆过程。
使用Verilog描述硬件的基本设计单元是模块(module)。构建复杂的电子电路,主要是通过模块的相互连接调用来实现的。模块被包含在关键字module、endmodule之内。实际的电路元件。Verilog中的模块类似C语言中的函数,它能够提供输入、输出端口,可以实例调用其他模块,也可以被其他模块实例调用。模块中可以包括组合逻辑部分、过程时序部分。例如,四选一的多路选择器,就可以用模块进行描述。它具有两个位选输入信号、四个数据输入,一个输出端,在Verilog中可以表示为:
module mux (out, select, in0, in1, in2, in3);output out;input [1:0] select;input in0, in1, in2, in3;//具体的寄存器传输级代码endmodule
设计人员可以使用一个顶层模块,通过实例调用上面这个模块的方式来进行测试。这个顶层模块常被称为“测试平台(Testbench)”。为了最大程度地对电路的逻辑进行功能验证,测试代码需要尽可能多地覆盖系统所涉及的语句、分支、条件、路径、触发、状态机状态,验证人员需要在测试平台里创建足够多的输入激励,并连接到被测模块的输入端,然后检测其输出端的表现是否符合预期(诸如SystemVerilog的硬件验证语言能够提供针对验证专门优化的数据结构,以随机测试的方式进行验证,这对于高度复杂的集成电路设计验证可以起到关键作用)。实例调用模块时,需要将端口的连接情况按照这个模块声明时的顺序排列。这个顶层模块由于不需要再被外界调用,因此没有输入输出端口:
module tester;reg [1:0] SELECT;reg IN0, IN1, IN2, IN3;wire OUT;mux my_mux (OUT, SELECT, IN0, IN1, IN2, IN3); //实例调用mux模块,这个实例被命名为my_muxinitial //需要仿真的激励代码 begin endendmodule
在这个测试平台模块里,设计人员可以设定仿真时的输入信号以及信号监视程序,然后观察仿真时的输出情况是否符合要求,这样就可以了解设计是否达到了预期。
示例中的对模块进行实例引用时,按照原模块声明时的顺序罗列了输入变量。除此之外,还可以使用或者采用命名端口连接的方式。使用这种方式,端口的排列顺序可以与原模块声明时不同,甚至可以不连接某些端口:
mux my_mux (.out(OUT), .select(SELECT), .in0(IN0), .in1(IN1), .in2(IN2), .in3(IN3));//使用命名端口连接,括号外面是模块声明时的端口,括号内是实际的端口连接//括号外相当于C语言的形式参数,括号内相当于实际参数endmodule
上面所述的情况是,测试平台顶层模块的测试变量直接连接了所设计的功能模块。测试平台还可以是另一种形式,即测试平台并不直接连接所设计的功能模块,而是在这个测试平台之下,将激励模块和功能模块以相同的抽象级别,通过线网相互连接。这两种形式的测试平台都可以完成对功能模块的测试。大型的电路系统,正是由各个层次不同模块之间的连接、调用,来实现复杂的功能的。
责任编辑:Davia
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。