EDA课程设计报告频率计.docx

上传人:b****5 文档编号:28506154 上传时间:2023-07-18 格式:DOCX 页数:10 大小:193.43KB
下载 相关 举报
EDA课程设计报告频率计.docx_第1页
第1页 / 共10页
EDA课程设计报告频率计.docx_第2页
第2页 / 共10页
EDA课程设计报告频率计.docx_第3页
第3页 / 共10页
EDA课程设计报告频率计.docx_第4页
第4页 / 共10页
EDA课程设计报告频率计.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

EDA课程设计报告频率计.docx

《EDA课程设计报告频率计.docx》由会员分享,可在线阅读,更多相关《EDA课程设计报告频率计.docx(10页珍藏版)》请在冰豆网上搜索。

EDA课程设计报告频率计.docx

EDA课程设计报告频率计

 

课程设计报告

 

一、设计目的和要求

1.课程设计目的

(1).熟悉CPLD的开发软件的基本使用。

(2).理解频率计的测量原理。

(3).掌握CPLD逻辑电路设计方法。

(4).掌握虚拟数字频率计的软件设计。

2.课程设计的基本要求

在CPLD中设计一个数字频率计电路,设计要求为:

测量范围:

1Hz~1MHz。

3.课程设计类型

Vhdl程序设计

二、仪器和设备

1.电脑

2.max+plus2软件

三、设计过程

1.设计内容和要求

在CPLD中设计一个数字频率计电路,设计要求为:

测量范围:

1Hz~1MHz。

2.设计方法和开发步骤

3.设计思路

下图是8位十进制数字频率计的电路逻辑图,它由1个测频控制信号发生器TESTCTL、8个有时钟使能的十进制计数器的CNT10、1个32位锁存器REG32B组成。

1)测频控制信号发射器的设计

频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。

这就要求TESTCTL的计数使能信号TSTEN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制。

当TSTEN高电平时,允许计数;低电平时,停止计数,并保持其所计的数。

在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进32位锁存器REG32B中,由外部的7段译码器译出并稳定显示,锁存信号之后必须有一清零信号CLR_CNT对计数器进行清零,为下一秒的计数操作作准备。

测频控制信号发生器是先建立一个由D触发器构成的二分频器,再在每次时钟CLK上沿到来时其值翻转。

其中,控制信号时钟CLK的频率取1Hz,而信号TSTEN的脉宽恰好是1s,可以用做闸门信号。

此时,根据测频的时序要求,可得出信号LOAD和CLR_CNT的逻辑描述。

在计数完成后,即计数使能信号TSTEN在1s的高电平后,利用其反相值的上跳沿产生一个锁存信号LOAD,0.5秒后,CLR_CNT产生一个清零信号上跳沿。

2)寄存器REG32B的设计

设置锁存器的好处是,显示的数据稳定,不会由于周期性的清零信号而不断闪烁。

若已有32位BCD码存在于此模块的输入口,在信号LOAD的上升沿后即被锁存到寄存器REG32B的内部,并由REG32B的输出端输出,然后由实验板上的7段译码器译成能在数码管上显示的相对应的数值。

3)十进制计数器CNT10的设计

此十进制计数器的特殊之处是,有一时钟使能输入端ENA,用于锁定当前值。

当高电平时允许计数,低电平时计数禁止。

4、设计难点

在设计到最后把各个模块组到一块时,有的端口定义不太容易明确。

四、设计结果与分析

1.思路问题以及测试结果失败分析

1 在做组合freq的模块时,由于对每个端口不明确,所以编程时出现了错误,后来仔细的研究了每个模块的端口,然后把端口定义正确了。

2 然后对freq的波形图进行仿真,刚开始由于设计的频率太高了,导致在计算的时候要话费太多时间,后来经过老师提点,把endtime调成8s和fsin的multipledby调成最大的32000,才把结果调小。

最终的结果与理论值几乎没有误差。

2.程序简要说明

1 10进制计数器模块

libraryieee;

useieee.std_logic_1164.all;

entitycnt10is

port(clk:

instd_logic;--计数时钟信号

clr:

instd_logic;--清零信号

ena:

instd_logic;--计数使能信号

cq:

outintegerrange0to15;-4位计数结果输出

carry_out:

outstd_logic);--计数进位

endentitycnt10;

architectureartofcnt10is

signalcqi:

integerrange0to15;

begin

process(clk,clr,ena)is

begin

ifclr='1'thencqi<=0;--计数器异步清零

elsifclk'eventandclk='1'then

ifena='1'then

ifcqi<=9thencqi<=cqi+1;

