课程设计报告模板

更新时间:2024-07-03 11:41:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

数字系统原理与设计课程设计报告

学院:电子信息学院 专业:电子信息工程 班级:信141 题目:频率计设计 姓名:卢思萌 学号:1411011001

卢思萌 信1411011001频率计设计 第 - 2 - 页 共 46 页

课程名称 学生姓名 题 目 主要内容: 数字系统原理与设计课程设计 卢思萌 时 间 指导老师 2015~2016学年第二学期19~20周 黄颖辉 频率计设计 数字频率计的Verilog HDL设计实现 数字频率计的CPLD/FPGA制作 主要任务: 1)频率计采用三位数码管显示。 2)频率测量围为1Hz范~999Hz,并有溢出指示。 3)频率计设有1~999Hz和1~10kHz两个量程,并用LED指示。 4)频率计能够根据测试信号的频率进行量程自动切换。当频率小于1kHz时,系统选择1s的闸门时间,当频率大于等于1kHz时,在下一次测量时,选择0.1s的闸门时间。 在完成基本要求的基础上,可进一步增加功能、提高性能。

- 2 -

卢思萌 信1411011001频率计设计 第 - 3 - 页 共 46 页

课程设计成绩评定

学 院 电子信息学院 专 业 电子信息工程 班 级 信141班 学 号 1411011001 学生姓名 卢思萌 指导教师 黄颖辉 课程成绩 完成日期 2016年06月29日

指导教师对学生在课程设计中的评价

评分项目 课程设计中的创造性成果 学生掌握课程内容的程度 课程设计完成情况 课程设计动手能力 文字表达 学习态度 规范要求 课程设计论文的质量

优 良 中 及格 不及格 指导教师对课程设计的评定意见

综合成绩 指导教师签字 年 月 日

- 3 -

卢思萌 信1411011001频率计设计 第 - 4 - 页 共 46 页

基于Verilog HDL数字频率计设计与实现

学生:卢思萌 指导老师:黄颖辉

摘 要: 在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量

方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。电子计数器测频有两种方式:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。直接测频法适用于高频信号的频率测量,间接测频法适用于低频信号的频率测量。本文阐述了用Verilog HDL语言设计了一个简单的数字频率计的过程

关键词:周期;EDA;Verilog HDL;数字频率计;波形仿真

- 4 -

卢思萌 信1411011001频率计设计 第 - 5 - 页 共 46 页

目录

1 引 言 ......................................................... - 6 -

1.1 数字频率计概述 .......................................... - 6 - 1.2 频率测量的思想和方法 .................................... - 7 - 2 Verilog HDL简介 ............................................ - 10 -

2.1 Verilog HDL的简介 ...................................... - 10 - 3 数字频率计系统框图 .......................................... - 11 -

3.1数字频率计系统框图 ...................................... - 11 - 3.2数字频率计系统部件简介 .................................. - 11 - 4 基于Verilog HDL数字频率计程序设计 .......................... - 12 -

4.1数字频率计系统模块划分结构 .............................. - 12 - 4.2计数模块counter ........................................ - 13 - 4.3门控模块gate_control ................................... - 16 - 4.4分频模块fdiv ........................................... - 19 - 4.5 寄存器模块flip_latch ................................... - 21 - 4.6 多路选择模块data_mux ................................... - 23 - 4.7 动态位选模块dispselect ................................. - 24 - 4.8 BCD译码模块dispdecoder ................................ - 26 - 4.9 顶层电路top ............................................ - 29 - 5 总结 ........................................................ - 32 - 参考文献 ....................................................... - 33 -

- 5 -

卢思萌 信1411011001频率计设计 第 - 6 - 页 共 46 页

1 引 言

在电子测量领域中,频率测量的精确度是最高的,可达10—10E-13数量级。因此,在生产过程中许多物理量,例如温度、压力、流量、液位、PH值、振动、位移、速度、加速度,乃至各种气体的百分比成分等均用传感器转换成信号频率,然后用数字频率计来测量,以提高精确度。

国际上数字频率计的分类很多。按功能分类,测量某种单一功能的计数器。如频率计数器,只能专门用来测量高频和微波频率;时间计数器,是以测量时间为基础的计数器,其测时分辨力和准确度很高,可达ns数量级;特种计数器,它具有特种功能,如可逆计数器、予置计数器、差值计数器、倒数计数器等,用于工业和白控技术等方面。数字频率计按频段分类 (1)低速计数器:最高计数频率<10MHz; (2)中速计数器:最高计数频率10—100MHz; (3)高速计数器:最高计数频率>100MHz; (4)微波频率计数器:测频范围1—80GHz或更高。

