数字电路与数字逻辑大型实验报告.docx
- 文档编号:8145373
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:16
- 大小:1.49MB
数字电路与数字逻辑大型实验报告.docx
《数字电路与数字逻辑大型实验报告.docx》由会员分享,可在线阅读,更多相关《数字电路与数字逻辑大型实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
数字电路与数字逻辑大型实验报告
数字电路与数字逻辑大型实验报告
姓名
学号
指导老师
专业班级
学院
提交日期
一、实验内容
1.理解硬件描述语言VHDL的基本语法;
2.掌握简单数字系统“自顶而下”的设计方法;
3.掌握EDA软件Quartusii的操作方法;
4.4位数字频率计的设计;
二、4位数字频率计设计
1.设计题目
设计一4位数字频率计,测量范围为0~9999Hz,假设被测信号为标准的方波信号。
2.方案设计及原理
图1.数字频率计原理图
原理简述:
如图所示,当闸门信号(宽度为1S的正脉冲)到来时,闸门开通,被测信号通过闸门送到计数器,计数器开始计数,当闸门信号结束时,计数器停止计数。
由于闸门开通的时间为1S,计数器的计数值就是被测信号的频率。
为了使测得的频率值准确,在闸门开通之前,计数器必须清零。
为了使显示电路稳定地显示频率值,在计数器和显示电路之间加了锁存器,当计数器计数结束时,将计数值通过锁存信号送到锁存器。
控制电路在时基电路的控制下产生三个信号:
闸门信号、锁存信号和清零信号。
各信号之间的时序关系如下图所示:
被测信号:
闸门信号:
计数脉冲:
清零信号:
锁存信号:
图2.数字频率计工作时序
3.顶层原理图设计
图3.4位数字频率计顶层原理图
说明:
根据数字频率计的工作原理和设计方案,可得到如图3所示的4位数字频率计的顶层设计原理图。
原理图包括计数器CNT10、锁存器LATCH4、显示译码器LED7S、控制器CONTROL四种底层模块。
4个十进制计数器CNT10级联构成10000进制计数器,使频率计的测量范围达到0000Hz~9999Hz。
CNT10的输出送锁存器LATCH4,LATCH4的输出送显示译码器LED7S。
LED7S的输出驱动7段LED数码管。
CONTROL用于产生图3中所示的清零信号CLR、闸门信号CS、锁存信号LE三种控制信号。
4.底层模块仿真
(1)CNT10模块
CNT10的VHDL语言:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt10is
port(clk:
instd_logic;
clr:
instd_logic;
cs:
instd_logic;
qq:
bufferstd_logic_vector(3downto0);
co:
outstd_logic
);
endcnt10;
architectureoneofcnt10is
begin
process(clk,clr,cs)
begin
if(clr='1')then
qq<="0000";
elsif(clk'eventandclk='1')then
if(cs='1')then
if(qq=9)then
qq<="0000";
else
qq<=qq+1;
endif;
endif;
endif;
endprocess;
process(qq)
begin
if(qq=9)then
co<='0';
else
co<='1';
endif;
endprocess;
endone;
CNT10模块的逻辑符号:
CNT10模块的仿真:
CNT10模块说明:
CNT10模块为十进制加法计数器模块,具有计数、异步清零、计数使能、进位输出功能。
异步清零功能是为了闸门信号有效之前将计数器清零。
计数使能由闸门信号控制,闸门信号高电平时允许计数,低电平时停止计数(保持状态)。
进位输出是用于计数器之间的级联,即前级计数器的进位输出作为后级计数器的时钟输入。
需要指出的是,由于CNT10模块采用时钟的上升沿计数,计数器的进位输出应采用负脉冲,避免后级计数器提前加1计数。
(2)LATCH4模块
LATCH4的VHDL语言:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitylatch4is
port(le:
instd_logic;
dd:
instd_logic_vector(3downto0);
qq:
outstd_logic_vector(3downto0)
);
endlatch4;
architectureoneoflatch4is
begin
process(le,dd)
begin
if(le='1')then
qq<=dd;
endif;
endprocess;
endone;
LATCH4模块的逻辑符号:
LATCH4模块的仿真:
LATCH4模块说明:
LATCH4模块为4位锁存器模块,在锁存信号的高电平期间,锁存器输出跟
随输入变化,在锁存信号的下降沿,将输入值锁存,输出值保持不变。
(3)CONTROL模块
CONTROL的VHDL语言:
libraryieee;
useieee.std_logic_1164.all;
entitycontrolis
port(clk:
instd_logic;
cs,clr,le:
outstd_logic);
endcontrol;
architecturebehaveofcontrolis
signalcurrent_state,next_state:
std_logic_vector(3downto0);
constantst0:
std_logic_vector:
="0000";
constantst1:
std_logic_vector:
="0001";
constantst2:
std_logic_vector:
="0011";
constantst3:
std_logic_vector:
="0010";
constantst4:
std_logic_vector:
="0110";
constantst5:
std_logic_vector:
="1110";
constantst6:
std_logic_vector:
="1111";
constantst7:
std_logic_vector:
="1101";
constantst8:
std_logic_vector:
="1100";
constantst9:
std_logic_vector:
="1000";
begin
com1:
process(current_state)
begin
casecurrent_stateis
whenst0=>next_state<=st1;clr<='1';cs<='0';le<='0';
whenst1=>next_state<=st2;clr<='0';cs<='1';le<='0';
whenst2=>next_state<=st3;clr<='0';cs<='1';le<='0';
whenst3=>next_state<=st4;clr<='0';cs<='1';le<='0';
whenst4=>next_state<=st5;clr<='0';cs<='1';le<='0';
whenst5=>next_state<=st6;clr<='0';cs<='1';le<='0';
whenst6=>next_state<=st7;clr<='0';cs<='1';le<='0';
whenst7=>next_state<=st8;clr<='0';cs<='1';le<='0';
whenst8=>next_state<=st9;clr<='0';cs<='1';le<='0';
whenst9=>next_state<=st0;clr<='0';cs<='0';le<='1';
whenothers=>next_state<=st0;clr<='0';cs<='0';le<='0';
endcase;
endprocesscom1;
reg:
process(clk)
begin
if(clk'eventandclk='1')then
current_state<=next_state;
endif;
endprocessreg;
endbehave;
CONTROL模块的逻辑符号:
CONTROL模块的仿真:
CONTROL模块说明:
控制模块CONTROL用于产生满足图2所示时序要求的控制信号。
状态机的
状态编码采用格雷码,以消除状态译码时由于竞争冒险产生的干扰窄脉冲。
通
过状态译码产生三个控制信号:
第0状态时,清零信号(CLR)置为高电平;第
1~8状态时,闸门信号(cs)置为高电平,闸门信号的高电平持续时间等于8
个状态维持时间,因此,其脉冲宽度刚好为1s;第9状态时,锁存信号(LE)
置为高电平。
(4)LED7S模块
LED7S的VHDL语言:
libraryieee;
useieee.std_logic_1164.all;
entityled7sis
port(din:
instd_logic_vector(3downto0);
y:
outstd_logic_vector(6downto0)
);
end;
architectureoneofled7sis
begin
process(din)
begin
casedinis
when"0000"=>y<="1000000";
when"0001"=>y<="1111001";
when"0010"=>y<="0100100";
when"0011"=>y<="0110000";
when"0100"=>y<="0011001";
when"0101"=>y<="0010010";
when"0110"=>y<="0000010";
when"0111"=>y<="1111000";
when"1000"=>y<="0000000";
when"1001"=>y<="0010000";
when"1010"=>y<="0001000";
when"1011"=>y<="0000011";
when"1100"=>y<="1000110";
when"1101"=>y<="0100001";
when"1110"=>y<="0000110";
when"1111"=>y<="0001110";
whenothers=>y<=null;
endcase;
endprocess;
end;
LED7S模块的逻辑符号:
LED7S模块的仿真:
LED7S模块说明:
LED7S为显示译码器,是将BCD码译成驱动数码管所需代码的译码器。
顶层原理的仿真:
5.引脚锁定和下载测试
(1)引脚锁定:
实验截图:
操作步骤:
、选择Assignments→Pin命令,打开引脚锁定窗口;
、用鼠标双击‘Location’栏中的空白处,在出现的下拉栏中选择把对应端
口信号名的器件引脚号。
用相同的方法依次把所有的计数器输出锁定到相
应的引脚。
(注意:
该实验板采用的FPGA型号为EP2C3F672C8,该芯片的总引脚数远大于频率计所需的引脚,为了避免未用引脚对其他电路产生影响,在编译之前应将EP2C3F672C8未用的I/O引脚设为‘输入高阻’。
具体操作:
、选择Assignments→Device;
、单击‘Device&PinOption’按钮;
、单击‘UnusedPins’,在对话框中选择‘Asinputtri-stated’按‘确定键’。
)
、对工程重新编译,以将引脚对应关系存入设计。
(2)下载测试:
实验截图:
实验板的实验照片:
操作步骤:
、用USB下载电缆将PC机与实验板连接,合上电源开关;
、选择Tool→Programmer菜单,进入下载和编辑窗口;
、单击编辑窗口左上方的‘HardwareSetup’按钮,在打开的窗口中选择
‘USB-Blaster’;
、在编辑模式‘Mode’中选择‘JTAG’,并用鼠标选中Program/Configure
下方的小方框;
、单击‘Start’按钮,开始下载,当‘Progress’显示100%时,下载结束。
四、实验总结
本次数字电路大型实验让我颇有体会,不仅让我们掌握了VHDL语言,而且还让我们学会了Quartus
的使用,从中我们知道了如何利用VHDL语言构建模块、如何进行模块的仿真、如何进行顶层原理的设计等这些使我们受益良多,同时还让我们学会了硬件电路设计的又一种新的方法。
并且通过这次实验的亲身操作,增强了我们自己的动手能力,也提高了我们的学习能力,以后如果碰到硬件电路的设计,就会轻松的多,就可以用现在学过的知识运用到实践中去。
不过在实验中,我也碰到了一些问题,例如,在构建原理图编译时碰到有错误的问题,这时可能是由于原理图中线没连好的缘故而不是VHDL语言的错误造成的。
当时我们碰到这个问题时一直以为是某一模块的VHDL语言出现问题,于是一直在对VHDL语言进行检查,后来才知道我们是受C++这些语言影响太大,一有错就以为是代码的问题,而忽略了电路图的问题。
(其实VHDL语言在模块的编译时如果没有报错,那在以后的原理图的使用时一般也不会报错)
最后的建议就是:
如果能够在平时多一点VHDL语言的教学就更好了,我们这次实验的模块的编写基本是照本宣科,就是在重复把书上的代码转移到电脑里,其实我们对各个模块的VHDL为什么要这么编写,为什么这样就能表示出他们的功能基本不知道,所以如果在平时多一点这方面的教学,再通过这次大型实验,那我们基本上就能掌握VHDL语言的基本应用,这样更有实践性。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字电路 数字 逻辑 大型 实验 报告