verilog微波炉定时器设计.docx

上传人:b****5 文档编号:7663311 上传时间:2023-01-25 格式:DOCX 页数:12 大小:224.08KB
下载 相关 举报
verilog微波炉定时器设计.docx_第1页
第1页 / 共12页
verilog微波炉定时器设计.docx_第2页
第2页 / 共12页
verilog微波炉定时器设计.docx_第3页
第3页 / 共12页
verilog微波炉定时器设计.docx_第4页
第4页 / 共12页
verilog微波炉定时器设计.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

verilog微波炉定时器设计.docx

《verilog微波炉定时器设计.docx》由会员分享,可在线阅读,更多相关《verilog微波炉定时器设计.docx(12页珍藏版)》请在冰豆网上搜索。

verilog微波炉定时器设计.docx

verilog微波炉定时器设计

 

集成电路课程

设计报告

 

课题名称:

微波炉定时器设计

姓名:

XXXXXX

学号:

*********

班级:

电子科学与技术班

 

第一节引言......................................................2

1.1概述...................................................2

1.2本设计的任务和主要功能..................................2

第二节系统功能绍................................................2

2.1系统总述...............................................2

2.2控制模块...............................................3

2.3数据装入模块............................................3

2.4计时器模块..............................................4

2.4.1六进制计数块..........................................5

2.4.2十进制计数块..........................................5

2.5各模块top连接..........................................5

第三节modelsim仿真测试...........................................6

3.1测试基准................................................6

3.2仿真结果................................................6

第四节课程设计总结................................................7

附录................................................................8

 

微波炉定时器设计

引言

1.1概述

近年来微波炉由于烹饪的时间很短,能很好地保持食物中的维生素和天然风味。

随着科技的发展,其已经带给了千家万户以便捷、美味,成为现代家庭必备产品。

时至今日,微波炉已有50多年的发展历史,尽管它已经实现了高度工业化的生产,但是主要生产国还是在日本、韩国及欧洲的一些发达国家。

就国内而言,中国老百姓已经开始认识和接受微波炉,可预见,中国也开始成为一个巨大的微波炉市场。

尽管微波炉发展已经趋于成熟,但是其技术方面还有很多需要创新、改进。

微波炉的电磁外溢就是一个例子,他给人的伤害是不能复原的。

只有不断改善技术缺陷,才能赢取更大的市场,才能够抵御未知的挑战和风险。

基于这些,我们设计了自己的微波炉定时器。

本微波炉定时器的核心系统可由下面3个模块构成:

控制器:

控制微波炉的工作过程中的状态转换及相应的控制序列;数据装入器:

根据控制信号选择定时时间、测试数据或完成信息的装入;定时器部分:

负责完成烹调过程中的定时等。

通过3大模块最终实现微波炉的复位、开始、测试、定时、结束等功能。

1.2本设计的任务和主要功能

该微波炉定时器具有复位开关,并且通电处于复位状态,只要复位开关按下,定时器执行复位操作。

具有启动和结束开关,控制微波炉开始烹调和结束。

微波炉的烹调时间可以由用户自由设定,烹调时间应该能够显示到秒。

最终结果能使用ModelSim对设计的程序进行仿真验证。

系统功能介绍

2.1系统总述

微波炉定时器主要由控制块状态机(MICRO_WARE)控制系统的功能状态运行,由装入模块(LOADER)实现人为设定时间的输入,并且由减一计时模块(TIMER)实现最终的减一定时。

通电处于复位状态,当按下测试按钮时测试数码管是否损坏,如果数码管显示8888则完好无损,否者不能正常显示。

当SET有效时输入需要设定的时间,并显示到数码管上,在需要人为设定时间时即可按下SET输入时间。

当按下START按钮者开始计时并cook,计时到0则结束cook。

RESET为复位按钮,复位状态电路输出为0。

具体系统结构如下:

图1微波炉控制系统原理图

2.2控制模块(如图1KZQ)

主要完成对整个芯片工作的控制。

当L_done有效时,输出烹调结束数据。

当L_clk有效时,输出烹调的设置时间数据。

当L_8888有效时,输出数码管测试数据--包括6个输入信号和4个输出信号。

