基于CPLD的简易数字频率计.docx

上传人:b****1 文档编号:15000892 上传时间:2023-06-29 格式:DOCX 页数:23 大小:470.20KB
下载 相关 举报
基于CPLD的简易数字频率计.docx_第1页
第1页 / 共23页
基于CPLD的简易数字频率计.docx_第2页
第2页 / 共23页
基于CPLD的简易数字频率计.docx_第3页
第3页 / 共23页
基于CPLD的简易数字频率计.docx_第4页
第4页 / 共23页
基于CPLD的简易数字频率计.docx_第5页
第5页 / 共23页
基于CPLD的简易数字频率计.docx_第6页
第6页 / 共23页
基于CPLD的简易数字频率计.docx_第7页
第7页 / 共23页
基于CPLD的简易数字频率计.docx_第8页
第8页 / 共23页
基于CPLD的简易数字频率计.docx_第9页
第9页 / 共23页
基于CPLD的简易数字频率计.docx_第10页
第10页 / 共23页
基于CPLD的简易数字频率计.docx_第11页
第11页 / 共23页
基于CPLD的简易数字频率计.docx_第12页
第12页 / 共23页
基于CPLD的简易数字频率计.docx_第13页
第13页 / 共23页
基于CPLD的简易数字频率计.docx_第14页
第14页 / 共23页
基于CPLD的简易数字频率计.docx_第15页
第15页 / 共23页
基于CPLD的简易数字频率计.docx_第16页
第16页 / 共23页
基于CPLD的简易数字频率计.docx_第17页
第17页 / 共23页
基于CPLD的简易数字频率计.docx_第18页
第18页 / 共23页
基于CPLD的简易数字频率计.docx_第19页
第19页 / 共23页
基于CPLD的简易数字频率计.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于CPLD的简易数字频率计.docx

《基于CPLD的简易数字频率计.docx》由会员分享,可在线阅读,更多相关《基于CPLD的简易数字频率计.docx(23页珍藏版)》请在冰点文库上搜索。

基于CPLD的简易数字频率计.docx

基于CPLD的简易数字频率计

等级:

 

课程设计

 

课程名称

嵌入式系统课程设计

课题名称

基于CPLD的简易数字频率计

专业

电子信息工程

班级

电信1303

学号

xxxxxxxxxxxxxxxxxxxx

姓名

XX

指导老师

陈爱萍

 

2016年12月20日

电气信息学院

课程设计任务书

课题名称

基于CPLD的简易数字频率计

姓名

xx

专业

电子信息工程

班级

xxxx

学号

xx

指导老师

陈爱萍

课程设计时间

2016年12月18日-2016年12月30日(17、18周)

教研室意见

意见:

同意审核人:

刘望军

一、任务及要求

CPLD为复杂可编程逻辑器件,通过EDA技术对其进行编程,设计数字频率计,并最终完成电路的编程调试。

具体要求如下:

数字频率计是一种用数字显示的频率测量仪表,它不仅可以测量正弦信号、方波信号的频率,还可以测量如机械振动次数、物体转动次数、单位时间里经过传送带的产品数量等多种物理量。

技术指标:

(1)、频率测量范围:

1/10——9999Hz。

(2)、输入被测信号幅度Vi<100mV。

(3)、测量1s和10s时间内的脉冲数。

(4)、显示时间分“手动”和“自动”两档。

二、进度安排

第一周:

周一:

集中布置课程设计相关事宜。

周二~周三:

子模块程序设计,顶层电路程序设计。

周四~周日:

子模块,顶层电路仿真。

第二周:

周一~周三:

编程下载,系统调试。

周四~周五:

设计报告撰写。

周五进行答辩和设计结果检查。

 

一.总体设计

1.设计总体思路

采用现场可编程门阵列(FPGA)为控制核心,利用VHDL语言编程,下载烧制实现。

将所有器件集成在一块芯片上,体积大大减小的同时还提高了稳定性,可实现大规模和超大规模的集成电路,测频测量精度高,测量频率范围大,而且编程灵活、调试方便.

2.基本原理

频率计的基本原理是用高频信号基准时钟,对比测量其他信号的频率。

通常情况下计算每秒内待测信号的脉冲个数,即闸门时间为1s。

闸门时间可以根据需要取值,大于或小于1s都可以。

闸门时间越长,得到的频率值就越准确。