单片机自问世以来,性能不断提高和完善,其资源又能满足很多应用场合的需要,加之单片机具有集成度高、功能强、速度快、体积小、功耗低、使用方便、价格低廉等特点,因此,在工业控制、智能仪器仪表、数据采集和处理、通信系统、高级计算器、家用电器等领域的应用日益广泛,并且正在逐步取代现有的多片微机应用系统。单片机的潜力越来越被人们所重视。特别是当前用CMOS工艺制成的各种单片机,由于功耗低,使用的温度范围大,抗干扰能力强、能满足一些特殊要求的应用场合,更加扩大了单片机的应用范围,也进一步促使单片机性能的发展。

1.1 数字频率计概述

频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量

- 6 -

卢思萌 信1411011001频率计设计 第 - 7 - 页 共 46 页

其他信号的频率。通常情况下计算每秒内待测信号的脉冲个数,此时我们称闸门时间为1秒。闸门时间也可以大于或小于一秒。闸门时间越长,得到的频率值就越准确,但闸门时间越长则每测一次频率的间隔就越长。闸门时间越短,测的频率值刷新就越快,但测得的频率精度就受影响。本文数字频率计是用数字显示被测信号频率的仪器,被测信号可以是正弦波,方波或其它周期性变化的信号。如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率以及产品的计件等等。因此,数字频率计是一种应用很广泛的仪器电子系统非常广泛的应用领域内,到处可见到处理离散信息的数字电路。

数字电路制造工业的进步,使得系统设计人员能在更小的空间内实现更多的功能,从而提高系统可靠性和速度。集成电路的类型很多,从大的方面可以分为模拟电路和数字集成电路2大类。数字集成电路广泛用于计算机、控制与测量系统,以及其它电子设备中。一般说来,数字系统中运行的电信号,其大小往往并不改变,但在实践分布上却有着严格的要求,这是数字电路的一个特点。数字集成电路作为电子技术最重要的基础产品之一,已广泛地深入到各个应用领域

1.2 频率测量的思想和方法

1.频率测量的基本思想

测量被测信号在单位时间内的脉冲个数,其数字表达式

f = N / t

其中:

f为被测信号的频率 N为脉冲的个数

- 7 -

卢思萌 信1411011001频率计设计 第 - 8 - 页 共 46 页

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

- 8 -

卢思萌 信1411011001频率计设计 第 - 9 - 页 共 46 页

● 测量通道灵敏度: 50mVpp ● 通道输入阻抗:不小于100k? ● 测量误差:±1

● 测量结果显示:6位数码管显示 该数字频率计的操作面板如图1.2.4所示

图1.2.4 简易数字频率计的操作面板

其中,被测信号可以有三种,分别是方波、三角波和正弦波;测量结果显示采用六个数码管来显示;量程分为三个,分别为:0~999999Hz、0~9999.99kHz、0~99.9999MHz

- 9 -

卢思萌 信1411011001频率计设计 第 - 10 - 页 共 46 页

2 Verilog HDL简介

2.1 Verilog HDL的简介

Verilog HDL是一种硬件描述语言(hardware description language),为了制作数位电路(数字电路)而用来描述ASICs和FPGAs的设计之用。Verilog 的设计者想要以 C 程序语言(en:C programming language)为基础设计一种语言,可以使工程师比较熟悉跟容易接受。事实上,它产生与 C 程序语言类似的不严谨性质,并且大概与Pascal很相像。

这种语言跟传统的程序设计语言不同,在于它的程序叙述并非严格地线性(循序)执行。Verilog 模式包含不同模组(modules)的阶层关系。模组(modules)是输出(inputs)和输入(outputs)所定义出来的一个集合。在每个模组中,有一串的电线(wires)、暂存器(registers)和子模组(submodules)的定义。并且在每个模组里面,语言叙述大部分都被群组成为各种的执行区块(blocks),用来定义该模组所产生的行为描述。在每个区块(blocks)内,使用 begin 和 end 的关键字来区隔开来,其中的叙述是循序被执行。但是同一个设计,不同的区块间的执行是平行的。

这个语言的叙述之子集合是可合成(synthesizable)。如果在一个电路设计的模组中仅包含可合成的叙述,那麽这个电路设计就可以被适当的软件,转换合成为电脑芯片的电路layout。

- 10 -

卢思萌 信1411011001频率计设计 第 - 11 - 页 共 46 页

3 数字频率计系统框图

3.1数字频率计系统框图

设计如图3.1.1所示的数字频率计系统电路框图

