(指导教师填写)
课程设计名称 现代电子系统课程设计 学生姓名 专业班级
设计题目 简易数字频率计设计 一、课程设计目的
掌握高速AD的使用方法; 掌握频率计的工作原理;
掌握GW48_SOPC实验箱的使用方法; 了解基于FPGA的电子系统的设计方法。
二、设计内容、技术条件和要求
设计一个具有如下功能的简易频率计。 (1)基本要求:
a.被测信号的频率范围为1~20kHz,用4位数码管显示数据。 b.测量结果直接用十进制数值显示。
c.被测信号可以是正弦波、三角波、方波,幅值1~3V不等。 d.具有超量程警告(可以用LED灯显示,也可以用蜂鸣器报警)。 e.当测量脉冲信号时,能显示其占空比(精度误差不大于1%)。 (2)发挥部分
a.修改设计,实现自动切换量程。
b.构思方案,使整形时,以实现扩宽被测信号的幅值范围。 c.其它。
三、时间进度安排
布置课题和讲解:1天 查阅资料、设计:4天 实验:3天 撰写报告:2天
四、主要参考文献
何小艇 《电子系统设计》 浙江大学出版社 2008.1 潘松 黄继业 《EDA技术实用教程》 科学出版社 2006.10
齐晶晶 《现代电子系统设计》实验指导书 电工电子实验教学中心 2009.8
指导教师签字: 2011年 11月28日
摘 要
由于社会发展和科技发展的需要,信息传输和处理的要求的提高,对频率的测量精度也提出了更高的要求,需要更高更准确度的时频基准和更精密的测量技术。而频率测量所能达到的精度,主要取决于作为标准频率源的精度以及所使用的测量设备和测量方法。目前,国内外使用的测频方法有很多,有直接测频法、内插法、游标法、时间—电压变化法、多周期同步法、频率倍增法、频差倍增法以及相位比较法。
在本文中,我们用VHDL语言进行编程并利用FPGA芯片设计了一个简易数字频率计。主要分为如下几个部分:
一、 ADC0809控制模块: AD0809的工作过程是:输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出三态门打开,ALE,START,OE,ADDA都是ADC0809的控制信号,ADDA为模拟通道选择,低电平选择通道0,ALE为通道地址锁存信号,START为启动AD转换的信号,OE为ADC0809转换结果输出的使能信号。这部分主要用来控制ADC0809完成数模转换,将模拟信号转换成数字信号。 二、 比较器模块:这部分的功能是将前者输出的信号与它本身设置好的一个预值相比较,将数字信号转换成脉冲信号。此时比较器的作用相当于一个整形电路。
三、频率计计数模块:这部分主要用来测量频率,测频
方法有很多。本次设计采用的是直接测频法。具体的方案论证将在下面进行。
四、频率计占空比计数模块:这部分主要用来测量占空
比,测量方法也有很多,本次设计用的是等精度法测量。
五、显示模块:这部分主要用四个数码管来显示测量的频率和脉冲信号的占空比,并通过一个按键来实现频率显示和占空比显示的转换。
关键词: 频率、精度、VHDL、FPGA、ADC0809
1
目 录
一、任务解析…………………………………………………4 二、系统方案论证………………………………………..…..5 2.1 总体方案与比较论证………………………………..…5 2.2 方案的选择………………………………………………6 2.3 系统结构………………………………………………6 三、ADC0809控制模块…………………………………..…7 四、比较器模块…………………………………………..…..10 五、频率计数和占空比模块……………………………….…13 5.1 频率计基本原理………………………………………....13 5.2 方案论证…………………………………………..……..13 六、显示模块……………………………………………….…15 七、实验结果及分析…………………………..………………17 八、心得体会………………………………………………….17 参考文献…………………………..…………………....….....18 附 录一……………………………..…………...…….........19 附 录二………………………………..…………...….........19
2
一、任务解析
设计目标及要求:
被测信号波形:正弦波、三角波和矩形波。 测量频率范围分二档:Hz档 和kHz档
a.被测信号的频率范围为1~20kHz,用4位数码管显示数据。
b.测量结果直接用十进制数值显示。
c.被测信号可以是正弦波、三角波、方波,幅值1~3V不等。
d.具有超量程警告(可以用LED灯显示,也可以用蜂鸣器报警)。
e.当测量脉冲信号时,能显示其占空比(精度误差不大于1%)。
(2)发挥部分
a.修改设计,实现自动切换量程。
b.构思方案,使整形时,以实现扩宽被测信号的幅值范围 系统原理图如下
占空比显示占空比计算电路高频信号&计数器数据锁存&二分频数字比较器脉冲信号计数器数据锁存被测信号ADC0809&Y阈值高电平计数器N数据锁存1Hz二分频频率显示
3
二、 系统方案论证
2.1总体方案与比较论证
数字频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。通常情况下有以下两种思路:
1.利用一个较大的周期信号作为参考信号,计量在一个周期内出现的被测信号的数目,最终我们可以通过计数器求出信号的频率。
2.利用一个频率较高来测量,具体来说就是计量被测信号在一个周期内的能够经历多少个参考频率。因此,同样也可以测量出具体信号的值。
但是,我们可以看到以上的两种方法本身有一些缺陷。对于第一种方法,如果被测信号的频率和参考信号的频率接近的话,那么测量出的结果就一定会有比较大的误差。对于第二种方法,如果被测信号的频率和比较的的话,会造成计数值的比较大的误差,因此第二种方法不适合测量低频率的信号。因此,为了保证测量的精度,就必须采用分段进行测量,也就是在低频的时候采用第二种方法,在高频时采用第一种方法。
在具体是现实时,又可以采用单片机或者FPGA来实现,具体有如下方案:
方案一:
我觉得,如果采用FPGA来实现,我们可以利用FPGA来实现在单片机系统中的计数部分。这样可以节省单片机的系统资源,考虑到在下面的相移网络设计中也需要利用单片机和FPGA,但单片机的系统资源相对有限,因此我们建议在这里单片机主要用于控制,而FPGA则可以用来进行计数之类的事情。
方案二:
分离元件设计方案:本方案利用大量数字芯片,通过各种逻辑关系构成,但由于芯片无编程性,如果完成本次大赛的所有要求难度较大,只能完成部分功能,同时电路复杂。在实际应用中存在很多问题。
方案三:
全部利用FPGA来实现,即利用FPGA产生时钟。由于FPGA的工作频率比单片机的高很多,因此可以考虑直接利用FPGA产生信号的高频参考频率,这样就可以在一定程度上利用前面综述的第二种方法,同时能够在误差范围内满足误差要求。
但是,利用FPGA处理产生参考频率,有一个最大的问题:
4
这样会导致在低频和高频是。
方案四:
我们可以以AT89C51单片机为核心,利用他内部的定时/计数器完成待测信号周期/频率的测量。大致原理如下所述:
单片机AT89C51内部具有2个16位定时/计数器,定时/计数器的工作可以由编程来实现定时、计数和产生计数溢出时中断要求的功能。在定时器工作方式下,在被测时间间隔内,每来一个机器周期,计数器自动加1(使用12 MHz时钟时,每1μs加1),这样以机器周期为基准可以用来测量时间间隔。在计数器工作方式下,加至外部引脚的待测信号发生从1到0的跳变时计数器加1,这样在计数闸门的控制下可以用来测量待测信号的频率。外部输入在每个机器周期被采样一次,这样检测一次从1到0的跳变至少需要2个机器周期(24个振荡周期),所以最大计数速率为时钟频率的1/24(使用12 MHz时钟时,最大计数速率为500 kHz)。定时/计数器的工作由运行控制位TR控制,当TR置1,定时/计数器开始计数;当TR清0,停止计数。
在高频时,我们可以利用单片机产生一个低频信号,例如周期为一秒,用来进行测量高频信号。而在低频时,我们可以采用单片机发生一个10K的信号,采用在综述中所说的第二种方法。
2.2方案的选择
我们最终选择第二种,具体理由有如下几点:
由于FPGA本身是将大量的逻辑功能继承与一个器件内,集成度要远远高于单片机,能够利用的资源也相对充裕,因此可以较好地完成要求。
由于对于FPGA的设计,可以直接采用VHDL硬件语言直接进行的,在不同的场合,我们只要对语言进行适当的改动,就可实现具体情况具体应用。因此,利用FPGA来进行开放,其可移植性更强。
利用FPGA和单片机协调来进行开发,只要利用较少的器件就可以实现系统的功能。
由于单片机通过中断可以较准确地产生信号需要的信号频率,同时,单片机的控制能力比较强。
2.3.系统结构
本次课程设计主要有五大模块组成:ADC0809控制器、比较器、频率计量模块、占空比计量模块和显示模块。设计原理如下:
通过信号发生器将信号输入到ADC0809控制器,通过它的
5
控制电路将模拟信号转换成数字信号,将其输出与通过比较器的预值相比较,此时比较器的作用相当于整形电路,把输出转换成一个个脉冲。然后将此脉冲信号分别送到频率计量模块和占空比计量模块,在频率计量模块中,比较器的输出作为计时信号,而在占空比计量模块中,比较器的输出作为阀门信号。最后将两者的输出送到显示模块。系统原理框图如下:
频率测量被测信号AD转换比较器数码管显示占空比测量系统原理框图 三、ADC0809控制模块 主要特性
1)8路输入通道,8位A/D转换器,即分辨率为8位。 2)具有转换起停控制端。
3)转换时间为100μs(时钟为640kHz时),130μs(时钟为500kHz时)
4)单个+5V电源供电 5)模拟输入电压范围0~+5V,不需零点和满刻度校准。 6)工作温度范围为-40~+85摄氏度 7)低功耗,约15mW 外部特性(引脚功能)
ADC0809芯片有28条引脚,采用双列直插式封装,如图13.23所示。下面说明各引脚功能。
IN0~IN7:8路模拟量输入端。 2-1~2-8:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路
6
ALE:地址锁存允许信号,输入,高电平有效。 START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。 REF(+)、REF(-):基准电压。 Vcc:电源,单一+5V。 GND:地。
其具体与ADC0809的连接电路图如下:
7
模拟信号输入转换时钟
AD0809的工作过程是:输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出三态门打开,ALE,START,OE,ADDA都是ADC0809的控制信号,ADDA为模拟通道选择,低电平选择通道0,ALE为通道地址锁存信号,START为启动AD转换的信号,OE为ADC0809转换结果输出的使能信号。
生成的封装图为:
波形仿真如下:
8
D来自0809转换好的8位数据,CLK状态机工作时钟, EOC转换状态指示,低电平表示正在转换,ALE 8个模拟信号通道地址锁存信号, START转换开始信号,OE数据输出3态控制信号,ADDA 信号通道最低位控制信,,LOCK0 观察数据锁存时钟,Q 8位数据输出。输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出三态门打开。由上图可知:模拟输入变成了数字输出。
四、比较模块
比较器主要用来将数字信号转换成脉冲信号,它的作用相当于一个整形电路。数字比较器用于数字信号的比较,例如,数据A和B比较,如果A>B,则输出A大于B的结果信号FA>B=1,FA=B=0,FAB=0,FA=B=1,FAB=0,FA=B=0,FA9
原理框图如下图:
被测信号 高速A/D 数字比较器 脉冲信号 阈值 预值的计算:
这部分要用到以前做的一次实验的知识,将信号发生器输出一个频率很小的方波(相当于给一个直流电压),通过数码管的显示将显示的字符写成BCD码形式,然后向右移一位(相当于除以二),这样得到的数就是我们要找的预值。
部分程序如下: begin
process(y5) begin
if y5>=\"00100000\"then fin<='1'; else fin<='0'; end if;
end process; end block BJ;
上述程序中选取阀值为00100000,当大于阀值时,输出为高电平,低于阀值时输出为低电平。从而实现了把正弦波,三角波转换为方波。然后输入到频率和占空比的控制模块中。
通过编程实现的比较模块见下图:经过Q[7..0]输出的结果,直接给d[7..0]
10
做为输入,然后用输入和这个阈值作比较,如果大于则输出为高电平,小于或等于则输出为低电平。 生成的封装图为:
compred[7..0]fininst2
波形仿真图如下:
高于门限的仿真结果
11
低于门限的仿真结果
五、频率计数和占空比模块
5.1数字频率频率计的基本原理
数字频率计的主要功能是测量周期信号的频率。频率是单位时间( 1S )内信号发生周期变化的次数。如果我们能在给定的 1S 时间内对信号波形计数,并将计数结果显示出来,就能读取被测信号的频率。数字频率计首先必须获得相对稳定与准确的时间,同时将被测信号转换成幅度与波形均能被数字电路识别的脉冲信号,然后通过计数器计算这一段时间间隔内的脉冲个数,将其换算后显示出来。这就是数字频率计的基本原理。 5.2、方案论证
对于频率的测量没有现成的硬件模块,因此对于频率的测量需要我们用VHDL语言进行实现。对于频率的测量主要考虑有两种实现方案。
12
方案一: 直接测频法
测频法就是在确定的闸门时间Tw内,记录被测信号的变化周期数(或脉冲个数)Nx,则被测信号的频率为:fx=Nx/Tw。
闸门信号TW被测信号NX
测量的过程如图所示,在TW时间内通过计数器记录被测信号脉冲的个数,然后把记录结果锁存,经过运算后,送数码管显示,即为所测频率。, 方案二: 测周期法
测周期法需要有标准信号的频率fs,这个标准信号应该取一个频率适中的高频信号,在待测信号的一个周期Tx内,记录标准频率的周期数Ns,则被测信号的频率为:fx=fs/Ns。
被测信号TX标准信号NS
测量测周期法的过程如上图所示,在待测信号的一个周期Tx内,记录标准信号周期的个数,然后把记录结果锁存,经过运算后,送数码管显示,即为所测频率。, 对于测频率:
比较一二两种方案:
13
这两种测频率的原理基本一样,都是通过在给定的时间内记录脉冲的个数,经过一定的运算处理,得出结果显示出来。并且这两种方案的计数值都会产生误差,都与计数器中记录的数值Nx或Ns有关。但是考虑到用VHDL语言编写乘除的算法比较困难,并且经过乘除运算后所得结果的误差较大,因此选用方案一。
方案一得好处是闸门信号直接可以选择1S的时钟信号,在这1S时间内记录的被测信号脉冲的个数,正好就是被测信号的频率,不再需要进行运算处理。不但减少编程的难度,而且也减小了实验的误差。因为侧周期法的标准信号是一个高频信号,在不同的被测信号的脉冲下所造成的误差有很大的不同。而在1S闸门信号下,记录的脉冲个数,对于所有被测信号的产生的误差基本是一样。考虑到以上的各因素,我认为方案一是比较理想的选择。
对于占空比:比较以上两种方案,我认为第二种是比较理想的选择。它不仅满足了精度的要求,而且对于高频测量更加适合。
生成的封装图分别为:
pljsclk1findata[19..0]czkbjsfy[7..0]clk2
inst3
inst5 占空比部分程序如下: begin
if f3='1' then n1<=0;m1<=0;l1<=0; else
if clk7'event and clk7='1' then if g1='1' then n1<=n1+1; end if; end if;
if clk7'event and clk7='1' then if f2='1' then m1<=m1+1; end if; end if;
14
end if;
l1<=m1*100/n1; end process p5; p6:process(m1,n1) begin
y3(3 downto 0)<=conv_std_logic_vector(l2 rem 10,4); y3(7 downto 4)<=conv_std_logic_vector(l2/10 rem 10,4); end process p6; end block ZKB;
上面程序中m1为高电平时的所得到的频率,n1为一个周期的频率。把12和10求余,结果转换成四位二进制,得到的就为显示占空比的个位,把上述求余后再和10求余,结果转换成四位二进制,所得到的就是显示数码管的十位,二个就是显示占空比的二位数码管。
仿真波形图如下:
Clk1为系统时钟信号,clk2是输入的时钟信号,fin是经过过比较器后的输入信号,在1S的信号下对fin信号进行计数。计数器,要求低位的计数值溢出信号做为高位的输入信号,从而显示
15
频率的计量。在fin的高电平期间就对这个基准脉冲信号的个数进行计数同时也在fin二分频后的高电平期间对这个基准信号进行计数,把这两个得到的计数结果进行相除运算,相除后得到的结果进行个位和十位分离,然后再进行进制转换,送到数码管中显示。
六、 显示模块
这部分主要通过用四个数码管将测得的频率和占空比显示出来,并实现量程的自动转换功能,还能通过一个按键控制是显示频率还是占空比。P[7..0]为占空比模块的输出;data[19..0]为频率计量模块的输出;clk3 为系统时钟;e 为控制信号,当它为1时显示占空比,为0时显示测量频率;c 为量程转换信号,当它为1时,khz灯亮,表示高量程,当它为0时,hz灯亮,表示低量程;a 为hz;b 为khz;y[15..0]输出结果显示。
xianship[7..0]data[19..0]clk3ecinst1y[15..0]ab
16
七、 实验结果及分析
本次试验通过由一个信号发生器给出输入,当给定频率
523hz时,显示523,同时hz灯亮;给定1240是显示124,同时khz灯亮。当给出4360时显示435同时khz灯亮。出现这一现象的原因主要是频率有点高。直接测频法主要用于测低频,精度要求不是特别高。当给定一个占空比57/100的脉冲信号时,显示56/100。精度有一定的误差,这种误差的主要来源有系统误差,测量误差。测量误差主要有:一、给的信号不成比例;二、信号频率过低。占空比模块用的等精度法主要用于测高频,在测低频时有一定的误差。可以通过规范操作来消除这部分带来的误差。
八、心得体会
通过本次课程设计,是我对自己的动手能力又有了新的提高。尽管在程序编写、下载和调试过程中,一度遇到过众多困难,在老师的细心指导和同学的一起努力下才得以解决。制作过程是一个考验人耐心的过程,不能有丝毫的急躁,马虎,对电路的调试要一步一步来,不能急躁,因为是在电脑上调试,比较慢,又要求我们有一个比较正确的调试方法,像把频率调准等等。再有
就是通过这次课程设计,让我了解了自己知识的匮乏,有待进一步的提高。感谢这几天齐老师以及同学们的热情帮助。
参考文献
(1) 何小艇 《电子系统设计》 浙江大学出版社 2008.1
(2) 赵俊超等.集成电路设计VHDL教程.北京:北京希望电子出版社,2002
(3) 王振红.VHDL数字电路设计与应用实践教程.北京:机械工业出版社,2003
(4)EDA技术使用教程 科学出版社 潘松 编著
(5)新型集成器件实用电路,杨帮文,电子工业出版社,2002年
17
附录一:
附录二:
1、ADC0809控制模块 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY ADCINT IS
PORT(D : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --来自0809转换好的8位数据
CLK : IN STD_LOGIC; --状态机工作时钟
EOC : IN STD_LOGIC; --转换状态指示,低电平表示正在转换
ALE : OUT STD_LOGIC; --8个模拟信号通道地址锁存信号
START : OUT STD_LOGIC; --转换开始信号
OE : OUT STD_LOGIC; --数据输出3态控制信号
ADDA : OUT STD_LOGIC; --信号通道最低位控制信号
LOCK0 : OUT STD_LOGIC; --观察数据锁存时钟
Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
18
--8位数据输出
END ADCINT;
ARCHITECTURE behav OF ADCINT 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';--当ADDA<='0',模拟信号进入通道IN0;当ADDA<='1',则进入通道IN1
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; --0809初始化
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; --EOC=1表明转换结束
ELSE next_state <= st2; END IF ; --转换未结束,继续等待
WHEN st3=> ALE<='0';START<='0';LOCK<='0';OE<='1'; next_state <= st4;--开启OE,输出转换好的数据
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 ; -- 由信号current_state将当
19
前状态值带出此进程:REG
LATCH1: PROCESS (LOCK) -- 此进程中,在LOCK的上升沿,将转换好的数据锁入
BEGIN
IF LOCK='1' AND LOCK'EVENT THEN REGL <= D ; END IF;
END PROCESS LATCH1 ; END behav; 2、比较模块 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all;
entity compre is port(y:out std_logic;
q:in std_logic_vector(7 downto 0)); end;
architecture bhv of compre is begin process(q) begin
if q>=\"00101000\" then y<='1'; else y<='0'; end if;
end process; end;
3、占空比模块 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity ratio is
port(f,clk2:in std_logic;
y:out std_logic_vector(7 downto 0)); end;
20
architecture bhv of ratio is
signal k1:integer range 0 to 999999; signal m1:integer range 0 to 199999; signal m:integer range 0 to 99;
signal y1:std_logic_vector(7 downto 0); signal a,c,ff,f3,f2:std_logic; begin
p1:process(f) begin
if f'event and f='1' then ff<=not ff; end if;
end process p1; p2:process(f,ff) begin
if f='0' and ff='0' then f3<='1';else f3<='0';end if; if f='1' and ff='1' then f2<='1';else f2<='0';end if; a<=not ff;c<=ff; end process p2; p3:process(a) begin
if a'event and a='1' then y<=y1; end if;
end process p3;
p4:process(f3,c,clk2) begin
if f3='1' then k1<=0;m1<=0; else
if clk2'event and clk2='1' then if c='1' then k1<=k1+1; end if; end if;
if clk2'event and clk2='1' then if f2='1' then m1<=m1+1;
21
end if; end if; end if;
end process p4; p5:process(m1,k1) begin
m<=m1*100/k1;
y1(3 downto 0)<=conv_std_logic_vector(m rem 10,4); y1(7 downto 4)<=conv_std_logic_vector(m/10 rem 10,4); end process p5; end;
4、计数模块 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity cntf is
port(clk1,fin:in std_logic; c:out std_logic;
data:out std_logic_vector(19 downto 0)); end;
architecture bhv of cntf is signal clk_1:std_logic; signal x,y,z:std_logic; signal oe:std_logic:='0';
signal dout:std_logic_vector(19 downto 0); begin
p1:process(clk1) begin
if clk1'event and clk1='1' then clk_1<=not clk_1; end if;
end process p1;
p2:process(clk1,clk_1) begin
if clk1='0' and clk_1='0' then y<='1'; else y<='0';
22
end if;
x<=not clk_1; z<=clk_1; end process p2; p3:process(x) begin
if x'event and x='1' then data<=dout;c<=oe; end if;
end process p3; p4:process(fin,y,z) begin
if y='1' then dout<=(others=>'0');oe<='0'; elsif fin'event and fin='1' then if z='1' and oe='0' then
if dout(3 downto 0)=\"1001\" then if dout(7 downto 4)=\"1001\" then if dout(11 downto 8)=\"1001\" then if dout(15 downto 12)=\"1001\" then if dout(19 downto 16)=\"1001\" then oe<='1';
else dout(19 downto 16)<=dout(19 downto 16)+'1';oe<='0'; end if;
dout(15 downto 12)<=\"0000\";
else dout(15 downto 12)<=dout(15 downto 12)+'1'; end if;
dout(11 downto 8)<=\"0000\";
else dout(11 downto 8)<=dout(11 downto 8)+'1'; end if;
dout(7 downto 4)<=\"0000\";
else dout(7 downto 4)<=dout(7 downto 4)+'1'; end if;
dout(3 downto 0)<=\"0000\";
else dout(3 downto 0)<=dout(3 downto 0)+'1'; end if; end if; end if;
end process p4;
23
end;
5、显示模块 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity xianshi is
port(p:in std_logic_vector(7 downto 0);
data:in std_logic_vector(19 downto 0); clk3,e,c:in std_logic; a,b:out std_logic;
y:out std_logic_vector(15 downto 0)); end;
architecture bhv of xianshi is begin
process(c,e) begin
if c='1' then y<=\"0000000000000000\";a<='0';b<='0'; elsif clk3'event and clk3='1' then if e='1' then
y(7 downto 0)<=p;y(15 downto 8)<=\"00000000\"; elsif data(15 downto 12)=\"0000\" then y<=data(15 downto 0);a<='1';b<='0'; else y<=data(19 downto 4);b<='1';a<='0'; end if; end if;
end process; end;
24
评 语
成绩:
25
26
因篇幅问题不能全部显示,请点此查看更多更全内容