闸门时间越短,测得的频率值刷新就越快。

一般取1s作为闸门时间。

数字频率计的关键组成部分包括分频器,计数器、锁存器、片选电路,译码驱动电路和显示电路.

3.总体框图

图1-3-1数字频率计总体框图

 

二.各个单元模块设计

1.分频器模块

本次实验主要采用的是计数器构成分频电路,对1KHz的时钟脉冲进行分频。

这里使用的是10分频,一个输出给计数器,一个给锁存器。

源程序:

libraryieee;

useieee.std_logic_1164.all;

entityfen_ck22is

port(clk:

instd_logic;

q:

outstd_logic);

end;

architecturefen_arcoffen_ck22is

begin

process(clk)

variablecnt:

integerrange0to9;

variablex:

std_logic;

begin

ifclk'eventandclk='1'

thenifcnt<9then

cnt:

=cnt+1;

else

cnt:

=0;

x:

=notx;

endif;

endif;

q<=x;

endprocess;

endfen_arc;

电路模块如图所示:

图2-1-1分频模块

仿真波形如图:

图2-1-2分频模块仿真波形

2.计数器模块

这个模块主要是记录待测信号经过了多少的波峰,将其转换成数量。

然后给锁存器锁存。

源程序:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitycount_ck22is

port(clr,sig,door:

instd_logic;

alm:

outstd_logic;

q3,q2,q1,q0,dang:

outstd_logic_vector(3downto0));

end;

architecturecount22_arcofcount_ck22is

begin

process(door,sig)

variablec3,c2,c1,c0:

std_logic_vector(3downto0);

variablex:

std_logic;

begin

ifsig'eventandsig='1'then

ifclr='0'then

alm<='0';

c3:

="0000";

c2:

="0000";

c1:

="0000";

c0:

="0000";

elsifdoor='0'then

c3:

="0000";

c2:

="0000";

c1:

="0000";

c0:

="0000";

elsifdoor='1'then

ifc0<"1001"then

c0:

=c0+1;

else

c0:

="0000";

ifc1<"1001"then

c1:

=c1+1;

elsec1:

="0000";

ifc2<"1001"then

c2:

=c2+1;

else

c2:

="0000";

ifc3<"1001"then

c3:

=c3+1;

else

c3:

="0000";

alm<='1';

endif;

endif;

endif;

endif;

endif;

ifc3/="0000"then

q3<=c3;

q2<=c2;

q1<=c1;

q0<=c0;

dang<="0100";

elsifc2/="0000"then

q3<="0000";

q2<=c2;

q1<=c1;

q0<=c0;

dang<="0011";

elsifc1/="0000"then

q3<="0000";

q2<="0000";

q1<=c1;

q0<=c0;

dang<="0010";

else

q3<="0000";

q2<="0000";

q1<="0000";

q0<=c0;

dang<="0001";

endif;

endif;

endprocess;

endcount22_arc;

模块如图所示:

图2-2-1计数器模块

仿真波形如图:

图2-1-2计数器模块仿真波形

3.锁存器模块

此模块主要是锁存来自于计数器的数据然后传送给编码器。

libraryieee;

useieee.std_logic_1164.all;

entitylock_ck22is

port(l:

instd_logic;

a4,a3,a2,a1,a0:

instd_logic_vector(3downto0);

q4,q3,q2,q1,q0:

outstd_logic_vector(3downto0));

end;

architecturelock22_arcoflock_ck22is

begin

process(l)

variablet4,t3,t2,t1,t0:

std_logic_vector(3downto0);

begin

ifl'eventandl='0'then

t4:

=a4;

t3:

=a3;

t2:

=a2;

t1:

=a1;

t0:

=a0;

endif;

q4<=t4;

q3<=t3;

q2<=t2;

q1<=t1;

q0<=t0;

endprocess;

endlock22_arc;

模块如图所示:

图2-3-1锁存器模块

 

仿真波形图如下:

图2-3-2锁存器模块仿真波形

4.编码器模块

从前面的锁存器模块接受由计数器记录的数据并且编码,并且接受片选模块来的信号,根据来自片选模块的信号选择锁存器中的数据编码,然后给后面的显示译码器。

libraryieee;

useieee.std_logic_1164.all;

entitybm_ck22is