图3.1.1 所示的数字频率计系统电路框图

3.2数字频率计系统部件简介

1. 放大整形

数字频率计允许测量信号的类型有三种:方波、三角波和正弦波,并且信号的测量通道灵敏度为 50mVpp,为此,需要将被测信号放大整形成标准的TTL电平的方波型号,便于CPLD/FPGA对信号脉冲的计数。 2. SW1、SW2、SW3按键

SW1、SW2、SW3这三个按键用来在测量的时候,用户根据被测信号的大致频率范围选择不同的适合被测信号的量程。在按键的设计中,需要考虑实际按

- 11 -

卢思萌 信1411011001频率计设计 第 - 12 - 页 共 46 页

键的消抖问题 3. 标准时钟

标准时钟为频率计测量提供精度相对比较高的时基信号,其时间的稳定性与精度将会直接影响到频率计测量的准确性。 4. LED显示模块

频率计将测量的结果通过6位数码管(LED)来显示。

4 基于Verilog HDL数字频率计程序设计

4.1数字频率计系统模块划分结构

数字频率计中的CPLD/FPGA是频率计的核心,主要实现在一定时间内,对被测信号的脉冲个数进行计算,并且转化为相应的频率值显示在六个数码管上。首先将系统分成七个模块来分别设计仿真。分别有以下七个模块:

经过上述模块化划分后的结构框如图4.1所示

图4.1 模块化划分后的结构

- 12 -

卢思萌 信1411011001频率计设计 第 - 13 - 页 共 46 页

● 计数模块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 计数模块的结构框图

根据模块实现的功能设计Verilog HDL源代码如下:

module counter(EN,CLR,F_IN,F_OUT,Q0,Q1,Q2,Q3,Q4,Q5);

- 13 -

output [3:0] Q5,Q4,Q3,Q2,Q1,Q0; output F_OUT; input EN; input CLR; input F_IN;

reg [3:0] Q5,Q4,Q3,Q2,Q1,Q0; reg F_OUT; reg

F_out0,F_out1,F_out2,F_out3,F_out4;