elsecqi<=0;endif;--等于9,则计数器清零

endif;

endif;

endprocess;

process(cqi)is

begin

ifcqi=9thencarry_out<='1';

elsecarry_out<='0';endif;--进位输出

endprocess;

cq<=cqi;

endarchitectureart;

在该模块下,定义了控制输入端ena和清零端clr,clk,输出端carry_out,进数端cq。

仿真图形如下:

2 32位锁存器

libraryieee;

useieee.std_logic_1164.all;

entityreg32bis

port(load:

instd_logic;--使能信号

din:

instd_logic_vector(31downto0);--输入信号

dout:

outstd_logic_vector(31downto0));--输出信号

endentityreg32b;

architectureartofreg32bis

begin

process(load,din)is

begin

ifload'eventandload='1'thendout<=din;

endif;

endprocess;

endarchitectureart;

该模块的作用是使得数据输出时可以使得信号稳定。

在程序里定义了load控制端,din输入端,dout输出端。

仿真图形如下:

3 测频控制信号发生源

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitytestctlis

port(clk:

instd_logic;--1Hz测频时钟信号

tsten:

outstd_logic;--计数器时钟使能

clr_cnt:

outstd_logic;--计数器清零

load:

outstd_logic);--输出锁存信号

endentitytestctl;

architectureartoftestctlis

signaldiv2clk:

std_logic;

begin

process(clk)is

begin

ifclk'eventandclk='1'then

div2clk<=notdiv2clk;

endif;

endprocess;--1Hz时钟二分频

process(clk,div2clk)is

begin

ifclk='0'anddiv2clk='0'then--产生计数器清零信号

clr_cnt<='1';

elseclr_cnt<='0';endif;

endprocess;

load<=notdiv2clk;tsten<=div2clk;

endarchitectureart;

该模块实现了二分频。

4 组合模块freq

libraryieee;

useieee.std_logic_1164.all;

entityfreqis

port(fsin:

instd_logic;--输入信号

clk:

instd_logic;--1Hz的时钟脉冲

dout:

outstd_logic_vector(31downto0));--输出32位计数结果

endentityfreq;

architectureartoffreqis

componentcnt10is-待调用的有时钟使能的十进制计数器端口定义

port(clk,clr,ena:

instd_logic;--端口声明

cq:

outstd_logic_vector(3downto0);

carry_out:

outstd_logic);

endcomponentcnt10;

componentreg32bis--待调用的3位锁存器端口定义

port(load:

instd_logic;

din:

instd_logic_vector(31downto0);

dout:

outstd_logic_vector(31downto0));

endcomponentreg32b;

componenttestctlis-待调用的测频控制信号发生器端口定义

port(clk:

instd_logic;

tsten,clr_cnt,load:

outstd_logic);

endcomponenttestctl;

signalse,sc,sl:

std_logic;

signals1,s2,s3,s4,s5,s6,s7,s8:

std_logic;

signalsd:

std_logic_vector(31downto0);

begin

u0:

testctlportmap(clk=>clk,tsten=>se,clr_cnt=>sc,load=>sl);--名字关联

u1:

cnt10portmap(clk=>fsin,clr=>sc,ena=>se,

cq=>sd(3downto0),carry_out=>s1);

u2:

cnt10portmap(clk=>s1,clr=>sc,ena=>se,

cq=>sd(7downto4),carry_out=>s2);

u3:

cnt10portmap(s2,sc,se,sd(11downto8),s3);

u4:

cnt10portmap(s3,sc,se,sd(15downto12),s4);

u5:

cnt10portmap(s4,sc,se,sd(19downto16),s5);

u6:

cnt10portmap(s4,sc,se,sd(23downto20),s6);

u7:

cnt10portmap(s4,sc,se,sd(27downto24),s7);

u8:

cnt10portmap(s4,sc,se,sd(31downto28),s8);

u9:

reg32bportmap(load=>sl,din=>sd(31downto0),dout=>dout);

endarchitectureart;

该模块把前面涉及到的各个模块都整合到了一块。

从而实现了测量频率。

该模块有fsin输入端,clk为1kHz的方波。

以及输出dout。

仿真图形如下:

理论的结果值是134左右,我们做出来的结果是133。

这个误差在电子测量里叫加减一误差。

小结:

经过本次的课程设计,我学会了频率计的基本工作原理,并对eda程序设计有了更深的了解。

可以说是学到了很多的东西。

但即便如此,我还是发现了其他问题,如原理图里的输入输出端口怎么定义的,我还没搞明白,在用它仿真时老出错误。

这个问题还有待研究解决。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 计算机硬件及网络

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1