port(sel:

instd_logic_vector(2downto0);

a3,a2,a1,a0,dang:

instd_logic_vector(3downto0);

q:

outstd_logic_vector(3downto0));

end;

architecturebm_ck22_arcofbm_ck22is

begin

process(sel)

begin

caseselis

when"000"=>q<=a0;

when"001"=>q<=a1;

when"010"=>q<=a2;

when"011"=>q<=a3;

when"111"=>q<=dang;

whenothers=>q<="1111";

endcase;

endprocess;

end;

电路图如图所示:

图2-4-1编码器模块

仿真波形图如下:

图2-4-2编码器模块仿真波形

5.片选模块

通过时钟信号clk产生片选信号,此信号主要是给后面的模块选择数码管的位置,输出显示信号。

源程序:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityph_ck22is

port(clk:

instd_logic;

q:

outstd_logic_vector(2downto0));

end;

architectureph_ck22_arcofph_ck22is

begin

process(clk)

variablecnt:

std_logic_vector(2downto0);

begin

ifclk'eventandclk='1'then

cnt:

=cnt+1;

endif;

q<=cnt;

endprocess;

end;

电路图如图所示:

图2-5-1片选模块

仿真波形如图:

图2-5-2片选模块仿真波形

6.显示模块

此模块主要是接受上个模块的编码信号,然后通过显示译码给数码管。

源程序:

libraryieee;

useieee.std_logic_1164.all;

entitydisplay_ck22is

port(d:

instd_logic_vector(3downto0);

q:

outstd_logic_vector(6downto0));

end;

architecturedisplay_ck22_arcofdisplay_ck22is

begin

process(d)

begin

casedis

when"0000"=>q<="0111111";

when"0001"=>q<="0000110";

when"0010"=>q<="1011011";

when"0011"=>q<="1001111";

when"0100"=>q<="1100110";

when"0101"=>q<="1101101";

when"0110"=>q<="1111101";

when"0111"=>q<="0100101";

when"1000"=>q<="1111111";

when"1001"=>q<="1101111";

whenothers=>q<="0000000";

endcase;

endprocess;

end;

电路图如图所示:

图2-6-1显示模块

仿真波形如图:

图2-6-2显示模块仿真波形

7.片选信号模块

片选信号模块的作用就是接受片选模块信号,选择数码管。

源程序:

libraryieee;

useieee.std_logic_1164.all;

entityphs_ck22is

port(d:

instd_logic_vector(2downto0);

q:

outstd_logic_vector(7downto0));

end;

architecturephs_ck22_arcofphs_ck22is

begin

process(d)

begin

casedis

when"000"=>q<="00000001";

when"001"=>q<="00000010";

when"010"=>q<="00000100";

when"011"=>q<="00001000";

when"100"=>q<="00010000";

when"101"=>q<="00100000";

when"110"=>q<="01000000";

when"111"=>q<="10000000";

whenothers=>q<="00000000";

endcase;

endprocess;

end;

电路图如图所示:

图2-7-1片选信号模块

仿真波形图:

图2-7-2片选信号模块仿真波形

三、顶层文件设计

用元件例化语句写一个顶层文件

libraryieee;

useieee.std_logic_1164.all;

entityck22is

port(sig,clr,clk,door:

instd_logic;

alm:

outstd_logic;

q:

outstd_logic_vector(6downto0);

se:

outstd_logic_vector(7downto0));

endck22;

architectureartofck22is

componentcount_ck22

port(clr,sig,door:

instd_logic;

alm:

outstd_logic;

q3,q2,q1,q0,dang:

outstd_logic_vector(3downto0));

endcomponent;

componentfen_ck22

port(clk:

instd_logic;

q:

outstd_logic);

endcomponent;

componentlock_ck22

port(l:

instd_logic;

a4,a3,a2,a1,a0:

instd_logic_vector(3downto0);

q4,q3,q2,q1,q0:

outstd_logic_vector(3downto0));

endcomponent;

componentph_ck22

port(clk:

instd_logic;

q:

outstd_logic_vector(2downto0));

endcomponent;

componentbm_ck22

port(sel:

instd_logic_vector(2downto0);

a3,a2,a1,a0,dang:

instd_logic_vector(3downto0);

q:

outstd_logic_vector(3downto0));

endcomponent;

componentdisplay_ck22