定义以下5个状态:

parameterIDLE=3'b000,//复位状态输出L_8888、L_clk、L_done全为0

LAMP_TEST=3’b001,//TEST有效L_8888=1,L_clk、L_done为0

SET_CLOCK=3’b010,//SET有效L_8888、L_done为0,L_clk=1

TIMER=3'b011,//START有效L_8888为0,L_clk、L_done为1并开始COOK

DONE_MSG=3'b100;//done有效L_8888、L_clk为0,L_done=1,COOK结束

具体程序见附录

2.3数据装入模块(如图1ZZQ)

当L_done有效时,输出烹调结束数据。

当L_clk有效时,输出烹调的设置时间数据。

当L_8888有效时,输出数码管测试数据。

load信号为data_val输出有效指示,DATA为人为输入的时间数据输入口。

parameterALLS=16'b1000100010001000,//测试数据8888,数码管LED全亮则测试成功

DONE=16'b1010101111001101;//结束数据,数码管显示DONE表示cook结束

assignLOAD=LD_TEST|LD_DONE|LD_CLK;//三个信号有一个为1,则LOAD控制端有效

assignTEMP={LD_TEST,LD_DONE,LD_CLK};//case语句用于为不同输入状态装入不同数据

always@(DATAIN,LD_TEST,LD_CLK,LD_DONE)

begincase(TEMP)

3'b100:

DATAOUT<=ALLS;3'b010:

DATAOUT<=DONE;3'b001:

DATAOUT<=DATAIN;

endcaseend

2.4计时器模块(如图1JSQ)

其主要功能为计时。

Load有效时完成装入功能,down有效时执行减计数。

由于微波炉定时器要求显示分和秒共4位,因而定时器至少应有4个计数器。

为简化设计过程,我们将4个计数器使用一个通用的计数器以供顶层设计调用,并且这个通用计数器必须有6_10进制选择功能。

计数器输出包括0标志信号,当计时结束即输出为0时则zero为1;通过该信号可以反馈给控制模块以达到烹饪结束的效果,其连接如图:

图2计数器模块内部结构

2.4.1六进制计数块(CNT6)

如图2中en连接five的两个计数器,因为一小时为60分钟一分钟为60秒,而且分秒的个十位都为十进制。

assignQ=TMP;

always@(LOAD)begin

if(LOAD)TMP<=DATAIN;end//load有效输入设定数据

always@(posedgeCLK)begin

if(EN)//EN有效并且temp为0装入数据5可实现6借位操作

