资源描述
河南科技大学
课 程 设 计 说 明 书
课程名称 _ 当代电子系统课程设计__
题 目 _ 简易数字频率计设计 _
学 院 __电子信息工程学院____
班 级 _ _
学生姓名 __ _____
指引教师 ___ ___
日 期 ___12月16日 __
课程设计任务书
(指引教师填写)
课程设计名称 当代电子系统课程设计 学生姓名 专业班级
设计题目 简易数字频率计设计
一、 课程设计目
掌握高速AD用法;
掌握频率计工作原理;
掌握GW48_SOPC实验箱用法;
理解基于FPGA电子系统设计办法。
二、 设计内容、技术条件和规定
设计一种具备如下功能简易频率计。
(1)基本规定:
a.被测信号频率范畴为1~20kHz,用4位数码管显示数据。
b.测量成果直接用十进制数值显示。
c.被测信号可以是正弦波、三角波、方波,幅值1~3V不等。
d.具备超量程警告(可以用LED灯显示,也可以用蜂鸣器报警)。
e.当测量脉冲信号时,能显示其占空比(精度误差不不不大于1%)。
(2)发挥某些
a.修改设计,实现自动切换量程。
b.构思方案,使整形时,以实现扩宽被测信号幅值范畴。
三、 时间进度安排
布置课题和解说:1天 查阅资料、设计:4天
实验:3天 撰写报告:2天
四、 重要参照文献
何小艇 《电子系统设计》 浙江大学出版社 .1
潘松 黄继业 《EDA技术实用教程》 科学出版社 .10
指引教师签字: 11月 28日
摘 要
频率计是数字电路中一种典型应用,是计算机、通讯设备、音频视频等科研生产领域不可缺少测量仪器,频率测量在科技研究和实际应用中作用日益重要。数字频率计是数字电路中一种典型应用,实际硬件设计用到器件较多,连线比较复杂,并且会产生比较大延时,导致测量误差、可靠性差。随着复杂可编程逻辑器件(CPLD)广泛应用,以EDA工具作为开发手段,运用VHDL语言。将使整个系统大大简化。提高整体性能和可靠性。
在本文中,咱们设计了一种简易数字频率计。重要分为如下几种某些:
l A/D模块: 用VHDL语言写一种状态机,控制ADC0809芯片正常工作,使输入被测模仿信号通过ADC0809芯片解决,转化为数字信号。
l 比较整形模块:将A/D转换出来数字信号通过比较,高于阈值为1低于阈值为0从而将八位数字信号转换为脉冲便于频率计算。
l 频率测量模块:惯用频率测量办法有诸多。有计数法和计时法等,详细方案论证将在下面进行。
l 占空比计算模块:计算脉冲波占空比,详细方案论证将在下面进行。
l 选取显示模块:设立一种二选一电路,通过一种按键控制四位数码管显示内容是频率还是占空比。
核心词:数字频率计、模块、占空比、数字信号、测量、阈值
目 录
任务解析……………………………….……………………3
总体方案与比较论证…………………………………………4
方案选取………………………………………………………6
频率测量办法方案论证….………………..…………….……6
系统构造….……...…....……...…………….…………….……9
A/D模块设计……………….……..…………………………10
比较整形模块设计……………………….…………………..12
频率测量模块设计…………………………………………..13
占空比计算模块设计………………………………………..14
选取显示模块设计………………………………………......15
硬件验证……………………...……………………………...16
误差分析…………………………………...………………...17
心得体会…………………………..….……………………...18
参照文献……………………………………………...………19
任务解析
本次课程设计重要任务就是运用VHDL语言设计一种简易数字频率计。频率计重要用于测量正弦波、矩形波、三角波和尖脉冲等周期信号频率值及脉冲占空比。其扩展功能可以实现自动切换量程,使整形时,以实现扩宽被测信号幅值范畴。
数字频率计整体系统原理框图如图1,被测信号为外部输入信号,送入测量电路通过数字整形、测量计算、数据锁存和送显。就完毕了频率计基本功能,控制选取用来实现频率计算频率和计算占空比功能选取。
图1
依照简易频率计设计任务书可知这次频率计性能指标如下:
一、信号波形:正弦波、三角波和矩形波。
二、率范畴分二档:Hz档 和kHz档
a.被测信号频率范畴为1~20kHz,用4位数码管显示数据。
b.测量成果直接用十进制数值显示。
c.被测信号可以是正弦波、三角波、方波,幅值1~3V不等。
d.具备超量程警告(可以用LED灯显示,也可以用蜂鸣器报警)。
e.当测量脉冲信号时,能显示其占空比(精度误差不不不大于1%)。
三、发挥某些
a.修改设计,实现自动切换量程。
b.构思方案,使整形时,以实现扩宽被测信号幅值范畴
总体方案与比较论证
数字频率计在详细是现实时,可以采用单片机或者FPGA来实现,详细有如下方案:
方案一:
采用FPGA与单片机为核心来实现,可以运用FPGA来实当前单片机系统中计数某些。这样可以节约单片机系统资源,考虑到在下面相移网络设计中也需要运用单片机和FPGA,但单片机系统资源相对有限,因而咱们建议在这里单片机重要用于控制,而FPGA则可以用来进行计数之类事情。简朴原理图如图2
图2
方案二:
分离元件设计方案:本方案运用大量数字芯片,通过各种逻辑关系构成,但由于芯片无编程性,实现难度较大,只能完毕某些功能,同步电路复杂。在实际应用中存在诸多问题。
方案三:
所有运用FPGA来实现,即运用FPGA产生时钟。由于FPGA工作频率比单片机高诸多,因而可以考虑直接运用FPGA产生信号高频参照频率, FPGA解决速度快,得到频率,占空比相对稳定,精度高,容易实现高频测量。缺陷是硬件较为复杂,实现控制相对复杂。简朴原理图如图3
图3
方案选取:
方案一虽然可行,但是由于在实验室既有FPGA实验板上无法将单片机运用在系统中,因而不能用。方案二在理论上和既有硬件基本上都能实现,但是复杂度高因而也不能用。方案三不但符合本次课程设计规定,且在实验室条件下均能实现,因此咱们选取方案三作为本次课程设计方案。
频率测量办法方案论证
数字频率测量基本原理是用一种频率稳定度高频率源作为基准时钟,对比测量其她信号频率。普通状况下有两种测量办法::一种办法是计数法,就是在一定闸门时间内测量被测信号脉冲个数;此外一种是计时法。
方案一: 计数法
计数法是将被测信号通过一种定期闸门加到计数器进行计数办法,如果闸门打开时间为T,计数器得到计数值为N1,则被测频率为f=N1/T。变化时间T,则可变化测量频率范畴。如图4所示。计数值N1
T
被测信号
原则闸门
图4
设在T期间,计数器精准计数值应为N,依照计数器计数特性可知,N1绝对误差是N1=N+1,N1相对误差为δN1=(N1-N)/N=1/N。由N1相对误差可知,N数值愈大,相对误差愈小,成反比关系。因而,在f以拟定条件下,为减少N相对误差,可通过增大T办法来减少测量误差。当T为某拟定值时(普通取1s),则有f1=N1,而f=N,故有f1相对误差:
δf1=(f1-f)/f=1/f
从上式可知f1相对误差与f成反比关系,即信号频率越高,误差越小;而信号频率越低,则测量误差越大。因而测频法合用于对高频信号测量,频率越高,测量精度也越高。
方案二: 计时法
计时法又称为测周期法,计时法是用被测信号来控制闸门开闭,而将原则时基脉冲通过闸门加到计数器,闸门在外信号一种周期内打开,这样计数器得到计数值就是原则时基脉冲外信号周期值,然后求周期值倒数,就得到所测频率值。
一方面把被测信号通过二分频,获得一种高电平时间是一种信号周期T方波信号;然后用一种始终周期T1高频方波信号作为计数脉冲,在一种信号周期T时间内对T1信号进行计数,如图5所示。
图5
若在T时间内计数值为N2,则有:
T2=N2*T1 f2=1/T2=1/(N2*T1)=f1/N2
N2绝对误差为N2=N+1。
N2相对误差为δN2=(N2-N)/N=1/N
T2相对误差为δT2=(T2-T)/T=(N2*T1-T)/T=f/f1
从T2相对误差可以看出,周期测量误差与信号频率成正比,而与高频原则计数信号频率成反比。当f1为常数时,被测信号频率越低,误差越小,测量精度也就越高。
依照本设计规定性能与技术指标,一方面需要拟定能满足这些指标频率测量办法。有上述频率测量原理与办法讨论可知,计时法适合于对低频信号测量,而计数法则适合于对较高频信号测量。但由于用计时法所获得信号周期数据,还需规定倒数运算才干得到信号频率,而求倒数运算用VHDL语言实现起来更占用系统资源且也许带来更大误差,因而,计时法不适合本实验规定。测频法测量误差与信号频率成反比,信号频率越低,测量误差就越大,信号频率越高,其误差就越小。如果用测频法所获得测量数据,将闸门时间设立为一秒时,不需要进行任何换算,计数器所计数据就是信号频率。用VHDL语言实现起来更加容易,调节时也更为以便。因而,本次课程设计所用频率测量办法是计数法。
系统构造
依照本次课程设计规定,我将这次频率计功能实现分为五个模块:
1、A/D模块
2、比较整形模块
3、频率测量模块
4、占空比计算模块
5、选取显示模块
系统构造如图6:
图6
为了节约系统资源咱们频率测量模块与占空比计算模块都用频率为3MHz基准信号。
下面是各个模块详细描述与功能:
A/D模块设计
A/D模块重要功能就是控制ADC0809芯片正常工作进行被测模仿信号采集和数字化过程,ADC0809是美国国家半导体公司生产CMOS工艺8通道,8位逐次逼近式A/D转换器。其内部有一种8通道多路开关,它可以依照地址码锁存译码后信号,只选通8路模仿输入信号中一种进行A/D转换。是当前国内应用最广泛8位通用A/D芯片。其重要控制信号:START是转换启动信号,高电平有效;ALE是3位通道选取地址信号锁存信号。当模仿量送至某一输入端,由3位地址信号选取,而地址信号由ALE锁存;EOC是转换状况状态信号;在EOC上升沿后,若使输出使能信号OE为高电平,则打开三态缓冲期,把转换好8位数据成果输至数据总线。其实按照本次课程设计规定,本次频率计应当使用一种高速AD芯片,但是由于实验条件,咱们只能用0809这个慢速AD,因此本次课程设计测频范畴就大大缩小了,测频范畴大概只能从1Hz到4KHz。
ADC0809工作过程:一方面输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模仿输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,批示转换正在进行。直到A/D转换完毕,EOC变为高电平,批示A/D转换结束,成果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换成果数字量输出到数据总线上,至此ADC0809一次转换结束。下面是控制ADC0809采样状态图:
st0
st1
st2
st3
st4
对0809初始化
启动A/D转换
采样周期中档待
EOC=’0’正在转换
EOC=’1’转换结束
OE=’1’
数 据 输 出 有 效
LOCK:0->1由LOCK信号锁存转换好数据
图7
用VHDL语言写了一种状态机来控制ADC0809正常工作采集转化被测信号,下面是A/D模块封装图以及仿真波形图:
图8
图9
由仿真图可也看出状态机可以控制ADC0809芯片正常工作完毕被测信号数字化解决。
比较整形模块设计
比较整形模块输入信号是通过0809数字化被测信号。比较整形模块作用就是将输入八位信号转化为误差较小高低电平,形成脉冲信号。原理就是在设立一种阈值,当输入信号高于这个阈值时输出高电平,当输入信号低于阈值时输出低电平。这样就可以把被测信号转化为脉冲信号,然后送入频率计算电路就能以便地计算出被测信号频率。阈值设立与被测信号幅度关于,任务书规定幅值是1-3V,因此咱们取1V设立阈值,当1V满足时,3V也自然满足。由于1/5*255=51,因此咱们将阈值设为’00100000’,不大于50,满足设计规定。
其形成封装图及仿真波形图如下:
图10
D为八位输入
CLKIN为输出信号
图11
图12
如图11、图12所示,当输入信号高于’00100000’ 时,输出信号CLKIN是高电平,当输入信号低于’00100000’ 时,输出信号CLKIN是低电平。因此比较整形模块可以正常工作,完毕输入信号整形转化为脉冲信号。
频率测量模块设计
频率测量模块有两个输入信号,一种是从比较整形电路输出整形后脉冲信号,这个是被测信号。此外一种是基准频率,用来进行测量被测频率使用。频率测量模块工作过程大体是:将基准频率进行分频,得到一种周期为2秒方波,运用方波电平为正半个周期作为闸门信号,在半个周期内运用计数器计算被测频率个数,所得脉冲个数就是被测信号频率。然后将所得个数送出给背面选取模块。其中频率计数具备自动切换量程功能,有两个档位一种是Hz档,一种是KHz档。由于用四个数码管显示但是ADC0809是慢速芯片,频率范畴1Hz到4KHz,所觉得了实现自动换量程功能,当被测频率超过1000Hz就切换为KHz档了,因此在实验箱上验证时最高位数码管普通不会显示数字。下面是模块封装图以及波形仿真图:
图13
图14
由于软件工具限制,测频功能自动换挡功能仿真起来比较困难,规定频率过高,软件仿真较慢,易出错,因此仅仿真验证了了频率计数功能。
占空比计算模块设计
占空比计算模块是用来计算被测信号为方波时占空比。占空比为在一串抱负脉冲周期序列中(如方波),正脉冲持续时间与脉冲总周期比值。这个模块我是这样实现,将比较整形后方波信号作为一种输入信号,再输入一种高频脉冲信号作为基准信号,最佳要远远高于被测信号频率,这样才干更好更精确测量被测脉冲信号占空比。将被测信号输入后二分频后得到一种周期是原被测信号二倍信号,然后运用原被测信号半个周期高电平以及二分频后信号半个周期高电平作为两个闸门信号T1、T2,分别记录这两个闸门信号下基准信号个数A1、A2,然后用A1除以A2就能得到被测脉冲信号占空比了。特别注意是这个模块内要加入一种锁存器,否则占空比计算后数值输出到数码管会不断闪烁。下面是占空比模块封装图以及波形仿真图:
图15
图16
输入信号是占空比为72%脉冲信号,仿真成果为72%,占空比计算模块可以正常工作。
选取显示模块设计
选取显示模块就是一种二选一电路,频率测量模块四个输出以及占空比计算模块两个输出都作为选取显示模块输入,尚有一种输入信号由按键控制。用来控制选取显示模块输出是频率测量模块输出信号还是占空比计算模块两个输出。选取显示模块作用就是,由于实验箱在模式5状态下,由于合用ADC0809,占用了三个数码管,因此占空比及频率不能同步用数码管显示,要用四个数码管显示频率就必要通过选取显示模块来控制。当按键没有按下时候四个数码管显示是频率,当按键按下后数高两位数码管显示占空比,低两位数码管为零。下面是选取显示模块封装图以及波形仿真图:
图17
图18
由图可以看到二选一模块可以完毕既定功能。
硬件验证:
一、 频率测量
波形
方波
正弦波
三角波
输入频率(hz)
输出频率(hz)
10
10
11
15
500
500
501
501
3000
3000
2998
2588
二、 占空比测试
输入占空比(%)
显示占空比(%)
70
70
60
59
50
50
40
41
30
32
误差分析
1、频率测量误差分析:
由于ADC0809芯片是一种低速AD芯片,因此方波频率在4khz如下,测量较为精确,超过4khz就会浮现较大误差。正弦波频率在11hz-3000hz之间测量较为精确。三角波频率在15hz-1800hz之间测量较为精确。这与AD转换速度及精度有一定关系,频率测量办法也影响着频率测量精准度。因此如果使用高速AD,并且测量高频与低频时使用合用与不同状况频率测量办法,可以有效减少误差。
2、占空比测量误差分析:
由表可见,占空比整体测量比较精确,误差并不是特别大。通过提高占空比计算模块基准频率,增长闸门时间可以减小误差。
心得体会
这次当代电子系统课程设计题目是简易数字频率计。通过这次课程设计,我对频率计以及硬件描述语言应用有了更深结识。虽然此前数字逻辑电路课程设计也是频率计,但那个频率计是通过芯片与电路连接实现最基本频率计功能,并没有更进一步去考虑一种频率计需要注意各种问题例如如何完美实现频率计各项性能指标尚有频率计精度提高问题等。这次课程设计与开学之初电子设计自动化课程设计虽然有类似之处,但是比开学那个课程设计规定要更高。我在开学初课程设计题目是运用FPGA实现一种数字钟。在那次设计中,我遇到非常多问题,基本模块都是磕磕绊绊写了出来,并且在写顶层文献时候,我用是元件例化语句将各个模块连接起来,中间用到了三十各种中间信号,自己记起来乱七八糟,最后还是都写到了一张纸上才全某些清,勉强将数字钟功能实现。因此这个课程设计,我先将各个模块一一认真实现,然后将各个模块生成封装,然后用原理图连线办法完毕了总体连线。这个办法既简朴又清晰,可以看清整个频率计工作流程原理,十分容易理解以及修改,不必再去用复杂元件例化语句节约了我不少时间。固然在这次实验过程中也暴露出不少问题,频率测量办法选取不恰当,测量误差较大,比较整形模块阈值设立我想了好久都没有想明白,最后还是在同窗耐心解说下才明白了阈值选取规则。最后频率计完毕前最后一种问题就是占空比显示问题,当时做好之后一看占空比显示不断闪烁,本来没什么思路,日后听教师给此外一种同窗解说时候说是加一种寄存器就能解决了,给占空比计算模块加入了锁存器果然解决了占空比闪烁问题。
总来说,这次课设过程中遇到了不少问题,但还是完毕了任务书规定功能。最大收获就是,我对VHDL语言应用更加熟悉,大学四年来我觉得我学最佳就是C语言和VHDL硬件描述语言了,并且语言应用也在实验与课程设计中不断进步。
参照文献:
(1)《当代电子系统设计》 浙江大学出版社 何小艇主编
(2)《EDA技术使用教程》 科学出版社 潘松 编著
(3)《VHDL硬件描述语言与数字逻辑电路设计》 西安电子科技大学出版社 侯伯亨 刘凯 顾新 编著
(4)《当代电子系统设计实验指引书》 河南科技大学 齐晶晶 李娜主编
附录
课程设计程序:
AD模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY AD0809 IS
PORT( CLK,EOC:IN STD_LOGIC;
D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
ALE,START,OE,ADDA,LOCK0:OUT STD_LOGIC;
--ADDA位地址输入线,用于选通8路模仿输入中一路
--ALE:地址锁存容许信号,输入,高电平有效
--START: A/D转换启动脉冲输入端,输入一种正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)
--OE:数据输出容许信号,输入,高电平有效。当A/D转换结束时,此端输入一种高电平,才干打开输出三态门,输出数字量
Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END AD0809;
ARCHITECTURE BEHAV OF AD0809 IS
TYPE STATES IS (ST0,ST1,ST2,ST3,ST4);
SIGNAL CURRENT_STATE,NEXT_STATE:STATES:=ST0;
SIGNAL REGL:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL LOCK:STD_LOGIC;
BEGIN
ADDA<='1';
Q<=REGL;
LOCK0<=LOCK;
COM:PROCESS(CURRENT_STATE,EOC)
BEGIN
CASE CURRENT_STATE IS
WHEN ST0=>ALE<='0';START<='0';LOCK<='0';OE<='0';NEXT_STATE<=ST1;
WHEN ST1=>ALE<='1';START<='1';LOCK<='0';OE<='0';NEXT_STATE<=ST2;
WHEN ST2=>ALE<='0';START<='0';LOCK<='0';OE<='0';
IF (EOC='1') THEN NEXT_STATE<=ST3;ELSE NEXT_STATE<=ST2;
END IF;
WHEN ST3=>ALE<='0';START<='0';LOCK<='0';OE<='1';NEXT_STATE<=ST4;
WHEN ST4=>ALE<='0';START<='0';LOCK<='1';OE<='1';NEXT_STATE<=ST0;
WHEN OTHERS=>NEXT_STATE<=ST0;
END CASE;
END PROCESS COM;
REG:PROCESS(CLK)
BEGIN
IF (CLK'EVENT AND CLK='1') THEN CURRENT_STATE<=NEXT_STATE;
END IF;
END PROCESS REG;
LATCH1:PROCESS(LOCK)
BEGIN
IF LOCK='1' AND LOCK'EVENT THEN REGL<=D;
END IF;
END PROCESS LATCH1;
END BEHAV;
比较整形模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY BJ IS
PORT(D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CLKIN:OUT STD_LOGIC);
END ENTITY BJ ;
ARCHITECTURE ONE OF BJ IS
BEGIN
PROCESS(D)
BEGIN
IF D>"00010000"THEN
CLKIN<='1';
ELSE CLKIN<='0';
END IF;
END PROCESS;
END ONE;
频率测量模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY PL IS
PORT(CLK3M:IN STD_LOGIC;
CLKIN:IN STD_LOGIC;
SMG1,SMG2,SMG3,SMG4:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
--SMG1,SMG2,SMG3,SMG4为记数码管khz,hz三位
BEEF,HZ,KHZ:OUT STD_LOGIC:='0');
END ENTITY PL ;
ARCHITECTURE ONE OF PL IS
SIGNAL CLKOUT:STD_LOGIC;
SIGNAL S0,S1,S2,S3,S4,S5:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL Q0,Q1,Q2,Q3,Q4,Q5:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL GATE:STD_LOGIC;
SIGNAL CNT0:INTEGER RANGE 0 TO 3000000;
BEGIN
PROCESS(CLK3M)--将时基信号分频
BEGIN
IF(RISING_EDGE(CLK3M))THEN
IF(CNT0=3000000)THEN
CNT0<=0;
GATE<=NOT GATE;
ELSE CNT0<=CNT0+1;
END IF;
END IF;
END PROCESS;
PROCESS(CLKIN)--计数器
BEGIN
IF(RISING_EDGE(CLKIN))THEN
IF GATE='1'THEN
IF S0="1001"THEN S0<="0000";--0个位
IF S1="1001"THEN S1<="0000";--1十位
IF S2="1001"THEN S2<="0000";--2百位
IF S3="1001"THEN S3<="0000";--3千位
IF S4="1001"THEN S4<="0000";S5<="1111";--4万位
ELSE S4<=S4+'1';END IF;
ELSE S3<=S3+'1';END IF;
ELSE S2<=S2+'1';END IF;
ELSE S1<=S1+'1';END IF;
ELSE S0<=S0+'1';END IF;
ELSIF S0/="0000" OR S1/="0000" OR S2/="0000" OR S3/="0000" OR S4/="0000" OR S5/="0000"
THEN
Q0<=S0;Q1<=S1;Q2<=S2;Q3<=S3;Q4<=S4;Q5<=S5;
S0<="0000";S1<="0000";S2<="0000" ;S3<="0000" ;S4<="0000" ;s5<="0000";
END IF;
END IF;
END PROCESS;
PROCESS(Q0,Q1,Q2,Q3,Q4,Q5,CLK3M,S5)
BEGIN
IF(Q3>"0000" OR Q4>"0000")THEN
SMG4<=Q4;
SMG3<=Q3;
SMG2<=Q2;
SMG1<=Q1;
HZ<='0';
KHZ<='1';
ELSE
SMG4<=Q3;
SMG3<=Q2;
SMG2<=Q1;
SMG1<=Q0;
HZ<='1';
KHZ<='0';
END IF;
IF (S5="1111")THEN --超量程警告
BEEF<='1';
ELSE BEEF<='0';
END IF;
END PROCESS;
END ONE;
占空比计算模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ZK IS
PORT(CLKIN,CLK3M:IN STD_LOGIC;
ZKOUT0,ZKOUT1:OUT STD_LOGIC_VECTOR(3DOWNTO 0));
END ZK;
ARCHITECTURE ONE OF ZK IS
SIGNAL ZKB:INTEGER RANGE 0 TO 99;--占空比
SIGNAL CNT1:INTEGER RANGE 0 TO 3000000:=0;
SIGNAL CNQ1:INTEGER RANGE 0 TO 3000000:=0;
SIGNAL CNT2:INTEGER RANGE 0 TO 3000000:=0;
SIGNAL CNQ2:INTEGER RANGE 0 TO 3000000:=0;
SIGNAL CLKOUT:STD_LOGIC;
SIGNAL Z1:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL Z0:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(CLKIN)
BEGIN
IF(RISING_EDGE(CLKIN))THEN
CLKOUT<=NOT CLKOUT;
END IF;
END PROCESS;
PROCESS(CLKIN,CLK3M)
BEGIN
IF(RISING_EDGE(CLK3M))THEN
IF CLKIN='1' THEN
CNT1<=CNT1+1;
ELSIF CNT1/=0 THEN
CNQ1<=CNT1;CNT1<=0;
END IF;
END IF;
END PROCESS;
PROCESS(CLKOUT,CLK3M)
BEGIN
IF(RISING_EDGE(CLK3M))THEN
IF CLKOUT='1' THEN
CNT2<=CNT2+1;
ELSIF CNT2/=0 THEN
CNQ2<=CNT2;CNT2<=0;
END IF;
END IF;
END PROCESS;
ZKB<=CNQ1*100/CNQ2;
Z1<=CONV_STD_LOGIC_VECTOR((ZKB REM 10),4);
Z0<=CONV_STD_LOGIC_VECTOR(((ZKB/10) REM 10),4);
PROCESS(CLK3M)—锁存器
BEGIN
IF(RISING_EDGE(CLK3M))THEN
IF(CNT0=3000000)THEN
CNT0<=0;
ZKOUT0<=Z0;
ZKOUT1<=Z1;
ELSE CNT0<=CNT0+1;
END IF;
END IF;
END PROCESS;
END ONE ;
选取显示模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY MUX2 IS
PORT(SEL:IN STD_LOGIC;
A0,A1,A2,A3,A4,A5:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
B0,B1,B2,B3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END ENTITY;
ARCHITECTURE ONE OF MUX2 IS
BEGIN
PROCESS(SEL,A0,A1,A2,A3,A4,A5)
BEGIN
IF SEL='0' THEN
B0<=A0;
B1<=A1;
B2<=A2;
B3<=A3;
ELSE
B0<="0000";
B1<="0000";
B2<=A5;
B3<=A4;
END IF;
END PROCESS;
END ONE;
整体原理图:
评 语
成绩:
展开阅读全文