port(d:

instd_logic_vector(3downto0);

q:

outstd_logic_vector(6downto0));

endcomponent;

componentphs_ck22

port(d:

instd_logic_vector(2downto0);

q:

outstd_logic_vector(7downto0));

endcomponent;

signalt1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t12:

std_logic_vector(3downto0);

signalt11:

std_logic;

signalt20:

std_logic_vector(2downto0);

begin

u1:

count_ck22portmap(clr=>clr,sig=>sig,door=>door,alm=>alm,q3=>t1,q2=>t2,q1=>t3,q0=>t4,dang=>t5);

u2:

fen_ck22portmap(clk=>clk,q=>t11);

u3:

lock_ck22portmap(l=>t11,a4=>t1,a3=>t2,a2=>t3,a1=>t4,a0=>t5,q4=>t6,q3=>t7,q2=>t8,q1=>t9,q0=>t10);

u4:

ph_ck22portmap(clk=>clk,q=>t20);

u5:

bm_ck22portmap(sel=>t20,a3=>t6,a2=>t7,a1=>t8,a0=>t9,dang=>t10,q=>t12);

u6:

display_ck22portmap(d=>t12,q=>q);

u7:

phs_ck22portmap(d=>t20,q=>se);

endarchitectureart;

通过元件例化语句生成的元件

图3-1

总体仿真波形图:

图3-2总体仿真波形图

四.总体电路图

图4-1总体电路图

五.设计调试

1.软件调试与硬件调试

1.1软件调试

仿真时,打开软件QuartusII,建立工程文件,然后新建7个VHDL文件。

保存后,编译,无误后及可以仿真了。

仿真时最好每个模块单独分开仿真,这样不容易出错。

可以用默认的endtime。

对时钟频率clk不宜过小,最好不要小于1ns否则可能出错,导致无仿真图。

1.2硬件调试

1、连接线路:

选择主菜单“Assignments”中的“pinplanner”按钮,按照引脚锁定连接好线路,要注意有些脚不能连。

连接好后在编译。

2、下载:

单击“Tools”中的“programmer”按钮,下载配置文件,如果连接无误,将出现一个以.cdf为后缀的窗口,有时候硬件可能要手动添加,添加好后,然后点击“start”按钮。

3、按照引脚图将芯片上的线对应接到实验箱中,要注意频率引脚,清零,与开始的,这些要手动操作的管脚。

4、下图为清零时的图,将清零端从低电平置到高电平实现清零。

5、下图为将清零端置低位后,打开开关后数码管上的显示,为320倍时候的显示

6.总结与体会

通过两个星期的课设,我熟悉的掌握的QuartusII的基本操作,刚开始的不太会对VHDL程序的编写,老师建议我们去图书馆找资料,然后通过网上的资料一点一点摸索出来。

制作过程是一个考验人耐心的过程,不能有丝毫的急躁,马虎,对电路的调试要一步一步来,不能急躁。

像把频率调准等等。

这又要我们要灵活处理,在不影响试验的前提下可以加快进度。

合理的分配时间。

在设计电路的时候,最重要的是要熟练地掌握课本上的知识,这样才能对试验中出现的问题进行分析解决。

有时遇到了一个错误怎么找也找不到原因所在,像QuartusII软件仿真时,如果时间设计的不对,波形怎么也出不来。

七.参考文献

1.EDA技术实用教程—VHDL版(第四版)科学出版社潘松黄继业编著

2.电子技术基础(数字部分)清华大学出版社阎石主编

3.电子技术基础(模拟部分)高等教育出版社康华光主编

4.电子技术基础实验高等教育出版社陈大钦主编

5.电子技术课程设计指导高等教育出版社彭介华主编

6.可编程逻辑器件设计及应用机械工业出版社张原编著

 

 

电气信息学院课程设计评分标准

环节

项目

评价

及格

不及格

实践环节(70%)

1、设计方案合理性与创造性

2、编程完成情况

3、电路模块仿真调试结果

4、硬件测试过程及结果

5、解决问题能力及答辩情况

6、纪律和出勤情况

设计报告(30%)

1设计报告内容完整、规范

2设计步骤规范、正确

3仿真调试结果正确、波形清楚

4硬件测试过程规范、结果正确

综合评价

课程设计成绩评定为:

□优□良□中□及格□不及格

 

指导老师签名:

________________

日期:

________________

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

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2