资源描述
第Ⅰ页 共Ⅰ页
目 录
1 引言 1
1.1 课题背景 1
1.2 课题意义 2
1.3 国内外现状及发展趋势 2
1.4 系统开发环境及技术分析 3
1.4.1 FPGA开发简介 3
1.4.2 VHDL特点及设计方法 5
2 需求分析 7
2.1 系统基本要求 7
2.2 系统结构 7
3 系统设计 8
3.1 总体方案比较 8
3.2 程序流程图 10
3.3 系统模块设计 11
3.3.1 整形电路 11
3.3.2 计数器 12
3.3.3分频器 14
3.3.4锁存器 16
3.3.5控制器 18
3.3.6 显示器 22
4 系统仿真及测试 23
结 论 29
致 谢 30
参 考 文 献 31
附录1 32
附录2 35
第 34 页 共 35页
1 引言
1.1 课题背景
进入信息时代以来,微电子技术和计算机技术飞速发展, 各种电子测量仪器在原理、功能、精度及自动化水平等方面都发生了巨大的变化, 特别是DSP技术诞生以后,电子测量技术更是迈进了一个全新的时代[1]。近年来,DSP逐渐成为各种电子器件的基础器件,逐渐成为21世纪最具发展潜力的朝阳行业,甚至被誉为信息化数字化时代革命旗手。在电子技术领域内,频率是一个最基本的参数,频率与其它许多电参量的测量方案、测量结果都有十分密切的关系。如时间,速度等都涉及到或本身可转化为频率的测量。因此,频率的测量就显得更为重要。而且,目前在电子测量中,频率的测量精确度是最高的.现在市场上有各种多功能,高精度,高频率的数字频率计,但价格不菲。而在实际工程中,不是对所有信号的频率测量都要求达到非常高的精度。因此,本文提出了一种能满足一般测量精度要求,但成本低廉的数字频率计的设计方案。在电子工程中、资源勘探、仪器仪表等相关应用中,频率计是工程技术人员必不可少的测量工具。数字频率计是计算机,通信设备,音频视频等科研生产领域不可缺少的车辆仪器,采用VHDL语言编程设计实现的数字频率计,除被测信号的整形部分,键输入部分和数码显示部分以外其余全在一片FPGA芯片上实现,整个设计过程变得十分透明,快捷和方便,特别是对于各层次电路系统的工作时序的了解显得尤为准确而且具有灵活的现场可更改性。在不更改硬件电路的基础上对系统进行各种改进,还可以进一步提高系统的性能和测量频率的范围。该数字频率计具有高速、精确、可靠、抗干扰性强,而且具有现场可编程等优点。随着微电子技术和计算机技术的飞速发展,现代电子系统的设计和应用进入一个全新的时代。在电子技术设计领域,可编程逻辑器件已得到广泛普及和应用,高性能但结构简单的电子技术产品已经成为市场主体,通过软件编程可对可编程逻辑器件的结构和工作方式进行重构,使得硬件设计可以和软件设计一样方便快捷,为数字系统的设计带来极大的灵活行。
1.2 课题意义
在电子测量技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,测量频率是电子测量技术中最常见的测量之一。不少物理量的测量,如时间、速度等都涉及或本身可转化为频率的测量。它与许多电参量和非电量的测量都有着十分密切的关系。例如,许多传感器就是将一些非电量转换成频率来进行测量的,因此频率的测量就显得更为重要。数字频率计是用数字来显示被测信号频率的仪器,被测信号可以是正弦波、方波或其它周期性变化的信号。而传统的频率计测量精度随着频率的下降而降低,测量范围也较窄,因此逐渐被新型的数字频率计所代替。数字频率计广泛采用了高速集成电路和大规模集成电路,使得仪器的体积更小、耗电更少、精度和可靠性更高[1] 。目前,市场上有各种多功能、高精度、高频率的数字频率计,但价格不菲。而在实际工程中,并不是对所有信号的频率测量都要求达到非常高的精度因此,频率的测量就显得更为重要。测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。以往的大多数传统数字频率计一般由分离元件搭接而成,其测量范围、测量精度和测量速度都受到很大的限制。因此基于FPGA的数字频率计频率计以其测量准确、精度高、方便、价格便宜等优势将得到广泛的应用。
1.3 国内外现状及发展趋势
FPGA是现场可编程门阵列的英文简称,全称为Field Programmable Gate Array ,是20世纪70年代发展起来的一种新型立即器件是目前数字系统设计的主要硬件基础[2]。其在结构上由逻辑功能块排列为阵列,并由可编程的内部连线连接这些功能块,实现一定的逻辑功能。FPGA技术是一门实践性很强的学科,最终目的是让用户通过硬件描述语言编程来配置芯片的内部连接和元器件参数,以获得所需的电路功能。使得设计方法从 “电路设计-----硬件搭试----焊接”的传统方式转到“功能设计---软件模拟----下载”的电子设计自动化模式[3]。应此,必须选择正确有效的方法来完成可编程器件的逻辑编程。
FPGA是一种新兴的高密度大规模可编程逻辑器件,它具有门阵列的高密度和PLD器件的灵活性和易用性,目前已成为一类主要的可编程器件。FPGA器件作为系统控制的核心,其灵活的现场可更改性,可再配置能力,对系统的各种改进非常方便,在不更改硬件电路的基础上还可以进一步提高系统的性能。可编程器件的最大特点是可通过软件编程对其器件的结构和工作方式进行重构,能随时进行设计调整而满足产品升级[4]。使得硬件的设计可以如软件设计一样方便快捷,从而改变了传统数字系统及用单片机构成的数字系统的设计方法、设计过程及设计观念,使电子设计的技术操作和系统构成在整体上发生了质的飞跃。具有高速、精确、可靠、抗干扰性强.当今技术的发展日新月异,FPGA 的容量和速度成倍的增长,而价格却逐年下降,这将使得基于FPGA设计的数字频率计优势更加明显。相信不久的将来,这一技术必将得到更加广泛的应用[5]。
1.4 系统开发环境及技术分析
本次设计主要是用FPGA的开发环境QuartusⅡ 采用VHDL语言编程并对设计电路进行仿真,以便提前测试这个设计的可靠性。选用VHDL语言进行设计,可以不懂硬件结构,也不必知道最终设计的目标期间是什么样子,而是进行独立设计。正因为VHDL语言的硬件描述与具体工艺技术和硬件无关,所以VHDL设计程序的硬件目标器件有广阔的选择范围。
1.4.1 FPGA开发简介
现场可编程门阵列(FPGA)器件是八十年代中期出现的产品,它的应用大大地方便了IC的设计,因而随着数字技术日益广泛的应用,以FPGA为代表的ASIC器件得到了迅速的普及和发展,器件集成度和速度都在高速增长[6]。有了FPGA,我们只需要在计算机上绘出原理图,再运行相应的软件,就可把所设计的逻辑电路在FPGA中实现。所有步骤均可自动完成。电子设计工程师自己设计专用集成电路成为了一件很容易的事情。FPGA作为专用集成电路(ASIC)概念上的一个新型范畴和门类,以其高度灵活的用户现场编程方式,现场定义高容量数字单片系统的能力,能够重复定义、反复改写的新颖功能,为复杂数字系统设计、研制以及产品开发提供了有效的技术手段[7]。电子应用设计工程师应用FPGA技术不仅可避免通常ASIC单片系统设计周期长,前期投资风险大的弱点,而且克服了过去板级通用数字电路应用设计的落后,繁琐和不可靠性。
基于FPGA的开发设计,其工程设计流程如图1.1所示:
设计输入
综合
布局布线
时序分析
功耗分析
工程更改管理
调试
编程和配置
仿真
时序逼近
图1.1 FPGA工程设计流程
流程中各个模块具体功用如下:
a)设计输入:
用任何文本编辑器都可以进行,通常VHDL文件保存为vhd文件。HDL的编译器有很多,ACTIVE公司,MODELSIM公司,SYNPLICITY公司,SYNOPSYS公司,VERIBEST公司等都有自己的编译器。
b)综合:
将源文件调入逻辑综合软件进行综合。综合的目的是在于将设计的源文件由语言转换为实际的电路。但是此时还没有在芯片中形成真正的电路。这一步的最终目的是生成门电路级的网表(Netlist)。
c)布局布线
将第2步生成的网表文件调入PLD厂家提供的软件中进行布线,即把设计好的逻辑安放到CPLD/FPGA内。这一步的目的是生成用于下载(编程Programming)的编程文件。在这一步,将用到第3步生成的网表,并根据CPLD/FPGA厂商的器件容量,结构等进行布局、布线。这就好像在设计PCB时的布局布线一样。先将各个设计中的门根据网表的内容和器件的结构放在器件的特定部位[8]。然后,在根据网表中提供的各门的连接,把各个门的输入输出连接起来。最后,生成一个供编程的文件。这一步同时还会加一些时序信息(Timing)到设计项目中去,以便于做后仿真。
d)时序分析、仿真
利用在布局布线中获得的精确参数,用仿真软件验证电路的时序。(也叫布局布线仿真或时序仿真)。这一步主要是为了确定你的设计在经过布局布线之后,是不是还满足你的设计要求。
e)编程和配置
如果前几步都没有发生错误,并且符合设计要求,这一步就可以将由适配器等产生的配置或下载文件通过编程器或下载电缆下载到目标芯片中。
1.4.2 VHDL特点及设计方法
VHDL最早诞生于1982年,并在1987年底被IEEE和美国国防部确认为标准硬件描述语言。在EDA设计工具中,用的最广泛的是VHDL和VERILOG,当然还有其它的。比较VHDL和VERILOG,在顶层设计方面VHDL优于VERILOG,在门级电路设计方面VERILOG优于VHDL。随着复杂可编程逻辑器件(CPLD)的广泛应用,以EDA工具作为开发手段,运用VHDL语言,将使整个系统大大简化,提高整体的性能和可靠性。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其它的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。应用VHDL进行工程设计的优点是多方面的,具体如下:
a) 与其它的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了它成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。就目前流行的EDA工具和VHDL综合器而言,将基于抽象的行为描述风格的VHDL程序综合成为具体的FPGA和CPLD等目标器件的网表文件已不成问题,只是在综合与优化效率上略有差异。
b) VHDL最初是作为一种仿真标准格式出现的,因此VHDL既是一种硬件电路描述和设计语言,也是一种标准的网表格式,还是一种仿真语言。其丰富的仿真语句和库函数,使得在任何大系统的设计早期(即尚未完成),就能用于查验设计系统的功能可行性,随时可对设计进行仿真模拟。即在远离门级的高层次上进行模拟,使设计者对整个工程设计的结构和功能的可行性做出决策。
c) VHDL语句的行为描述能力和程序结构决定了它具有支持大规模设计的分解和已有设计的再利用功能,符合市场所需求的,大规模系统高效、高速的完成必须由多人甚至多个开发组共同并行工作才能实现的特点。VHDL中设计实体的概念、程序包的概念、设计库的概念为设计的分解和并行工作提供了有力的支持。
d) 对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动地把VHDL描述设计转变成为门级网表[9]。这种方式突破了门级电路设计的瓶颈,极大地减少了电路设计的时间和可能发生的错误,降低了开发成本。应用EDA工具的逻辑优化功能,可以自动地把一个综合后的设计变成一个更高效、更高速的电路系统。反过来,设计者还可以容易地从综合和优化后的电路获得设计信息,返回去更新修改VHDL设计描述,使之更为完善。
e) VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。正因为VHDL硬件描述与具体的工艺技术和硬件结构无关,VHDL设计程序的硬件实现目标器件有广阔的选择范围,其中包括各系列的CPLD、FPGA及各种门阵列实现目标。
f) 由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需要改变端口类属参量或函数,就能轻易地改变设计的规模和结构。
基于VHDL的设计一般采用自顶向下的设计方法,其主要步骤为:
1)设计说明:用自然语言表达系统项目的功能特点和技术参数等。
2)建立VHDL行为模型,即将设计说明已转化为VHDL行为模型。建立模型是为了通过VHDL仿真器对整个系统进行系统行为仿真和性能评估。
3)VHDL行为仿真。这一阶段可以利用VHDL仿真器对顶层系统的行为模型进行仿真测试,检查模拟结果,继而进行修改和完善。
4)VHDL-RTL级建模。即将VHDL的行为模型表达为VHDL行为代码。
5)前端功能仿真。即对VHDL-RTL级模型进行仿真,简称功能仿真。
6)逻辑综合。使用逻辑综合工具将VHDL行为代码描述转化为结构化的门级电路。
7)测试向量生成。
8)功能仿真。
9)结构综合。
10)门级时序仿真。
11)硬件测试。
2 需求分析
2.1 系统基本要求
本次频率计设计要求设用FPGA实现一个数字频率计,具体设计要求如下:
a)测量频率范围: 10Hz~100KHz 精度: ΔF / F ≤ ±2 %;
b)1024Hz 测量波形: 方波 Vp-p = 3~5 V;
c)Altera Cyclone Ⅱ EP2C5T144C8芯片 、数码管 LED发光二极管;
d)VHDL语言编程实现。
考虑到测量方便,将数字频率计划分为四档:10~99Hz、100~999Hz、1000~9999Hz、10000~99999Hz。这样可以保证每一档三位有效数字,而且第三位有效数字误差在±2以内时即可达到精度要求。
其中,三个输入信号:待测信号、标准时钟脉冲信号和复位脉冲信号。频率计能根据输入待测信号频率自动选择量程,并在超过最大量程时显示过量程,当复位脉冲到来时,系统复位,重新开始计数显示频率。
2.2 系统结构
基于上述要求,可以将系统基本划分为四个模块,分别为分频、计数、锁存和控制,并可以确定基本的连接和反馈, 如图2.1所示:
分频器
计数器
锁存器
输出
控制器
小数点
待测信号
标准时钟
RESET
显
示器
图2.1 频率计模块组成
3 系统设计
3.1 总体方案比较
方案1 :采用小规模数字集成电路制作
被测信号经过放大整形变换为脉冲信号后加到主控门的输入端,时基信号经控制电路产生闸门信号送至主控门,只有在闸门信号采样期间内输入信号才通过主控门,若时基信号周期为T,进入计数器的输入脉冲数为N,则被信号的测频率其频率F=N/T,其原理方框图如图3.1所示:
整形放大
闸门
计数器
译码器
显示
逻辑控制
待测信号
图3.1 方案1测频原理图
方案2 :采用单片机进行测频控制
单片机技术比较成熟,功能也比较强大,被测信号经放大整形后送入测频电路,由单片机对测频电路的输出信号进行处理,得出相应的数据送至显示器显示。原理方框图如图3.2所示:
信号整形
测频电路
单片机
显示
晶振
待测信号
图3.2 方案2才频原理图
采用这种方案优点是呆以依赖地成熟的单片机技术、运算功能较强、软件编程灵活、自由度大、设计成本也较低,缺点是显而易见的,在传统的单片机设计系统中必须使用许多分立元件组成单片机的外围电路,整个系统显得十分复杂,并且单片机的频率不能做得很高,使得测量精度大大降低。
方案3 :采用现场可编程门阵列(FPGA)为控制核心
采用现场可编程门阵列(FPGA)为控制核心,利用VHDL语言编程,下载烧制实现。将所有器件集成在一块芯片上,体积大大减小的同时还提高了稳定性,可实现大规模和超大规模的集成电路,测频测量精度高,测量频率范围大,而且编程灵活、调试方便。
综合上述分析,方案三为本设计测量部分最佳选择方案。
3.2 程序流程图
本次频率计设计的流程图如图3.3所示:
数码管显示
译码显示
数据锁存
计数器
50MHZ分频
计数器
50MHZ分频
500MHZ分频
计数器
0.1档
1档
10档
开始
1S时基
10S时基
0.1S时基
NO
NO
YES
YES
YES
图3.3 程序流程图
分频电路将50MHz标频信号通过500 MHz、50 MHz、5 MHz分频产生所需的闸门信号,其原理图如图3.4所示:
可控分频
晶振
500M分频
50M 分频
5M 分频
CLKK
图3.4 分频电路原理图
进行500MHz分频后。其频率为:50MHz/500MHz=1/10=0.1Hz周期为10s,所以所显示的频率值是实际频率值的10倍,档位为 * 0.1,精度为0.1;进行50 MHz分频后。其频率为50MHz/50MHz=1/1=1Hz,周期为1s,所以所显示的频率值即是实际频率值。档位为 * 1,精度为1。进行5 MHz分频后。其频率为50MHz/5MHz = 10Hz周期变为0.1s,所以所显示的频率值是实际频率值的1/10倍。档位为 * 10,精度为10。
3.3 系统模块设计
频率计设计总体如图3.5所示:
CLK
计数器
CLKK
数据锁存
译码显示
数码管显示
放大整形电路
500MHZ
50MHZ
5MHZ
分频
晶振
输入信号
图3.5 频率计总体设计图
3.3.1 整形电路
FPGA能够识别的信号只有脉冲信号,要使系统能够精确测量各种信号的频率,如:正弦波、三角波、锯齿波等,必需先将被测信号整形,整形电路是将待测信号整形变成计数器所要求的脉冲信号[10]。电路形式采用一个整形三极管9018和一个电位器以及四个1K的电阻组成。其整形电路原理图如图3.6所示:
图3.6 整形电路原理图
3.3.2 计数器
由四个十进制计数器级联。四个输入端口:时钟脉冲CLK、使能端EN、清零端CLRN、档位状态端STAT[1..0]。五个输出端口:四个四位十进制BCD码输出OUT1[3..0]~OUT4[3..0]、过量程溢出OF[7]。功能表见表3.1:
表3.1 计数器功能表
CLK
EN
CLRN
STAT[1.0]
OUT4-1
DF
H
L
0,1,2
3位加一计数
OF等于第三位进位
H
L
3
4位加一计数
OF等于第四位进位
×
L
L
×
计数保持
L
×
×
×
L
L
×
H
×
L
L
设计生成的计数器模块如图3.7所示:
Signal Reset
En Cntover
Cntlow
Lock
Cout1[3.0]
Cout2[3.0]
Cout3[3.0]
Cout4[3.0]
图3.7 单个计数器模块
每个十进制计数器用VHDL语言编程实现。源程序如下:
module Counter(reset,signal,en,cntover,cntlow,lock,cout1,cout2,cout3,cout4);
input signal,en; // en为分频器输出的方波信号
output cntover,cntlow,lock,reset;
output [3:0]cout1,cout2,cout3,cout4;
reg cntover,cntlow,lock;
reg [3:0]cout1,cout2,cout3,cout4;
wire reset;
assign reset=(cntover||cntlow||lock);
always@(posedge signal)
begin
if(reset)
begin cout1<=0;cout2<=0;cout3<=0;cout4<=0;cntlow<=0;cntover<=0;
end
else if(en)
begin
if((cout1==9)&&(cout2!=9)) begin cout1<=0;cout2<=cout2+1;cntover<=0;cntlow<=0;
end
else if((cout1==9)&&(cout2==9)&&(cout3!=9))
begin cout1<=0;cout2<=0;cout3<=cout3+1;cntlow<=0;
end
else if((cout1==9)&&(cout2==9)&&(cout3==9)&&(cout4!=9))
begin cout1<=0;cout2<=0;cout3<=0;cout4<=cout4+1;
end
else if((cout1==9)&&(cout2==9)&&(cout3==9)&&(cout4==9)) begin cntover<=1;
end
else begin cout1<=cout1+1; cntover<=0;
end
end
else begin cntover<=0;cntlow<=0;end
//end
//always@(negedge en)
//begin
if(!en)
begin
if((cout4==0)&&(cout3<=9)&&(cout2<=9)&&(cout1<=9)) begin cntlow<=1;lock<=0;
end
else if(cntover) begin lock<=0;cntlow<=0;
end
else begin lock<=1;cntlow<=0;
end
if((cout4==0)&&(cout3==0)&&(cout2==0)&&(cout1==0))
begin cntlow<=0;cntover<=0;lock<=0;
end
end
end
endmodule
3.3.3分频器
分频器是本系统最重要的功能部件之一,由它产生闸门电平和控制器、计数器的控制脉冲。它有四个输入:标准时钟脉冲输入CLK1024、溢出处理触发TRIGGER、复位触发RESET和档位状态STAT[1..0]。三个输出:计数闸门电平FGATE、控制器工作脉冲FTRIGGER、计数器控制器清零脉冲FCLR。设计生成的分频器模块如图3.8所示:
Clk count_clk
Reset
Select[1.0]
图3.8 单个分频器模块
分频器采用计数分频的办法,即使用一内部寄存器,在时钟脉冲上升沿加一计数,当计到一定值时就改变FGATE的状态,从而达到分频的目的。由于输入标准时钟脉冲为1024Hz,要得到0.1s的FGATE计数值相当小,约为20,误差很大,故在实际设计中把第四档闸门电平时间调整为0.1s,这样第三、四档公用一个闸门电平,同时在计数和锁存时要做相应的移位,因为测量第四档频率时有4位有效数字。要得到10s、1s、0.1s三个FGATE,分别要计数到10240、1024和103。从组成图中也可以看出分频器由这三种计数器并联组成,通过3个4选1选择器(一个74LS153和一个4_1MUX),由STAT[1..0]选择使用的FGATE、FCLR和FTRIGGER[7]。
输出FGATE送计数器EN作为计数器使能闸门电平。FTRIGGER送控制器TRIGGER作为控制器工作脉冲。FCLR送计数器CLRN作为每次计数开始前的清零信号,送控制器CLR作为控制器内部触发信号。FGATE由高变低,即计数结束时,FTRIGGER信号才产生,这时控制器开始工作,判断计数是否有效,然后发出一系列指令直到FCLR信号到来,计数器清零,准备进入下一次计数。采用这样的像CPU时钟一样的信号的原因,一方面,处理计数数据只用了很短的时间,两次测量之间时间很短,加快了频率计的响应速度;另一方面,解决了异步时序逻辑的竞争,使系统工作在异步时序状态下,既保持了很高的响应速度,又有很高的稳定性。为了解决在第一档向第二档转换时等待时间过长的问题,分频器由TRIGGER端口接收一个计数器的溢出脉冲,当计数器溢出时,在脉冲上升沿将内部计数器置为FGATE结束高电平的最后一个计数器值。这样,由于控制器此时溢出已被置位,马上就能进入一次换档处理,保证了换档的快速。另外,RESET信号上升沿到来时,计数器被置为零,这样就可以马上重新开始计数,实现了复位的效果。分频器单元FREQCER_10240的源程序如下:
module DivFreq(clk,reset,select,count_clk);
output count_clk;
input clk,reset;
input [1:0] select;
reg count_clk;
reg [23:0] num;
//always @ (posedge clk)
//begin if(reset) count_clr<=1;
// else count_clr<=0;
//end
always @ (posedge clk )
begin if(!reset)
case(select)
2'b00: begin
if(num==499) begin
count_clk<=~count_clk;
num<=0;
end
else num<=num+1;
end
2'b01: begin if(num==4999)
begin
count_clk<=~count_clk;
num<=0;
end
else num<=num+1;
end
2'b11: begin if(num==49999)
begin
count_clk<=~count_clk;
num<=0;
end
else num<=num+1;
end
default: begin if(num==4999)
begin
count_clk<=~count_clk;
num<=0;
end
else num<=num+1;
end
endcase
else begin num<=0;
count_clk<=1;
end
end
endmodule
3.3.4锁存器
如果计数器输出直接与译码器相连接,那么在计数过程中输出端则随输入脉冲数的增加而不断跳变,那么显示数码管则也会不断闪烁跳变,让人不能看到稳定的输出,设锁存器后,则不再跳变,便可清晰读出计数结果。由control控制模块产生的latch信号来提供锁存脉冲。其生成的功能模块如图3.9所示:
Lock Cout1[3.0]
Cin[3.0]
图3.9 单个锁存器模块
这模块实现了对六位计数结果和溢出信号over的锁存功能。程序很简单,即锁存信号的上升沿来时送数,其它时候则保持不变。
锁存器有八个输入:时钟脉冲CLK,置位端SET,复位端RESET,4个4bit十进制BCD输入IN1[3..0]~IN4[3..0],档位状态STAT[1..0]。五个输出:5个5bit十进制BCD输出。组成图见附图2左上部分。由一桥接器BRIDGE和4个LATCH_4_16、1个LATCH_4_1锁存器组成[8]。
桥接器BRIDGE主要是为了数据对齐。因为3、4两档使用同一个分频器,故测量第四档时有4位有效数字,通过桥接器转换后就能保证数据有效数字最高位与锁存器第五位对齐。输入输出对应表如表3.2:
表3.2 输入输出功能表
STAT = 0 , 1 , 2
STAT = 3
OUT5
= IN3
= IN4
OUT4
= IN2
= IN3
OUT3
= IN1
= IN2
OUT2
0
= IN1
桥接器功能表如表3.3所示:
表3.3 桥接器功能表
CLK(IN)
SET(IN)
RESET(IN)
OUT
0
0
= IN
0
1
0
1
0
F
×
0
0
×
0
F
锁存器单元LATCH_4_1和LATCH_4_16均为4bit锁存器,其唯一不同在于置位时,LATCH_4_16锁存器内容置为F,另一个置1。下面将LATCH_4_16的功能表和源程序列出:
Lock.vhdl
/锁存模块
module Lock(lock,cin,cout);
input lock;
input [3:0]cin;
output [3:0]cout;
reg [3:0]cout;
always@(posedge lock)
begin
if(lock) cout=cin;
end
endmodule
3.3.5控制器
控制器CONTROLER是整个系统最复杂也是最关键的部件,附图1左上部分是控制器组成。它由一个控制器核心模块CONTROL_CORE和寄存器OFREGISTER组成
OFREGISTER由CLK端接受计数器溢出脉冲在其上升沿置1,当控制器核心开始换档工作时,通过CLR清除OFREGISTER。其功能表如表3.4所示:
表3.4 输入输出功能表
输入
输入
输出
CLK
CLR
OF
×
1
×
0
设计生成的控制器模块如图3.10所示:
Clk std_f_sel[1.0]
Clear reset
Cntover light_1k
Cntlow light_10k
light_100k
图3.10 单个控制器模块
CONTROL_CORE模块是控制器的核心,有六个输入端口:时序脉冲CLK、清零脉冲CLR、复位脉冲RESET、溢出检测输入OF、计数器输出第3、4位IN3[3..0]和IN4[3..0]。输出端口四个:锁存器工作脉冲LATCH_CLK、OFREGISTER清零脉冲CLROF、锁存器状态LATCH_STAT[1..0]和当前档位状态STAT[1..0]。另外还有寄存器stat_reg[1..0],用在转换档位时临时保存档位。count寄存器,用来标志当前工作脉冲序号。flag寄存器,用来标志当前计数置溢出或不够。reset_reg寄存器,用来标志复位周期。
由上述介绍可知有三种情况能到达状态:计数结束、计数中溢出和复位。这个时候就需要检测。RESET信号在上升沿将reset_reg置为1,并进行复位操作,即状态寄存器分别置值。在 时刻第工作脉冲到来时,首先检测是不是复位周期,是则跳过,不作任何动作。不是,则检测OF端口是否为1,为1则有溢出,要进行换档,flag标志置1,并发出OFREGISTER清零信号CLROF,没有溢出,则检测计数器最高两位,两位均为0,则说明档位不够,要调低档位,flag标志置2,如果不均为0,则该计数值有效,flag置为0;
当脉冲到来时,检测是否是复位周期,是则跳过,不是则继续。如果flag=1,有溢出,向上换档,如果当前档位为3,则保持,并且将锁存器置位(显示1FFFF),否则向上调一挡;
如果flag=2,档位不够,当前档位为0时,保持,否则向下调一挡。flag=0,计数有效,发出锁存器时钟脉冲LATCH_CLK,将当前计数值打入锁存器。当 脉冲到来时,清除中间状态寄存器。当 脉冲到来时,在其下降沿将stat_reg的内容打入STAT,在下一次高电平到来之前实现档位转换。具体源程序如下:
clk: 输入时钟;
clear: 为整个频率计的异步复位信号;
reset: 用来在量程转换开始时复位计数器;
std_f_sel: 用来选择标准时基;
cntover: 代表超量程;
cntlow: 代表欠量程;
lock: 向锁存器发出的锁存信号。
状态A,B,C,D,E,F 采用一位热码编码 */
module Control(std_f_sel,reset,clk,clear,cntover,cntlow,light_1k,light_10k,light_100k);
output[1:0] std_f_sel;
output reset;
output light_1k,light_10k,light_100k;
input clk,clear,cntover,cntlow;
reg[1:0] std_f_sel;
reg reset;
reg[5:0] present,next;
reg light_1k,light_10k,light_100k;
parameter start_fl00k=6'b000001,
fl00k_cnt=6'b000010,
start_fl0k=6'b000100,
fl0k_cnt=6'b001000,
start_flk=6'b010000,
flk_cnt=6'b100000;
always @(posedge clk or posedge clear)
begin
if(clear) present<=start_fl0k;
else present<=next;
end
always @(present or cnt
展开阅读全文