数字电路大型设计实验.docx
《数字电路大型设计实验.docx》由会员分享,可在线阅读,更多相关《数字电路大型设计实验.docx(30页珍藏版)》请在冰豆网上搜索。
数字电路大型设计实验
数
电
大
型
实
验
报
告
姓名:
陈丽红
班级:
健理1402班
学号:
201424450202
教师:
金老师
一、4位数字频率计设计
1.1设计题目
设计一4位数字频率计,测量范围为0~9999Hz,假设被测信号为标准的方波信号。
1.2设计思路
下图所示为数字频率计的原理框图,对于数字频率计,我们采用“自顶向下”的设计方法。
根据数字频率计的工作原理和设计方案,先绘制顶层设计原理图,再进行底层模块的设计。
图1-1数字频率计原理框图
1.3顶层设计和底层模块设计
1.3.1顶层设计
4位数字频率计的原理图中包括计数器CNT10、锁存器LATCH4、显示译码器LED7S、控制器CONTROL四种底层模块。
4个十进制计数器CNT10级联构成10000进制计数器,使数字频率计的测量范围在0000Hz~9999Hz。
CNT10的输出送给锁存器LATCH4,LATCH4的输出再送给显示译码器LED7S。
LED7S为阳级驱动的7段LED数码管。
控制器CONTROL用来产生所需的清零信号clr、闸门信号cs、锁存信号le三种控制信号。
具体的顶层原理图的设计连接如下图所示。
图1-24位数字频率计原理图
1.3.2底层设计模块
十进制计数器模块CNT10
(1)模块CNT10的VHDL代码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt10is
port(clk,clr,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;
(2)模块CNT10的简单说明
CNT10模块为十进制加法计数器模块,具有计数、异步清零、计数使能、进位输出功能。
清零信号clr可以使计数器在闸门信号cs有效前清零。
计数使能由闸门信号cs控制,当cs高电平时,闸门开通,被测信号通过闸门送到计数器,计数器允许计数,低电平时停止计时。
CNT10模块采用的是时钟上升沿计数,在计数使能的情况下来一个时钟信号clk的上升沿,计数器加1,对于十进制加法计数器,当计数达到10时产生一个进位输出,进位输出co采用负脉冲,避免后级计数器提前加1计数。
实验仿真波形说明了CNT10模块符合设计要求的逻辑功能,仿真结果如下图。
(3)模块CNT10的仿真结果
计数器qq达到10
时,进位输出cs产
生一个负脉冲
cs=1时,每来一个
clk上升沿,qq加1
clr=1时,
qq清零
图1-3CNT10仿真波形
4位锁存器模块LATCH4
(1)模块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;
(2)模块LATCH4的简单说明
LATCH4模块具有的功能为在锁存信号le高电平期间锁存器输出随输入变化,在锁存信号le的下降沿,将输入值锁存,输出值保持不变。
实验仿真波形说明了LATCH4模块符合设计要求的逻辑功能,仿真结果如下图。
(3)模块LATCH4的仿真结果
le=0时,输出值qq保持不变,实现锁存功能
le=1时,dd的数值传递给qq
图1-4LATCH4仿真波形
显示译码器模块LED7S
(1)模块LED7S的VHDL代码
libraryieee;
useieee.std_logic_1164.all;
entityled7sis
port(dd:
instd_logic_vector(3downto0);
y:
outstd_logic_vector(6downto0)
);
endled7s;
architectureoneofled7sis
begin
process(dd)
begin
caseddis
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;
(2)模块LED7S的简单说明
LED7S模块的功能是将数值在LED数码管上显示,根据共阳数码管的特性编写VHDL代码,如输入dd为‘0000’时,输出y为‘1000000’,即数码管中g段LED灯不亮,其它灯亮,显示数字‘0’。
实验仿真波形中数值对应正确,说明了LED7S模块符合设计要求的逻辑功能,仿真结果如下图。
(3)模块LED7S的仿真结果
dd=0000时,y=1000000,数码管显示数字‘0’
图1-5LED7S仿真波形
控制模块CONTROL
(1)模块CONTROL的VHDL代码
libraryieee;
useieee.std_logic_1164.all;
entitycontrolis
port(clk:
instd_logic;
cs,clr,le:
outstd_logic);
endcontrol;
architecturebehavofcontrolis
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;
endbehav;
(2)模块CONTROL的简单说明
CONTROL模块用于产生题目中所给的时序要求的控制信号。
对于状态机,划分各个状态,同时为了消除状态译码时由于竞争冒险产生的干扰窄脉冲,状态编码要采用格雷码。
根据控制器时序图设定每个状态下清零信号clr、闸门信号cs和锁存信号le的电平。
实验仿真结果中产生的波形与题目中给定的一致,说明了CONTROL模块符合设计要求的逻辑功能,仿真结果如下图。
(3)模块CONTROL的仿真结果
框中显示的波形与指导书
中给的控制器时序图一致
图1-6CONTROL仿真波形
1.4设计工程的QuartusII操作流程
(1)建立设计工程
(2)底层模块输入、编译、符号生成、仿真
(3)顶层设计原理图的输入和编译
(4)引脚锁定和编程下载
(5)数字频率计测试
下图为实际操作中的测试结果。
图1-7数字频率计测试结果
二、4位数字乘法器设计
2.1设计题目
试设计一4位二进制乘法器。
4位二进制乘法器的功能框图如下图所示。
输入信号:
4位被乘数A,4位乘数B,启动信号START。
输出信号:
8位乘积P,结束信号DONE。
P
A
8
4
B
MUL
4
DONE
START
图2-14位乘法器功能框图
当发出一个高电平的START信号以后,乘法器开始乘法运算,运算完成以后发出高电平的DONE信号。
2.2设计思路
对于4位二进制乘法器,将其在逻辑上视为由多个子操作和子运算组成,在结构上视为由许多模块或功能块构成,这样在设计的时候就可以采用“自顶向下”的设计方法,根据乘法器的原理对其进行顶层设计和底层模块设计。
乘法运算可以分解为相加和移位两种子运算,具体乘法器的算法可以用如下流程图来表示。
图2-2乘法器的算法流程图
2.3顶层设计和底层模块设计
2.3.1顶层设计
4位二进制乘法器的原理图中包括4位并行寄存器REGA、4位多功能移位寄存器REGB、5位多功能移位寄存器REGC、5进制加法计数器CNT、4位二进制加法运算器ADD4B,乘法器的控制器MULCON六种底层模块。
具体的顶层原理图的设计连接如下图所示。
图2-3乘法器顶层原理图
2.3.2底层模块设计
REGA模块
(1)模块REGA的VHDL代码
libraryieee;
useieee.std_logic_1164.all;
entityREGAis
port(CP,LD:
instd_logic;
D:
instd_logic_vector(3downto0);
Q:
outstd_logic_vector(3downto0)
);
endREGA;
architectureoneofREGAis
begin
process(CP,LD,D)
begin
if(CP'eventandCP='1')then
if(LD='1')then
Q<=D;
endif;
endif;
endprocess;
end;
(2)模块REGA的简单说明
REGA模块为4位并行寄存器,当LD=0时,处于保持状态,当LD=1时,处于并行置数状态。
实验仿真波形说明了REGA模块符合设计要求的逻辑功能,仿真结果如下图。
(3)模块REGA的仿真结果
当LD=0,处于保持状态,输出端Q保持不变
当LD=1,处于并行置数状态,来一个CP脉冲上升沿,即可将D端数据送给Q
图2-4REGA仿真波形
REGB模块
(1)模块REGB的VHDL代码
libraryieee;
useieee.std_logic_1164.all;
entityREGBis
port(CP,DIR:
instd_logic;
S:
instd_logic_vector(1downto0);
D:
instd_logic_vector(3downto0);
Q:
bufferstd_logic_vector(3downto0)
);
endREGB;
architectureoneofREGBis
begin
process(CP,D,S)
begin
if(CP'eventandCP='1')then
caseSis
when"00"=>null;
when"01"=>Q<=DIR&Q(3downto1);
when"11"=>Q<=D;
whenothers=>null;
endcase;
endif;
endprocess;
end;
(2)模块REGB的简单说明
REGB模块为4位多功能移位寄存器。
当S1S0=00时,寄存器处于保持状态;当S1S0=01时,寄存器处于右移状态;当S1S0=11时,寄存器处于并行置数状态;实验仿真波形说明了REGB模块符合设计要求的逻辑功能,仿真结果如下图。
(3)模块REGB的仿真结果
S1S0=00,Q保持不变
S1S0=01,寄存器处于右移状态,DIR=1,来一个CP脉冲上升沿,Q端输出变为1000
S1S0=11,处于并行置数状态,来一个CP脉冲上升沿,即可将D端数据送给Q
图2-5REGB仿真波形
REGC模块
(1)模块REGC的VHDL代码
libraryieee;
useieee.std_logic_1164.all;
entityREGCis
port(CP,RD,DIR:
instd_logic;
S:
instd_logic_vector(1downto0);
D:
instd_logic_vector(4downto0);
Q:
bufferstd_logic_vector(4downto0)
);
endREGC;
architectureoneofREGCis
begin
process(CP,D,S,RD)
begin
if(RD='1')thenQ<=(others=>'0');
elsif(CP'eventandCP='1')then
caseSis
when"00"=>null;
when"01"=>Q<=DIR&Q(4downto1);
when"11"=>Q<=D;
whenothers=>null;
endcase;
endif;
endprocess;
end;
(2)模块REGC的简单说明
REGC模块为5位多功能移位寄存器。
当S1S0=00时,寄存器处于保持状态;当S1S0=01时,寄存器处于右移状态;当S1S0=11时,寄存器处于并行置数状态;当RD=1时,寄存器执行异步清零功能。
实验仿真波形说明了REGC模块符合设计要求的逻辑功能,仿真结果如下图。
(3)模块REGC的仿真结果
S1S0=11,处于并行置数状态,来一个CP脉冲上升沿,即可将D端数据送给Q
RD=1,寄存器异步清零,Q端输出变为00000
S1S0=01,寄存器处于右移状态,DIR=1,来一个CP脉冲上升沿,Q端输出变为10000
图2-6REGC仿真波形
CNT模块
(1)模块CNT的VHDL代码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityCNTis
port(CP,RD,ET:
instd_logic;
CO:
outstd_logic
);
endCNT;
architectureoneofCNTis
signalQ:
std_logic_vector(2downto0);
begin
process(CP,RD,ET)
begin
if(RD='1')then
Q<="000";
elsif(CP'eventandCP='1')then
ifET='1'then
if(Q=4)then
Q<="000";
else
Q<=Q+1;
endif;
endif;
endif;
endprocess;
process(Q)
begin
if(Q=4)then
CO<='1';
else
CO<='0';
endif;
endprocess;
end;
(2)模块CNT的简单说明
CNT模块为5进制加法计数器模块。
RD=1时,处于异步清零功能;ET=1时,允许计数;当Q=4时,产生一个进位。
实验仿真波形说明了CNT模块符合设计要求的逻辑功能,仿真结果如下图。
(3)模块CNT的仿真结果
RD=1,寄存器异步清零,所以图中再4个CP脉冲过后没有产生进位
ET=1,4个CP脉冲过后,产生一个进位脉冲
图2-7CNT仿真波形
ADD4B模块
(1)模块ADD4B的VHDL代码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityADD4Bis
port(A:
instd_logic_vector(3downto0);
B:
instd_logic_vector(3downto0);
C:
outstd_logic_vector(3downto0);
COUT:
outstd_logic
);
end;
architectureoneofADD4Bis
signalCRLT:
std_logic_vector(4downto0);
signalAA,BB:
std_logic_vector(4downto0);
begin
AA<='0'&A;
BB<='0'&B;
CRLT<=AA+BB;
C<=CRLT(3downto0);
COUT<=CRLT(4);
end;
(2)模块ADD4B的简单说明
ADD4B模块实现的是4位二进制数的加法运算,并且产生进位输出。
实验仿真波形说明了ADD4B模块符合设计要求的逻辑功能,仿真结果如下图。
(3)模块ADD4B的仿真结果
1001+1001=10010,所以C=0010,进位COUT=1
0001+0001=0010
图2-8ADD4B仿真波形
MULCON模块
(1)模块MULCON的VHDL代码
libraryieee;
useieee.std_logic_1164.all;
entityMULCONis
port(START,I4,BI,CP:
instd_logic;
DONE,RD,CA,CB1,CB0,CC1,CC0,ET:
outstd_logic
);
endMULCON;
architectureoneofMULCONis
signalcurrent_state,next_state:
bit_vector(1downto0);
constantS0:
bit_vector(1downto0):
="00";
constantS1:
bit_vector(1downto0):
="01";
constantS2:
bit_vector(1downto0):
="11";
constantS3:
bit_vector(1downto0):
="10";
begin
COM:
process(current_state,START,BI,I4)
begin
DONE<='0';RD<='0';CA<='0';CB1<='0';CB0<='0';CC1<='0';CC0<='0';ET<='0';