课程设计基于Verilog HDL数字频率计设计与实现.docx
《课程设计基于Verilog HDL数字频率计设计与实现.docx》由会员分享,可在线阅读,更多相关《课程设计基于Verilog HDL数字频率计设计与实现.docx(44页珍藏版)》请在冰豆网上搜索。
课程设计基于VerilogHDL数字频率计设计与实现
基于VerilogHDL数字频率计设计与实现
课程设计任务书
学院:
计算机与通信工程学院专业:
网络工程专业
课程名称
计算机组成原理课程设计
时间
2010~2011学年第一学期17~18周
学生姓名
指导老师
题目
主要内容:
(1)数字频率计前端信号的放大整形处理
(2)数字频率计的VerilogHDL设计实现
(3)数字频率计的CPLD/FPGA制作
要求:
(1)通过对相应文献的收集、分析以及总结,给出相应课题的背景、意义
及现状研究分析。
(2)通过课题设计,掌握计算机组成原理的分析方法和设计方法。
。
(3)学按要求编写课程设计报告书,能正确阐述设计和实验结果。
(4)学生应抱着严谨认真的态度积极投入到课程设计过程中,认真查阅相应文献以及实现,给出个人分析、设计以及实现。
应当提交的文件:
(1)课程设计报告。
(2)课程设计附件(主要是源程序)。
指导教师对学生在课程设计中的评价
评分项目
优
良
中
及格
不及格
课程设计中的创造性成果
学生掌握课程内容的程度
课程设计完成情况
课程设计动手能力
文字表达
学习态度
规范要求
课程设计论文的质量
指导教师对课程设计的评定意见
综合成绩指导教师签字年月日
基于VerilogHDL数字频率计设计与实现
摘要:
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。
测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
电子计数器测频有两种方式:
一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。
直接测频法适用于高频信号的频率测量,间接测频法适用于低频信号的频率测量。
本文阐述了用VerilogHDL语言设计了一个简单的数字频率计的过程
关键词:
周期;EDA;VerilogHDL;数字频率计;波形仿真
1引言
在电子测量领域中,频率测量的精确度是最高的,可达10—10E-13数量级。
因此,在生产过程中许多物理量,例如温度、压力、流量、液位、PH值、振动、位移、速度、加速度,乃至各种气体的百分比成分等均用传感器转换成信号频率,然后用数字频率计来测量,以提高精确度。
国际上数字频率计的分类很多。
按功能分类,测量某种单一功能的计数器。
如频率计数器,只能专门用来测量高频和微波频率;时间计数器,是以测量时间为基础的计数器,其测时分辨力和准确度很高,可达ns数量级;特种计数器,它具有特种功能,如可逆计数器、予置计数器、差值计数器、倒数计数器等,用于工业和白控技术等方面。
数字频率计按频段分类
(1)低速计数器:
最高计数频率<10MHz;
(2)中速计数器:
最高计数频率10—100MHz;(3)高速计数器:
最高计数频率>100MHz;(4)微波频率计数器:
测频范围1—80GHz或更高。
单片机自问世以来,性能不断提高和完善,其资源又能满足很多应用场合的需要,加之单片机具有集成度高、功能强、速度快、体积小、功耗低、使用方便、价格低廉等特点,因此,在工业控制、智能仪器仪表、数据采集和处理、通信系统、高级计算器、家用电器等领域的应用日益广泛,并且正在逐步取代现有的多片微机应用系统。
单片机的潜力越来越被人们所重视。
特别是当前用CMOS工艺制成的各种单片机,由于功耗低,使用的温度范围大,抗干扰能力强、能满足一些特殊要求的应用场合,更加扩大了单片机的应用范围,也进一步促使单片机性能的发展。
1.1数字频率计概述
频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。
通常情况下计算每秒内待测信号的脉冲个数,此时我们称闸门时间为1秒。
闸门时间也可以大于或小于一秒。
闸门时间越长,得到的频率值就越准确,但闸门时间越长则每测一次频率的间隔就越长。
闸门时间越短,测的频率值刷新就越快,但测得的频率精度就受影响。
本文数字频率计是用数字显示被测信号频率的仪器,被测信号可以是正弦波,方波或其它周期性变化的信号。
如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率以及产品的计件等等。
因此,数字频率计是一种应用很广泛的仪器电子系统非常广泛的应用领域内,到处可见到处理离散信息的数字电路。
数字电路制造工业的进步,使得系统设计人员能在更小的空间内实现更多的功能,从而提高系统可靠性和速度。
集成电路的类型很多,从大的方面可以分为模拟电路和数字集成电路2大类。
数字集成电路广泛用于计算机、控制与测量系统,以及其它电子设备中。
一般说来,数字系统中运行的电信号,其大小往往并不改变,但在实践分布上却有着严格的要求,这是数字电路的一个特点。
数字集成电路作为电子技术最重要的基础产品之一,已广泛地深入到各个应用领域
1.2频率测量的思想和方法
1.频率测量的基本思想
测量被测信号在单位时间内的脉冲个数,其数字表达式
f=N/t
其中:
f为被测信号的频率
N为脉冲的个数
t为被测信号产生N个脉冲所需的时间
2.频率测量方法
直接测量法:
直接测量被测信号的频率,通过计数法来对被测信号在一定时间内的脉冲个数进行计数。
直接测量法的结构框图如图1.2.1所示。
图1.2.1直接测量法的结构框图
3.误差来源
①技术过程中最大存在着±1个字的量化误差
②对时间t的准确把握,主要包括准时钟的时间准确性、整形电路、分频电路以及技术时间控制闸门的开关速度等因素。
直接法测量的最大相对误差可以表达为
(df/f)max=±(|1/N|+|G|)=±(|1/ft|+|G|)
其中:
N为脉冲的个数,G为标准时钟的频率稳定性,f为被测信号频率,t为被测信号产生N个脉冲所需的时间。
4.功能及技术指标
●频率测量范围:
10Hz~100MHz
●测量分辨率:
1Hz
●测量通道灵敏度:
50mVpp
●通道输入阻抗:
不小于100kΩ
●测量误差:
±1
●测量结果显示:
6位数码管显示
该数字频率计的操作面板如图1.2.4所示
图1.2.4简易数字频率计的操作面板
其中,被测信号可以有三种,分别是方波、三角波和正弦波;测量结果显示采用六个数码管来显示;量程分为三个,分别为:
0~999999Hz、0~9999.99kHz、0~99.9999MHz
2VerilogHDL简介
2.1VerilogHDL的简介
VerilogHDL是一种硬件描述语言(hardwaredescriptionlanguage),为了制作数位电路(数字电路)而用来描述ASICs和FPGAs的设计之用。
Verilog的设计者想要以C程序语言(en:
Cprogramminglanguage)为基础设计一种语言,可以使工程师比较熟悉跟容易接受。
事实上,它产生与C程序语言类似的不严谨性质,并且大概与Pascal很相像。
这种语言跟传统的程序设计语言不同,在于它的程序叙述并非严格地线性(循序)执行。
Verilog模式包含不同模组(modules)的阶层关系。
模组(modules)是输出(inputs)和输入(outputs)所定义出来的一个集合。
在每个模组中,有一串的电线(wires)、暂存器(registers)和子模组(submodules)的定义。
并且在每个模组里面,语言叙述大部分都被群组成为各种的执行区块(blocks),用来定义该模组所产生的行为描述。
在每个区块(blocks)内,使用begin和end的关键字来区隔开来,其中的叙述是循序被执行。
但是同一个设计,不同的区块间的执行是平行的。
这个语言的叙述之子集合是可合成(synthesizable)。
如果在一个电路设计的模组中仅包含可合成的叙述,那麽这个电路设计就可以被适当的软件,转换合成为电脑芯片的电路layout。
3数字频率计系统框图
3.1数字频率计系统框图
设计如图3.1.1所示的数字频率计系统电路框图
图3.1.1所示的数字频率计系统电路框图
3.2数字频率计系统部件简介
1.放大整形
数字频率计允许测量信号的类型有三种:
方波、三角波和正弦波,并且信号的测量通道灵敏度为50mVpp,为此,需要将被测信号放大整形成标准的TTL电平的方波型号,便于CPLD/FPGA对信号脉冲的计数。
2.SW1、SW2、SW3按键
SW1、SW2、SW3这三个按键用来在测量的时候,用户根据被测信号的大致频率范围选择不同的适合被测信号的量程。
在按键的设计中,需要考虑实际按键的消抖问题
3.标准时钟
标准时钟为频率计测量提供精度相对比较高的时基信号,其时间的稳定性与精度将会直接影响到频率计测量的准确性。
4.LED显示模块
频率计将测量的结果通过6位数码管(LED)来显示。
4基于VerilogHDL数字频率计程序设计
4.1数字频率计系统模块划分结构
数字频率计中的CPLD/FPGA是频率计的核心,主要实现在一定时间内,对被测信号的脉冲个数进行计算,并且转化为相应的频率值显示在六个数码管上。
首先将系统分成七个模块来分别设计仿真。
分别有以下七个模块:
经过上述模块化划分后的结构框如图4.1所示
图4.1模块化划分后的结构
●计数模块counter:
对包含被测信号频率信息的脉冲进行计数
●门控模块gate_control:
根据量程,控制技术模块计数。
●分频模块fdiv:
将标准时钟分频,得到计数以及动态显示所需的时钟。
●寄存器模块flip_latch:
对计数模块的计数值进行寄存。
●多路选择模块data_mux:
根据动态选择信号,选择相应的需要显示的计数值
●动态为选择模块dispselevt:
输出动态显示中的位选信号
●BCD译码模块dispdenoder:
将BCD码译成数码管的显示数据
4.2计数模块counter
该模块主要完成对被测信号经过放大整形后输入到可编程逻辑器件的F_IN信号是现在一定的时间下的计数,采用六个异步BCD码十进制计数器来实现0~999999范围的计数。
计数模块的结构框图如图4.2.1所示。
图4.2.1计数模块的结构框图
根据模块实现的功能设计VerilogHDL源代码如下:
modulecounter(EN,CLR,F_IN,F_OUT,Q0,Q1,Q2,Q3,Q4,Q5);
output[3:
0]Q5,Q4,Q3,Q2,Q1,Q0;
outputF_OUT;
inputEN;
inputCLR;
inputF_IN;
reg[3:
0]Q5,Q4,Q3,Q2,Q1,Q0;
regF_OUT;
regF_out0,F_out1,F_out2,F_out3,F_out4;
always@(posedgeF_IN)
begin
if((EN==1'b1)&&(CLR==1'b0)&&(Q0!
=4'b1001))
begin
Q0<=Q0+4'b0001;
F_OUT<=1'b0;
end
else
begin
Q0<=4'b0000;
if((EN==1'b1)&&(CLR==1'b0)&&(Q1!
=4'b1001))
begin
Q1<=Q1+4'b0001;
F_OUT<=1'b0;
end
else
begin
Q1<=4'b0000;
if((EN==1'b1)&&(CLR==1'b0)&&(Q2!
=4'b1001))
begin
Q2<=Q2+4'b0001;
F_OUT<=1'b0;
end
else
begin
Q2<=4'b0000;
if((EN==1'b1)&&(CLR==1'b0)&&(Q3!
=4'b1001))
begin
Q3<=Q3+4'b0001;
F_OUT<=1'b0;
end
else
begin
Q3<=4'b0000;
if((EN==1'b1)&&(CLR==1'b0)&&(Q4!
=4'b1001))
begin
Q4<=Q4+4'b0001;
F_OUT<=1'b0;
end
else
begin
Q4<=4'b0000;
if((EN==1'b1)&&(CLR==1'b0)&&(Q5!
=4'b1001))
begin
Q5<=Q5+4'b0001;
F_OUT<=1'b0;
end
else
begin
Q5<=4'b0000;
F_OUT<=1'b1;
end
end
end
end
end
end
end
Endmodule
该模块定义输入端口如下:
●EN:
异步BCD码十进制计数器的全局使能信号
●CLR:
异步BCD码十进制计数器复位信号
●F_IN:
被测信号经过放大与整形处理后的信号
该模块定义输出端口如下:
●F_OUT:
超出技术范围0~999999的输出信号,用来指示提醒用户选择更大的量程。
●Q0:
计数器的最低位输出
●Q1:
计数器的第5位输出
●Q2:
计数器的第4位输出
●Q3:
计数器的第3位输出
●Q4:
计数器的第2位输出
●Q5:
计数器的第1位输出
在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.2.2所示。
图4.2.2计数模块counter的仿真波形
4.3门控模块gate_control
门控模块实现检测外界量程的选择,并且根据量程输出控制6位BCD码十进制计算器的计数时钟,以及在测量完一次信号频率后,计数器计数值清零。
计数器的清零要与后级寄存器的锁存时刻做很好的时序配合。
应该实在计数器测量完一次信号频率后,首先将数据锁存到寄存器,然后再将计数器值清零,这样可以惊醒下一次测量。
门控模块的结构框图如图4.3.1所示
图4.3.1门控模块结构框图
根据模块实现的功能设计VerilogHDL源代码如下:
modulegate_control(
SW0,SW1,SW2,
f1hz,f10hz,f100hz,
Latch_EN,
Counter_Clr,
Counter_EN,
dp_s1hz,dp_s10hz,dp_s100hz
);
outputLatch_EN;
outputCounter_Clr;
outputCounter_EN;
outputdp_s1hz,dp_s10hz,dp_s100hz;
inputSW0,SW1,SW2;
inputf1hz,f10hz,f100hz;
regdp_s1hz,dp_s10hz,dp_s100hz;
regfref;
regwire_1;
regwire_2;
//初始化输入以及中间量
initial
begin
fref<=1'b0;
wire_1<=1'b0;
wire_2<=1'b0;
end
//根据不同的外界量程选择,选择相应的计数基时钟
always@(SW0orSW1orSW2orf1hzorf10hzorf100hz)
begin
if(SW2==1'b1)
begin
fref<=f100hz;
{dp_s1hz,dp_s10hz,dp_s100hz}<=3'b001;
end
elseif(SW1==1'b1)
begin
fref<=f10hz;
{dp_s1hz,dp_s10hz,dp_s100hz}<=3'b010;
end
elseif(SW0==1'b1)
begin
fref<=f1hz;
{dp_s1hz,dp_s10hz,dp_s100hz}<=3'b100;
end
end
//根据不同的计数基时钟,提供输出相应的计数器计数值的清除脉冲与锁存器锁存脉冲
always@(posedgefref)
begin
wire_1<=!
wire_1;
end
always@(negedgefref)
begin
wire_2<=wire_1;
end
assignCounter_EN=wire_1;
assignLatch_EN=(!
Counter_EN)&wire_2;
assignCounter_Clr=(!
Counter_EN)&(!
Latch_EN)|(!
wire_2);
endmodule
该模块定义输入端如下:
●SW0、SW1、SW2:
量程选择开关
●flhz:
1Hz的标准时钟输入
●fl0hz:
10Hz的标准时钟输入
●fl00hz:
100Hz的标准时钟输入
该模块定义输入端口如下:
●Latch_EN:
用来是能寄存器所存数据
●Counter_Clr:
用于计数器的清零
●Counter_EN:
用于使能计数器开始计数
●dp_s1hz:
选择999999Hz量程时,用于控制显示中的小数点位置
●dp_s10hz:
选择9999.99Hz量程时,用于控制显示中的小数点位置
●dp_s100hz:
选择99.9999Hz量程时,用于控制显示中的小数点位置
在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.3.2所示。
图4.3.2门控模块的仿真波形
4.4分频模块fdiv
分频模块在系统全局时钟的驱动下,经过分频得到系统中所需要的多种频率成分的时钟信号。
分频模块的结构框图如图4.4.1所示。
图4.4.1分频模块结构框图
根据模块实现的功能设计VerilogHDL源代码如下:
modulefdiv(clk,f1hz,f10hz,f100hz,f1khz);
outputf1hz,f10hz,f100hz,f1khz;
inputclk;
regf1hz,f10hz,f100hz,f1khz;
integercnt1=0,cnt2=0,cnt3=0,cnt4=0;
always@(posedgeclk)
begin
//if(cnt1<9999)//实际系统分频值
if(cnt1<2)//仿真时的分频值
begin
f1khz<=1'b0;
cnt1=cnt1+1;
end
else
begin
f1khz<=1'b1;
cnt1=0;
end
end
always@(posedgef1khz)
begin
//if(cnt2<9)//实际系统分频值
if(cnt2<2)//仿真时的分频值
begin
f100hz<=1'b0;
cnt2=cnt2+1;
end
else
begin
f100hz<=1'b1;
cnt2=0;
end
end
always@(posedgef100hz)
begin
//if(cnt3<9)//实际系统分频值
if(cnt3<2)//仿真时的分频值
begin
f10hz<=1'b0;
cnt3=cnt3+1;
end
else
begin
f10hz<=1'b1;
cnt3=0;
end
end
always@(posedgef10hz)
begin
//if(cnt4<9)//实际系统分频值
if(cnt4<2)//仿真时的分频值
begin
f1hz<=1'b0;
cnt4=cnt4+1;
end
else
begin
f1hz<=1'b1;
cnt4=0;
end
end
endmodule
该模块定义输入端口如下:
●Clk:
全局系统时钟信号
该模块定义输出端口如下:
●F1hz:
输出1Hz的时钟信号
●F10hz:
输出1Hz的时钟信号
●F1khz:
输出1Hz的时钟信号
在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.4.2所示。
图4.4.2分频模块的仿真波形
4.5寄存器模块flip_latch
寄存器模块实现每一个测量频率时,计数器计算值的暂时存储。
寄存器模块的结构框图如图4.5.1所示。
图4.5.1寄存器模块
根据模块实现的功能设计VerilogHDL源代码如下:
moduleflip_latch(clk,A0,A1,A2,A3,A4,A5,Q0,Q1,Q2,Q3,Q4,Q5);
output[3:
0]Q0,Q1,Q2,Q3,Q4,Q5;
inputclk;
input[3:
0]A0,A1,A2,A3,A4,A5;
reg[3:
0]Q0,Q1,Q2,Q3,Q4,Q5;
always@(posedgeclk)
begin
Q0<=A0;
Q1<=A1;
Q2<=A2;
Q3<=A3;
Q4<=A4;
Q5<=A5;
end
Endmodule
该模块定义输入端口如下:
●clk:
所存数据信号输入,当clk的上升沿到来时,寄存器将输入端信号锁存进寄存器,并且改变输出。
●A0,A1,A2,A3,A4,A5:
寄存器的数据输入端
该模块定义输出端口如下:
●Q0,Q1,Q2,Q3,Q4,Q5:
寄存器的数据输出端。
在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.5.2所示。
图4.5.2寄存器模块的仿真波形
4.6多路选择模块data_mux
多路选择模块实现测量频率值的分时显示,即动态显示。
经过多路选择器模块来分时地传输数据。
多路选择模块的结构如图4.6.1所示。
图4.6.1多路选择模块结构框图
根据模块实现的功能设计VerilogHDL源代码如下:
moduledata_mux(disp_select,A0,A1,A2,A3,A4,A5,Q);
output[3:
0]Q;
input[2:
0]disp_select;
input[3:
0]A0,A1,A2,A3,A4,A5;
reg[3:
0]Q;
always@(disp_select,A5,A4,A3,A2,A1,A0,Q)
begin
case(disp_se