always @(posedge F_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

卢思萌 信1411011001频率计设计 第 - 15 - 页 共 46 页

end end Endmodule

end end end

该模块定义输入端口如下:

● 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的仿真波形

- 15 -

卢思萌 信1411011001频率计设计 第 - 16 - 页 共 46 页

4.3门控模块gate_control

门控模块实现检测外界量程的选择,并且根据量程输出控制6位BCD码十进

制计算器的计数时钟,以及在测量完一次信号频率后,计数器计数值清零。计数器的清零要与后级寄存器的锁存时刻做很好的时序配合。应该实在计数器测量完一次信号频率后,首先将数据锁存到寄存器,然后再将计数器值清零,这样可以惊醒下一次测量。

门控模块的结构框图如图4.3.1所示

图4.3.1 门控模块结构框图

根据模块实现的功能设计Verilog HDL源代码如下: module gate_control(

SW0,SW1,SW2, f1hz,f10hz,f100hz, Latch_EN, Counter_Clr, Counter_EN,

dp_s1hz,dp_s10hz,dp_s100hz

);

- 16 -

output Latch_EN; output Counter_Clr; output Counter_EN; output

dp_s1hz,dp_s10hz,dp_s100hz;

input SW0,SW1,SW2; input f1hz,f10hz,f100hz;

reg dp_s1hz,dp_s10hz,dp_s100hz; reg fref; reg wire_1; reg wire_2;

//初始化输入以及中间量 initial begin

fref <= 1'b0; wire_1 <= 1'b0; wire_2 <= 1'b0; end

//根据不同的外界量程选择,选择相应的计数基时钟

always @(SW0 or SW1 or SW2 or f1hz or f10hz or f100hz) begin

if(SW2 == 1'b1) begin

fref <= f100hz;

{dp_s1hz,dp_s10hz,dp_s100hz} <= 3'b001; end

else if(SW1 == 1'b1) begin

fref <= f10hz;

{dp_s1hz,dp_s10hz,dp_s100hz} <= 3'b010; end

else if(SW0 == 1'b1) begin

fref <= f1hz;

{dp_s1hz,dp_s10hz,dp_s100hz} <= 3'b100; end end

//根据不同的计数基时钟,提供输出相应的计数器计数值的清除脉冲与锁存器锁存脉冲

always @(posedge fref) begin

wire_1 <= ! wire_1; end

always @(negedge fref) begin

wire_2 <= wire_1; end

assign Counter_EN = wire_1; assign Latch_EN = (! Counter_EN) & wire_2;

assign Counter_Clr = (! Counter_EN) & (! Latch_EN) | (! wire_2); endmodule

卢思萌 信1411011001频率计设计 第 - 18 - 页 共 46 页

该模块定义输入端如下: ● 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 门控模块的仿真波形

- 18 -

卢思萌 信1411011001频率计设计 第 - 19 - 页 共 46 页

4.4分频模块fdiv

分频模块在系统全局时钟的驱动下,经过分频得到系统中所需要的多种频率成分的时钟信号。

分频模块的结构框图如图4.4.1所示。

图4.4.1 分频模块结构框图

根据模块实现的功能设计Verilog HDL源代码如下: module

fdiv(clk,f1hz,f10hz,f100hz,f1khz);

output f1hz,f10hz,f100hz,f1khz; input clk;

reg f1hz,f10hz,f100hz,f1khz; integer

cnt1=0,cnt2=0,cnt3=0,cnt4=0; always @(posedge clk) begin

//if(cnt1<9999) //实际系统分

频值

if(cnt1 < 2) //仿真时的分频值 begin

f1khz <= 1'b0;

cnt1 = cnt1 + 1;

end else begin

f1khz <= 1'b1; cnt1 = 0; end

- 19 -

卢思萌 信1411011001频率计设计 第 - 20 - 页 共 46 页

end else begin

f10hz <= 1'b1; cnt3 = 0; end

end

always @(posedge f1khz) 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 @(posedge f10hz) begin

//if(cnt4<9) //实际系统分

频值

if(cnt4 < 2) //仿真时的分频值 begin

f1hz <= 1'b0; cnt4 = cnt4 + 1; end else begin

f1hz <= 1'b1; cnt4 = 0; end

end

always @(posedge f100hz) begin

//if(cnt3<9) //实际系统分

频值

该模块定义输入端口如下: ● Clk:全局系统时钟信号 该模块定义输出端口如下: ● F1hz:输出1Hz的时钟信号 ● F10hz:输出1Hz的时钟信号

if(cnt3 < 2) //仿真时的分频值 begin

f10hz <= 1'b0; cnt3 = cnt3 + 1;

end endmodule

- 20 -

卢思萌 信1411011001频率计设计 第 - 21 - 页 共 46 页

● F1khz:输出1Hz的时钟信号

在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.4.2所示。

图4.4.2 分频模块的仿真波形

4.5 寄存器模块flip_latch

寄存器模块实现每一个测量频率时,计数器计算值的暂时存储。 寄存器模块的结构框图如图4.5.1所示。

图4.5.1 寄存器模块

- 21 -

卢思萌 信1411011001频率计设计 第 - 22 - 页 共 46 页

根据模块实现的功能设计Verilog HDL源代码如下:

module flip_latch(clk,A0,A1,A2,A3,A4,A5,Q0,Q1,Q2,Q3,Q4,Q5); output [3:0] Q0,Q1,Q2,Q3,Q4,Q5; input clk;

input [3:0] A0,A1,A2,A3,A4,A5; reg [3:0] Q0,Q1,Q2,Q3,Q4,Q5; always @(posedge clk) 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所示。

- 22 -

卢思萌 信1411011001频率计设计 第 - 23 - 页 共 46 页

图4.5.2 寄存器模块的仿真波形

4.6 多路选择模块data_mux

多路选择模块实现测量频率值的分时显示,即动态显示。经过多路选择器模块来分时地传输数据。

多路选择模块的结构如图4.6.1所示。

图4.6.1 多路选择模块结构框图

根据模块实现的功能设计Verilog HDL源代码如下: module data_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_select) 3'b000: Q <= A5; 3'b001: Q <= A4; 3'b010: Q <= A3; 3'b011: Q <= A2; 3'b100: Q <= A1; 3'b101: Q <= A0; default: Q <= 4'b0; endcase end

Endmodule

- 23 -

卢思萌 信1411011001频率计设计 第 - 24 - 页 共 46 页

该模块定义输入端口如下: ● disp_select:选择信号输入

● A0,A1,A2,A3,A4,A5:多路选择模块的数据输入端口 该模块定义输出端口如下: ● 多路选择模块的数据输出端口。

在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.6.2所示。

图4.6.2 多路选择模块的仿真波形

4.7 动态位选模块dispselect

动态位选模块用来驱动数码动态地显示频率测量数据,分时地选择各个数码管进行显示

动态位选的结构框图4.7.1所示。

- 24 -

卢思萌 信1411011001频率计设计 第 - 25 - 页 共 46 页

图4.7.1 动态位选模块的结构框图

根据模块实现的功能设计Verilog HDL源代码如下: module dispselect(clk,disp_select,Q); output [5:0] Q; output [2:0] disp_select; input clk; reg [5:0] Q; reg [2:0] disp_select; always @(posedge clk) begin

if(disp_select < 3'b101)

disp_select <= disp_select +

end endmodule

disp_select <= 3'b0;

case(disp_select)

3'b000: Q <= 6'b100000; 3'b001: Q <= 6'b010000; 3'b010: Q <= 6'b001000; 3'b011: Q <= 6'b000100; 3'b100: Q <= 6'b000010; 3'b101: Q <= 6'b000001; default: Q <= 6'b000000; endcase

3'b1;

该模块定义输入端口如下:

else

● clk:动态位选的时钟信号输入,一般取1KHz左右的标准时钟。 该模块定义输出端口如下:

● disp_select:动态位选中间量输出,用于与系统中其他模块之间的同步。 ● Q:动态位选信号输出,可以直接接到数码管的公共端。

在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.7.2所示。

- 25 -

卢思萌 信1411011001频率计设计 第 - 26 - 页 共 46 页

图4.7.2 动态位选模块的仿真波形

4.8 BCD译码模块dispdecoder

BCD译码模块主要实现BCD码到7段数码管显示码字段的转换,同时,考虑到频率测量中的一些“零”的处理,比如选择量程1~999999Hz,但被测信号频率为100Hz,这样在显示的时候就需要将6为数码管的前三位屏蔽。

BCD译码模块的结构框图如图4.7.1所示。

图4.8.1 BCD译码模块的结构框图

根据模块实现的功能设计Verilog HDL源代码如下: module dispdecoder( data_in, disp_select, dp_s1hz,dp_s10hz,dp_s100hz,

Q5,Q4,Q3,Q2,Q1,Q0,counter_out, data_out, dp); output [6:0] data_out; output dp;

input [3:0] data_in; input [2:0] disp_select;

input dp_s1hz,dp_s10hz,dp_s100hz; input [3:0] Q5,Q4,Q3,Q2,Q1,Q0; input counter_out; reg dp;

reg [6:0] data_out; reg hide; initial begin

dp <= 1'b0; hide <= 1'b0; end

- 26 -

卢思萌 信1411011001频率计设计 第 - 27 - 页 共 46 页

(dp_s10hz == 1'b1))||

((disp_select == 3'b101) && (dp_s1hz == 1'b1))) dp <= 1'b1; else

dp <= 1'b0; case(disp_select) 3'b000: begin

if((counter_out == 1'b0) && (Q5 == 4'b0))

hide <= 1'b1; else

hide <= 1'b0; end 3'b001: begin

if((counter_out == 1'b0) && (Q5 == 4'b0) && (Q4 == 4'b0) && (dp_s100hz != 1'b1)) hide <= 1'b1; else

hide <= 1'b0; end 3'b010: begin

if((counter_out ==

1'b0) && (Q5 == 4'b0) && (Q4 == 4'b0) && (Q3 == 4'b0) && (dp_s100hz != 1'b1))

hide <= 1'b1; else

hide <= 1'b0; end 3'b011: begin

if((counter_out ==

1'b0) && (Q5 == 4'b0) && (Q4 == 4'b0) && (Q3 == 4'b0) && (Q2 == 4'b0) && (dp_s100hz != 1'b1)&& (dp_s10hz != 1'b1))

hide <= 1'b1;

- 27 -

//译码显示数据

always @(data_in,hide,data_out) begin

if(hide == 1'b0) begin

case(data_in)

4'b0000 : data_out <= 7'b1111110; //0 4'b0001 : data_out <= 7'b0110000; //1 4'b0010 : data_out <= 7'b1101101; //2 4'b0011 : data_out <= 7'b1111001; //3 4'b0100 : data_out <= 7'b0110011; //4 4'b0101 : data_out <= 7'b1011011; //5 4'b0110 : data_out <= 7'b1011111; //6 4'b0111 : data_out <= 7'b1110000; //7 4'b1000 : data_out <= 7'b1111111; //8 4'b1001 : data_out <= 7'b1110011; //9 default : data_out <= 7'b0000000; endcase end end

//小数点位置与零数字的处理 always

@(disp_select,dp_s1hz,dp_s10hz,dp_s100hz,

Q5,Q4,Q3,Q2,Q1,counter_out,dp,hide) begin

if (((disp_select == 3'b001) && (dp_s100hz == 1'b1))||

((disp_select == 3'b011) &&

卢思萌 信1411011001频率计设计 第 - 28 - 页 共 46 页

else (dp_s100hz != 1'b1)&& hide <= 1'b0; (dp_s10hz != 1'b1)) end hide <= 1'b1; 3'b100: begin else if((counter_out == hide <= 1'b0; 1'b0) && (Q5 == 4'b0) && end (Q4 == 4'b0) && default: hide <= 1'b0; (Q3 == 4'b0) && endcase (Q2 == 4'b0) && end (Q1 == 4'b0) && endmodule

该模块定义输入端口如下: ● data_in:BCD码字输入信号

● disp_select:来自动态显示位模块,实现两者之间的同步

● dp_s1hz,dp_s10hz,dp_s100hz:输入小数点位置控制信号来自门控模块 ● Q5,Q4,Q3,Q2,Q1,Q0:计数器的计数值输入,用来控制“零”显示控制 ● counter_out:计数器计数溢出信号,用来提示用户更换更大量程 该模块定义输出端口如下:

● data_out:经过译码后的7段数码管显示数据输出,可以直接连接到数码管的数据端口

● dp:小数点控制信号

在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.8.2所示。

图4.8.2 BCD译码模块的仿真波形

- 28 -

卢思萌 信1411011001频率计设计 第 - 29 - 页 共 46 页

4.9 顶层电路top

在设计完各个模块后,需要将各个模块有机地组合成一个整体,最后来实现系统的功能。在数字频率计中,同时采用了电路原理图示的设计以及Verilog HDL语言来编写的顶层电路,其中顶层如图4.9.1所示。

图4.9.1 顶层电路top

用Verilog HDL语言描述如下: module main(

Clock, SW2, SW1, SW0, F_in, over_alarm, dp, disp_data, disp_select

);

input Clock; input SW2; input SW1; input SW0; input F_in; output over_alarm; output dp;

output [6:0] disp_data;

- 29 -

卢思萌 信1411011001频率计设计 第 - 30 - 页 共 46 页

output [5:0] disp_select;

wire SYNTHESIZED_WIRE_0; wire SYNTHESIZED_WIRE_1; wire SYNTHESIZED_WIRE_2; wire [3:0] SYNTHESIZED_WIRE_32;

wire [3:0] SYNTHESIZED_WIRE_33;

wire [3:0] SYNTHESIZED_WIRE_34;

wire [3:0] SYNTHESIZED_WIRE_35;

wire [3:0] SYNTHESIZED_WIRE_36;

wire [3:0] SYNTHESIZED_WIRE_37;

wire SYNTHESIZED_WIRE_9; wire SYNTHESIZED_WIRE_10; wire SYNTHESIZED_WIRE_11; wire SYNTHESIZED_WIRE_12; wire SYNTHESIZED_WIRE_13; wire SYNTHESIZED_WIRE_14; wire SYNTHESIZED_WIRE_15; wire [3:0] SYNTHESIZED_WIRE_16;

wire [2:0] SYNTHESIZED_WIRE_38;

wire SYNTHESIZED_WIRE_24;

wire [3:0] SYNTHESIZED_WIRE_25;

wire [3:0] SYNTHESIZED_WIRE_26;

wire [3:0] SYNTHESIZED_WIRE_27;

wire [3:0] SYNTHESIZED_WIRE_28;

wire [3:0] SYNTHESIZED_WIRE_29;

wire [3:0] SYNTHESIZED_WIRE_30;

assign over_alarm = SYNTHESIZED_WIRE_15;

counter

b2v_inst(.EN(SYNTHESIZED_WIRE

_0),

.CLR(SYNTHESIZED_WIRE_1),.F_IN(F_in),.F_OUT(SYNTHESIZED_WIRE_15),.Q0(SYNTHESIZED_WIRE_32),.Q1(SYNTHESIZED_WIRE_33),.Q2(SYNTHESIZED_WIRE_34),.Q3(SYNTHESIZED_WIRE_35),.Q4(SYNTHESIZED_WIRE_36),.Q5(SYNTHESIZED_WIRE_37)

fdiv b2v_inst1(.clk(Clock), .f1hz(SYNTHESIZED_WIRE_9),.f10hz(SYNTHESIZED_WIRE_10),.f100hz(SYNTHESIZED_WIRE_11),.f1khz(SYNTHESIZED_WIRE_24));

- 30 -

卢思萌 信1411011001频率计设计 第 - 31 - 页 共 46 页

D_WIRE_12),

.dp_s10hz(SYNTHESIZED_WIRE_13),.dp_s100hz(SYNTHESIZED_WIRE_14),.counter_out(SYNTHESIZED_WIRE_15),.data_in(SYNTHESIZED_WIRE_16),.disp_select(SYNTHESIZED_WIRE_38),.Q0(SYNTHESIZED_WIRE_32),.Q1(SYNTHESIZED_WIRE_33),.Q2(SYNTHESIZED_WIRE_34),.Q3(SYNTHESIZED_WIRE_35),.Q4(SYNTHESIZED_WIRE_36),.Q5(SYNTHESIZED_WIRE_37),.dp(dp),.data_out(disp_data));

dispselect

b2v_inst7(.clk(SYNTHESIZED_WI

flip_latch

b2v_inst2(.clk(SYNTHESIZED_WI

RE_2),

.A0(SYNTHESIZED_WIRE_32),.A1(SYNTHESIZED_WIRE_33),.A2(SYNTHESIZED_WIRE_34),.A3(SYNTHESIZED_WIRE_35),.A4(SYNTHESIZED_WIRE_36),.A5(SYNTHESIZED_WIRE_37),.Q0(SYNTHESIZED_WIRE_25),.Q1(SYNTHESIZED_WIRE_26),.Q2(SYNTHESIZED_WIRE_27),.Q3(SYNTHESIZED_WIRE_28),.Q4(SYNTHESIZED_WIRE_29),.Q5(SYNTHESIZED_WIRE_30));

gate_control

b2v_inst3(.SW0(SW0),.SW1(SW1)

RE_24),

.disp_select(SYNTHESIZED_WIRE_38),.Q(disp_select));

data_mux

b2v_inst8(.A0(SYNTHESIZED_WIR

,.SW2(SW2),.f1hz(SYNTHESIZED_WIRE_9),.f10hz(SYNTHESIZED_WIRE_10),.f100hz(SYNTHESIZED_WIRE_11),.Latch_EN(SYNTHESIZED_WIRE_2),.Counter_Clr(SYNTHESIZED_WIRE_1),.Counter_EN(SYNTHESIZED_WIRE_0),.dp_s1hz(SYNTHESIZED_WIRE_12),.dp_s10hz(SYNTHESIZED_WIRE_13),.dp_s100hz(SYNTHESIZED_WIRE_14));

dispdecoder

- 31 -

E_25),

.A1(SYNTHESIZED_WIRE_26),.A2(SYNTHESIZED_WIRE_27),.A3(SYNTHESIZED_WIRE_28),.A4(SYNTHESIZED_WIRE_29),.A5(SYNTHESIZED_WIRE_30),.disp_select(SYNTHESIZED_WIRE_38),.Q(SYNTHESIZED_WIRE_16));

endmodule

b2v_inst5(.dp_s1hz(SYNTHESIZE

卢思萌 信1411011001频率计设计 第 - 32 - 页 共 46 页

5 总结

本程序设计主要介绍了数字频率计的Verilog HDL的设计与实现,其可以用Altera公司EPM7128SLC84-6 CPLD、EP1K10TC100-1 FPGA等可编程逻辑器件来实现。现通过学习与设计,掌握了Verilog HDL设计与实现:

● 计数模块counter的Verilog HDL设计与实现。

● 门控模块gate_control的Verilog HDL设计与实现。 ● 分频模块fdiv的Verilog HDL设计与实现。 ● 寄存器模块flip_latch的Verilog HDL设计与实现。 ● 多路选择模块data_mux的Verilog HDL设计与实现。 ● 动态为选择模块dispselevt的Verilog HDL设计与实现。 ● BCD译码模块dispdenoder的Verilog HDL设计与实现。

- 32 -

卢思萌 信1411011001频率计设计 第 - 33 - 页 共 46 页

参考文献

[1]陈敬远.数字频率计的VHDL设计[J].浙江传媒学院学报; 2002,01: 36-38.

[2]何均 ,杨明.适合于单片机实现的极值搜索算法[J].单片机与嵌入式系统应用,2004,24.

[3]杜玉远.基于top-down方法的数字频率计的设计与实现[J].电子世界, 2004,5: 30-32.

[4]钱进.基于AT89C2051的高度精度数字频率计的设计[J].机电产品开发与创新,2007,20(1):86-87.

[5]冯雷星,杨伟,芦燕龙.基于单片机高性价比频率计的设计与实现[B].微计算机信息,2007,20.

[6]赫建国,刘立新,党剑华.基于单片机的频率计设计[J].西安邮电学院学报,2003,03:34-37+75.

[7]张毅刚.单片机原理及应用.高等教育出版社[M],2003.12(1). [8] Control Circuit Design of AC Frequency Conversion Systems for Speed Governing [A],Proceedings of 4th International Symposium on Test and Measurement(Volume 2) [C],2001.

[9]The measurement of oil consumption on engine[A],Proceedings of 4th International Symposium on Test and Measurement(Volume 2) [C],2001.

[10]施剑鸣.单片机测频技术及测量精度的提高[A].江苏省计量测试学会2005年论文集 [C],2005.

[11]谢煌,黄为.基于VHDL语言设计频率计[J].北京现代电子技术,2003,14.

[12]杜刚,高军,童宁宁.基于AT89C2051单片机的频率计设计[J].微计算机应用,2004,25(4):498-501.

- 33 -

卢思萌 信1411011001频率计设计 第 - 34 - 页 共 46 页

致 谢

感谢学校和老师对我的培养,给我这个自己动手的机会和空间。经过一段时间,终于在指导老师黄颖辉和蔡烁的帮助下完成了课程设计,对自己的能力有了很大的提升。在此我要感谢每一个帮助过我的人。

首先,我要感谢的是我的指导老师黄老师,在百忙之中抽出时间为我的设计指点,提供帮助,他的学习作风和优良的教学研究精神是我永远学习的榜样。

其次要感谢我的学长学姐,在我最艰难的日子里,他们给我精神上的支持。他们一直在鼓励我,让我充满信心地迎接每一个问题。

再次我要感谢我的同学,在我最困难的时候伸出援助之手,用他们的智慧帮我解决各个难题。

总而言之,感谢每一位关心过我的人,他们今天对我的付出,成为我将来工作的动力。

- 34 -

卢思萌 信1411011001频率计设计 第 - 35 - 页 共 46 页

附录:程序源代码

module test(SW1,SW2,in,CLOCK_50,reset,of,gao,zhong,di); input in,reset,CLOCK_50; input SW1,SW2;

output[6:0] gao,zhong,di; reg[6:0] gao,zhong,di; output of; reg[3:0] a,b,c; reg of; reg clk1,clk2,clk4;

reg[23:0] p; reg[26:0] q; reg[32:0] o;

always @(posedge CLOCK_50 or negedge reset) if(!reset) begin clk1<=0; q<=0; end

else if(q==99999999) begin

- 35 -

卢思萌 信1411011001频率计设计 第 - 36 - 页 共 46 页

clk1<=0; q<=0; end

else if(q==49999999) begin clk1<=1; q<=q+1; end else

q<=q+1;

always @(posedge CLOCK_50 or negedge reset) if(!reset) begin clk2<=0; p<=0; end else if(p==4999999) begin p<=p+1; clk2<=1; end

- 36 -

卢思萌 信1411011001频率计设计 第 - 37 - 页 共 46 页

else if(p==9999999) begin clk2<=0; p<=0; end else p<=p+1;

always @(posedge in) if(!reset) begin clk4<=0; o<=0; end else begin

case({SW1,SW2}) 2'b11://1hz begin

if(o<13500000)

begin o<=o+1;clk4<=1;end else if(o==27000000) o<=0;

- 37 -

卢思萌 信1411011001频率计设计 第 - 38 - 页 共 46 页

else

begin clk4<=0;o<=o+1;end end 2'b10://10hz begin

if(o<1350000)

begin o<=o+1;clk4<=1;end else if(o==2700000) o<=0; else

begin clk4<=0;o<=o+1;end end 2'b01://10hz begin

if(o<135000)

begin o<=o+1;clk4<=1;end else if(o==270000) o<=0; else

begin clk4<=0;o<=o+1;end end

2'b00://1000hz begin

if(o<13500)

- 38 -

卢思萌 信1411011001频率计设计 第 - 39 - 页 共 46 页

begin o<=o+1;clk4<=1;end else if(o==27000) o<=0; else

begin clk4<=0;o<=o+1;end end endcase end

always @(posedge clk4 or negedge reset) if(!reset) begin of<=0; a<=0; b<=0; c<=0; end else if(!of) begin if(!clk1) begin a<=0; b<=0;

- 39 -

卢思萌 信1411011001频率计设计 第 - 40 - 页 共 46 页

c<=0; end if(clk1) begin

if(a==9&&b==9&&c==9) begin a<=0; b<=0; c<=0; of<=1; end

else if(b==9&&a==9) begin c<=c+1; a<=0; b<=0; end else if(a==9) begin a<=0; b<=b+1; end

- 40 -

本文来源:https://www.bwwdw.com/article/y7s.html

Top