EDA课程设计报告频率计.docx
《EDA课程设计报告频率计.docx》由会员分享,可在线阅读,更多相关《EDA课程设计报告频率计.docx(10页珍藏版)》请在冰豆网上搜索。
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程序设计有了更深的了解。
可以说是学到了很多的东西。
但即便如此,我还是发现了其他问题,如原理图里的输入输出端口怎么定义的,我还没搞明白,在用它仿真时老出错误。
这个问题还有待研究解决。