if(TMP==4'b0000)beginTMP<=4'b0101;CARRY_OUT<=1;end

elsebeginTMP<=TMP-1;CARRY_OUT<=0;end//en无效则实现减一操作

end

2.4.2十进制计数块(CNT10)

如图二中连接nine的两个计数器实现分和秒的个十位十进制计数,原理同6进制计数器一样。

assignQ=TMP;

always@(LOAD)begin

if(LOAD)TMP<=DATAIN;end

always@(posedgeCLK)

beginif(EN)

if(TMP==4'b0000)beginTMP<=4'b1001;CARRY_OUT<=1;end//装入数据9可实现借位操作

elsebeginTMP<=TMP-1;CARRY_OUT<=0;end

end

2.5各模块top连接

模块连接应用模块例化语句实现各模块的信号传递其硬件电路如图1所示具体程序可见附录

 

测试与仿真

3.1测试基准(具体程序见附录)

设定cook时间即DATA为11分钟11秒,时钟周期为20us.测试信号,置数信号复位信号的脉宽都为50us,且都是上升沿触发。

initial

beginDATA=16'b0001000100010001;CLK=0;TEST=0;

START=0;SET_T=0;RESET=1;#50RESET=0;end//给一个复位信号

initial

beginTEST=0;#100TEST=1;#50TEST=0;end//给一个测试信号

initial

beginSET_T=0;#150SET_T=1;#50SET_T=0;end//给置数信号

initial

beginSTART=0;#200START=1;#100START=0;end//模拟开始按钮

always#10CLK=~CLK;//产生时钟脉冲

3.2仿真结果

如图波形

设置输入时间为11:

11s,开始一个RESET信号输出为000,当给一个SET信号时输出数据为设置的数据0001000100010001。

当按下START时COOK变为高电平开始烹饪,计数器开始计数减一,秒的个位减到0则十位减一,当秒减为0向分借位实现6进制借位操作。

然后分的个位以十进制向分的十位借位,直到全为0则输出信号DONE,烹饪结束。

完美的实现了设计的要求。

课程设计总结

在这一个多星期中我和我的队员一起完成了这个课程设计。

一个星期的时间挺短,却也学到了很多东西。

自从选到这个题目大家都开始了紧张的工作,各论坛、图书馆、中文数据库以及最后设计思路的确立。

整个过程现在总结起来也遇到了许多麻烦,也就解决许多麻烦。

比如一开始对计时器的进制选择没有设定,导致仿真波形输出结果秒和分的换算都用了16进制。

就这一点我们花了整整一天时间才修改并调试成功。

不止这些,设计过程中对程序的模块连接,以及程序的改错都给我们留下了深刻的影响。

这对于我们来说是一笔宝贵的财富。

当今电子技术飞速发展,而其核心已日趋接近EDA设计,所以学好EDA设计对我们来说非常重要。

这次课程设计给我们一个拓展的平台,值得大家欣慰的是我们遇到了不同种类的问题,我们学会了怎样解决问题。

 

附录

1.实验完整程序:

//1————————————top————————————————————————

moduleTOP(DATA,RESET,SET_T,START,TEST,CLK,COOK,SEC0,SEC1,MIN0,MIN1);

inputDATA,RESET,SET_T,START,TEST,CLK;

outputCOOK,SEC0,SEC1,MIN0,MIN1;

wire[3:

0]SEC0,SEC1,MIN0,MIN1;

wire[15:

0]DATA;

wireCOOK_TMP,TEST_TMP,CLK_TMP,DONE_TMP,LOAD_TMP,DONE;

wire[15:

0]DATA_TMP;

assignCOOK=COOK_TMP;

KZQTKZQ(RESET,SET_T,START,TEST,CLK,DONE,COOK_TMP,TEST_TMP,CLK_TMP,DONE_TMP);

ZZQTZZQ(DATA,TEST_TMP,CLK_TMP,DONE_TMP,DATA_TMP,LOAD_TMP);

JSQTJSQ(COOK_TMP,LOAD_TMP,CLK,DATA_TMP,SEC0,SEC1,MIN0,MIN1,DONE);

endmodule

//2————————————控制模块状态机-——————————————————

moduleKZQ(RESET,SET_T,START,TEST,CLK,DONE,COOK,LD_TEST,LD_CLK,LD_DONE);

inputRESET,SET_T,START,TEST,CLK,DONE;

outputCOOK,LD_TEST,LD_CLK,LD_DONE;

regCOOK,LD_TEST,LD_CLK,LD_DONE;

parameterIDLE=3'b000,

LAMP_TEST=3'b001,

SET_CLOCK=3'b010,

TIMER=3'b011,

DONE_MSG=3'b100;

reg[2:

0]NXT,CUR;

always@(posedgeCLKorposedgeRESET)

begin

NXT<=IDLE;LD_TEST<=0;LD_DONE<=0;LD_CLK<=0;COOK<=0;

if(RESET)beginCUR<=IDLE;end

elsebegin

case(CUR)

LAMP_TEST:

beginLD_TEST<=1;COOK<=0;end

SET_CLOCK:

beginLD_CLK<=1;COOK<=0;end

DONE_MSG:

beginLD_DONE<=1;COOK<=0;end

IDLE:

begin

if(TEST)

beginNXT<=LAMP_TEST;LD_TEST<=1;end

elseif(SET_T)

beginNXT<=SET_CLOCK;LD_CLK<=1;end

elseif(START==1)

beginNXT<=TIMER;COOK<=1;end

end

TIMER:

begin

if(DONE)

beginNXT<=DONE_MSG;LD_DONE<=1;end

else

beginNXT<=TIMER;COOK<=1;end

end

endcase

CUR<=NXT;

endend

endmodule

//3——————————————数据装入块———————————————————

moduleZZQ(DATAIN,LD_TEST,LD_CLK,LD_DONE,DATAOUT,LOAD);

inputDATAIN,LD_TEST,LD_CLK,LD_DONE;

outputDATAOUT,LOAD;

wire[15:

0]DATAIN;

reg[15:

0]DATAOUT;

wire[2:

0]TEMP;

parameterALLS=16'b1000100010001000,//8888

DONE=16'b1010101111001101;//DONE

assignLOAD=LD_TEST|LD_DONE|LD_CLK;

assignTEMP={LD_TEST,LD_DONE,LD_CLK};

always@(DATAIN,LD_TEST,LD_CLK,LD_DONE)

begin

case(TEMP)

3'b100:

DATAOUT<=ALLS;

3'b010:

DATAOUT<=DONE;

3'b001:

DATAOUT<=DATAIN;

endcase

end

endmodule

//4————————————6进制控制—————————————————————

moduleCNT6(CLK,LOAD,EN,DATAIN,Q,CARRY_OUT);

inputCLK,LOAD,EN,DATAIN;

outputQ,CARRY_OUT;

wire[3:

0]DATAIN;

wire[3:

0]Q;

regCARRY_OUT;

reg[3:

0]TMP;

assignQ=TMP;

always@(LOAD)

begin

if(LOAD)TMP<=DATAIN;end

always@(posedgeCLK)begin

if(EN)

if(TMP==4'b0000)

beginTMP<=4'b0101;CARRY_OUT<=1;end

else

beginTMP<=TMP-1;CARRY_OUT<=0;end

end

endmodule

//5————————————10进制控制—————————————————————

moduleCNT10(CLK,LOAD,EN,DATAIN,Q,CARRY_OUT);

inputCLK,LOAD,EN,DATAIN;

outputQ,CARRY_OUT;

wire[3:

0]DATAIN;

wire[3:

0]Q;

regCARRY_OUT;

reg[3:

0]TMP;

assignQ=TMP;

always@(LOAD)

begin

if(LOAD)TMP<=DATAIN;end

always@(posedgeCLK)

begin

if(EN)

if(TMP==4'b0000)beginTMP<=4'b1001;CARRY_OUT<=1;end

elsebeginTMP<=TMP-1;CARRY_OUT<=0;end

end

endmodule

//6————————————-计时器模块————————————————————

moduleJSQ(COOK,LOAD,CLK,DATA,SEC0,SEC1,MIN0,MIN1,DONE);

inputCOOK,LOAD,CLK,DATA;

outputSEC0,SEC1,MIN0,MIN1,DONE;

wire[3:

0]SEC0,SEC1,MIN0,MIN1;

wire[15:

0]DATA;

wireDONE;

wires0,s1,s2,s3;

assignDONE=s0&s1&s2&s3;

CNT10S0(CLK,LOAD,COOK,DATA[3:

0],SEC0,s0);

CNT6S1(s0,LOAD,COOK,DATA[7:

4],SEC1,s1);

CNT10m0(s1,LOAD,COOK,DATA[11:

8],MIN0,s2);

CNT6m1(s2,LOAD,COOK,DATA[15:

12],MIN1,s3);

endmodule

2.测试程序:

moduleTOP_tb;

wire[3:

0]MIN0;

wire[3:

0]SEC1;wireCOOK;regTEST;

wire[3:

0]MIN1;regCLK;regSTART;

reg[15:

0]DATA;wire[3:

0]SEC0;regSET_T;

regRESET;

initial

begin

DATA=16'b0001000100010001;CLK=0;TEST=0;START=0;

SET_T=0;RESET=1;

#50RESET=0;

end

initial

beginTEST=0;

#100TEST=1;#50TEST=0;

end

initial

beginSET_T=0;

#150SET_T=1;#50SET_T=0;

end

initial

beginSTART=0;

#200START=1;#100START=0;

end

always#10CLK=~CLK;

TOP

DUT(

.MIN0(MIN0),

.SEC1(SEC1),

.COOK(COOK),

.TEST(TEST),

.MIN1(MIN1),

.CLK(CLK),

.START(START),

.DATA(DATA),

.SEC0(SEC0),

.SET_T(SET_T),

.RESET(RESET));

endmodule

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1