数字电路设计实验报告1Word文档格式.docx
《数字电路设计实验报告1Word文档格式.docx》由会员分享,可在线阅读,更多相关《数字电路设计实验报告1Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
![数字电路设计实验报告1Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/8/2d081be9-9aa4-4cbb-ab80-fcd9172778a3/2d081be9-9aa4-4cbb-ab80-fcd9172778a31.gif)
设置两个信号用于向洗衣机传送着两个消息,识别从暂停状态返回后洗衣机应该进入的状态和模式。
程序分成倒计时模块、按键控制模块、数码管显示模块、发光二极管显示模块、分频模块、防抖动模块以及状态机模块组成。
最后由一个总程序调用。
三
设计方案
1、状态框图
2、状态转移图
3、源程序及说明
l
电路主模块wash.vhd
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_signed.all;
entitywashis
-----端口定义
port(clk:
instd_logic;
switch:
pause:
lights:
outstd_logic_vector(3downto0);
sell:
outstd_logic_vector(1downto0);
seg:
outstd_logic_vector(6downto0));
endwash;
architecturebehaveofwashis
-----子程序调用
componentcount50is
port(clkin:
clkout:
outstd_logic);
endcomponent;
componentcount25is
componentstatementis
t_xidi:
t_piaoxi:
t_tuoshui:
command:
outstd_logic_vector(2downto0);
present_state:
outstd_logic_vector(2downto0));
componenttimeis
port(clk_1Hz:
instd_logic_vector(2downto0);
outstd_logic;
sec_l,sec_h:
outstd_logic_vector(3downto0));
componentkeyis
keyin:
keyout:
componentdisplayis
port(clk_100Hz:
instd_logic_vector(3downto0);
componentlightwinkis
lightsin:
selin:
instd_logic_vector(1downto0);
segin:
instd_logic_vector(6downto0);
signalclk_10000Hz,clk_100Hz,clk_2Hz,clk_1Hz:
std_logic;
signaltime_xidi,time_piaoxi,time_tuoshui:
signalswitch_n,pause_n:
signalpresent_state:
std_logic_vector(2downto0);
signalcommand:
signalsec_low,sec_high:
std_logic_vector(3downto0);
signallights4,lightsout:
signalsell2,selout:
std_logic_vector(1downto0);
signalseg7,segout:
std_logic_vector(6downto0);
begin
-----端口相应信号替代
link1:
count50portmap(clkin=>
clk,clkout=>
clk_10000Hz);
link2:
clk_10000Hz,clkout=>
clk_100Hz);
link3:
clk_100Hz,clkout=>
clk_1Hz);
link4:
count25portmap(clkin=>
clk_2Hz);
link5:
keyportmap(clk=>
clk_100Hz,keyin=>
switch,keyout=>
switch_n);
link6:
pause,keyout=>
pause_n);
link7:
statementportmap(clk=>
clk_2Hz,switch=>
switch_n,pause=>
pause_n,t_xidi=>
time_xidi,t_piaoxi=>
time_piaoxi,t_tuoshui=>
time_tuoshui,command=>
command,present_state=>
present_state);
link8:
timeportmap(clk_1Hz=>
clk_1Hz,present_state=>
present_state,command=>
command,t_xidi=>
time_tuoshui,sec_l=>
sec_low,sec_h=>
sec_high);
link9:
displayportmap(clk_100Hz=>
clk_100Hz,sec_l=>
sec_high,command=>
present_state,lights=>
lights4,sell=>
sell2,seg=>
seg7);
link10:
lightwinkportmap(clk_1Hz=>
present_state,lightsin=>
lights4,selin=>
sell2,segin=>
seg7,lights=>
lightsout,sell=>
selout,
seg=>
segout);
process
begin
lights<
=lightsout;
sell<
=selout;
seg<
=segout;
endprocess;
end;
分频模块count25.vhd和count50.vhd
count50
entitycount50is
endcount50;
architectureaofcount50is
-----端口的定义
signalclk1:
process(clkin)
variablet:
integerrange0to49;
begin
if(clkin'
eventandclkin='
1'
)then
if(t=49)then
t:
=0;
clk1<
=notclk1;
-----当t等于49时输出信号翻转一次实现100分频
elset:
=t+1;
-----如果t不等于49则外部时钟变化一次t加1
endif;
clkout<
=clk1;
endprocess;
仿真波形(count50)
count25
entitycount25is
libraryieee;
endcount25;
architectureaofcount25is
integerrange0to24;
if(t=24)then
-----按照时钟,循环计数
-----每记25个数,输出信号取反
仿真波形(count25)
防抖电路
key.vhd
entitykeyis
-----输入的按键信号
-----输出的按键信号
endkey;
architectureaofkeyis
signalcp:
process(clk,keyin)
integerrange0to1;
if(clk'
eventandclk='
if(keyin='
if(t=1)then
cp<
='
;
-----连续两次时钟,输入信号都为1,则输出为1
else
-----计数
0'
keyout<
=cp;
仿真波形(防抖电路)
计时模块
useieee.std_logic_arith.all;
entitytimeis
-----计时频率
-----当前状态
-----当前命令
-----洗涤时钟
-----漂洗时钟
-----脱水时钟
-----数码管显示输出的数字
endtime;
architecturebehaveoftimeis
typestate_typeis(stop,switch_mode,xidi,piaoxi,tuoshui);
signalstate:
state_type;
signalxidi_timeup,piaoxi_timeup,tuoshui_timeup:
process(clk_1Hz)
variablec:
variabled:
variablenum1:
integerrange0to15;
variablenum2:
integerrange0to9;
variableinput1:
variableinput2:
variablesec1:
variablesec2:
casecommandis
when"
001"
=>
input1:
input2:
=2;
-----洗涤时间20s
010"
=5;
=1;
-----漂洗时间15s
011"
-----脱水时间10s
100"
-----漂洗和脱水时间25s
101"
=4;
-----洗涤、漂洗和脱水总时间45s
whenothers=>
endcase;
casepresent_stateis
-----当前状态输入
000"
state<
=stop;
=switch_mode;
=xidi;
=piaoxi;
=tuoshui;
if(clk_1Hz'
eventandclk_1Hz='
if(state=xidiorstate=piaoxiorstate=tuoshui)then
-----处于洗衣状态
if(input1<
num1)then
-----num1、num2