微波炉控制器Verilog代码Quartus仿真

名称:微波炉控制器Verilog代码Quartus仿真(文末获取)

软件:Quartus

语言:Verilog

代码功能:

微波炉控制器

用芯片Altera Cyclone IV FPGA作为控制芯片,实现时间设置、温度设定、火力选择、声音提示,在硬件组成上,涉及到电源供电、按键输入、数码管显示、指示灯提示等。

由按键控制实现功能的转换,7个LED提示指示灯,4位LED数码管显示加热倒计时,3位LED数码管显示当前温度值,1位LED数码管显示当前火力档位。

各个按键的功能效果:

(1)暂停:在食物烹饪过程中,若按下该键,则停止食物烹饪,进入待机状态。

(2)时间设定:设置系统工作时间,按下该键,可以设置时间,每按一下增加30秒

(3)温度设定:设置加热的最高温度,按下该键,可以设置时间,每按一下增加10°C

(4)火力设定:设置系统工作的火力挡位,按下该键,可以在低火、中火、高火三个档位之中切换。

(5)烹调:快速设定当前烹饪时间和火力到适合烹调的值。

(6)烘烤:快速设定当前烹饪时间和火力到适合烘烤的值。

(7)解冻:快速设定当前烹饪时间和火力到适合解冻的值。

(8)开始/确认:在选择烹调、烘烤、解冻或者设置时间、设定温度、选择火力等烹饪参数后,按下此键,开始进行烹饪.

指示灯功能如下:

(1)完成提示:提示微波炉工作完成.该灯亮时,表示烹饪完成;

(2)意外报警:提示意外情况发生.该灯亮时,表示出现意外,微波炉暂停工作;

(3)解冻:该灯亮时,表示工作在解冻模式下;

(4)烘烤:该灯亮时,表示工作在烘烤模式下;

(5)烹调:该灯亮时,表示工作在烹调模式下;

(6)工作状态:指示微波炉处于工作状态,工作时灯亮,不工作时灯灭;

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. 仿真文件(testbench)

6. 仿真图

整体仿真图

分频模块

控制模块

温度设置模块

时间设置模块

显示模块

部分代码展示:

//微波炉顶层模块
module microwave_top(
   input        clk,//时钟
   input        reset_key,//复位按键
   input        time_key,//设置时间
input        temp_key,//设置温度
   input        fire_key,//设置火力
   input        start_key,//启动
   input        stop_key,//暂停
   input        key_1,//烹调
   input        key_2,//烘烤
   input        key_3,//解冻
   
   output       bell,//结束提示(声音)
output       end_led   ,//led完成
   output       alarm_led ,//led报警
output       led_1     ,//led烹调
output       led_2     ,//led烘烤
output       led_3     ,//led解冻
output       work_led  ,//led工作状态
   output [7:0] min_ten_HEX,//数码管显示分钟十位
   output [7:0] min_one_HEX,//数码管显示分钟个位
   output [7:0] sec_ten_HEX,//数码管显示分钟十位
   output [7:0] sec_one_HEX,//数码管显示分钟个位
   output [7:0] fire_HEX,//数码管显示火力指示
   output [7:0] temp_h_HEX,//数码管显示温度百位
   output [7:0] temp_t_HEX,//数码管显示温度十位
   output [7:0] temp_o_HEX//数码管显示温度个位
);
   
   wire [2:0]   fire_led;//火力指示灯 
   wire [2:0]   state_out;
   wire [3:0]   minute_ten_display;
   wire [3:0]   minute_one_display;
   wire [3:0]   second_ten_display;
   wire [3:0]   second_one_display;
   wire         clk_div;//1Hz
   wire [3:0] temp_h;//温度百位
   wire [3:0] temp_t;//温度十位
   wire [3:0] temp_o; //温度个位
//分频模块
div_clk i_div_clk(
.clk    (clk), 
.clk_1Hz(clk_div)
);
    //状态控制模块
   state_ctrl i_state_ctrl(
   .clk(clk_div), 
   .reset_key(reset_key), 
   .start_key(start_key), 
   .stop_key(stop_key), 
   .minute_ten(minute_ten_display), 
   .minute_one(minute_one_display), 
   .second_ten(second_ten_display), 
   .second_one(second_one_display), 
   .bell(bell), 
   .state_out(state_out),
   .fire_key(fire_key), 
   .fire_led(fire_led),
   .key_1(key_1),//烹调
   .key_2(key_2),//烘烤
   .key_3(key_3),//解冻
.end_led   (end_led),//led完成
   .alarm_led (alarm_led),//led报警
.led_1     (led_1),//led烹调
.led_2     (led_2),//led烘烤
.led_3     (led_3),//led解冻
.work_led  (work_led)//led工作状态
   );
//时间控制模块
   time_set i_time_set(
   .clk(clk_div), 
   .reset_key(reset_key), 
   .key_1(key_1),//烹调
   .key_2(key_2),//烘烤
   .key_3(key_3),//解冻
   .time_key(time_key), 
   .state_out(state_out), 
   .minute_ten_display(minute_ten_display), 
   .minute_one_display(minute_one_display), 
   .second_ten_display(second_ten_display), 
   .second_one_display(second_one_display)
   );
//温度控制模块
temp_set i_temp_set(
   . clk      (clk_div),
   . reset_key(reset_key),
   . temp_key (temp_key),//温度设置键
   . temp_h(temp_h),//温度百位
   . temp_t(temp_t),//温度十位
   . temp_o(temp_o) //温度个位
); 
    //数码管显示模块
   display i_display(
   . temp_h(temp_h),//温度百位
   . temp_t(temp_t),//温度十位
   . temp_o(temp_o), //温度个位
. fire_led(fire_led),
   .minute_ten_display(minute_ten_display), 
   .minute_one_display(minute_one_display), 
   .second_ten_display(second_ten_display), 
   .second_one_display(second_one_display), 
   .min_ten_HEX(min_ten_HEX), 
   .min_one_HEX(min_one_HEX), 
   .sec_ten_HEX(sec_ten_HEX), 
   .sec_one_HEX(sec_one_HEX),
. fire_HEX(fire_HEX),
   . temp_h_HEX(temp_h_HEX),//数码管显示温度百位
   . temp_t_HEX(temp_t_HEX),//数码管显示温度十位
   . temp_o_HEX(temp_o_HEX)//数码管显示温度个位
   );
   
endmodule
源代码

 扫描文章末尾的公众号二维码

状态控制电路的VHDL实现如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY controllor IS PORT( RESET:IN STD_LOGIC; --复位信号 KEY: IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入时间 SET_T:IN STD_LOGIC; --时间设置信号 START:IN STD_LOGIC; --开始烹调信号 TEST:IN STD_LOGIC; --显示电路测试信号 CLK:IN STD_LOGIC; --时钟脉冲 DONE:IN STD_LOGIC; --完成信号 COOK:OUT STD_LOGIC; --指示烹调状态,提示计时器开始计数 LD_TEST:OUT STD_LOGIC; --指示数据装载电路载入的用于测试的数据 LD_CLK:OUT STD_LOGIC; --指示数据装载电路载入设置时间数据 DATA:OUT STD_LOGIC_VECTOR(15 DOWNTO 0);--16位数据 LED_SET_T:OUT STD_LOGIC; --LED显示状态 LD_DONE:OUT STD_LOGIC --LED显示完成 ); END controllor; ARCHITECTURE rtl OF controllor IS TYPE STATES IS(IDLE,LAMP_TEST,SET_CLOCK,TIMER,DONE_MSG); SIGNAL NXT,CUR:STATES; --2个信号:下一状态、当前状态 SIGNAL DATATMP:STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL SET_T0: STD_LOGIC; --设置时间信号 BEGIN PROCESS(CLK,RESET) --时钟和复位的进程 BEGIN IF RESET='1' THEN --复位时将IDLE(显示0000)赋予当前状态 CUR<=IDLE; ELSIF CLK'EVENT AND CLK='1' THEN CUR<=NXT; --如果不是,遇到上边沿则自动跳转下一状态 END IF; END PROCESS; PROCESS(RESET,KEY) --复位和输入的进程 BEGIN --可以让输入4位数字 显示时间 IF RESET = '1' THEN --复位时不论任何状态数码管都将显示0000 DATATMP <= (others => '0'); ELSE IF KEY(3)'EVENT AND KEY(3) = '1' THEN --设置分的十位 IF DATATMP(15 DOWNTO 12) = "0101" THEN --5自动跳转到0 DATATMP(15 DOWNTO 12) <= "0000"; ELSE DATATMP(15 DOWNTO 12) <= DATATMP(15 DOWNTO 12) + 1; END IF; --否则自动加1 END IF; IF KEY(2)'EVENT AND KEY(2) = '1' THEN --设置分的个位 IF DATATMP(11 DOWNTO 8) = "1001" THEN --9自动跳转到0 DATATMP(11 DOWNTO 8) <= "0000"; ELSE DATATMP(11 DOWNTO 8) <= DATATMP(11 DOWNTO 8) + 1; END IF; --否则自动加1 END IF; IF KEY(1)'EVENT AND KEY(1) = '1' THEN --设置秒的十位 IF DATATMP(7 DOWNTO 4) = "0101" THEN --5自动跳转到0 DATATMP(7 DOWNTO 4) <= "0000"; ELSE DATATMP(7 DOWNTO 4) <= DATATMP(7 DOWNTO 4) + 1; END IF; --否则自动加1 END IF; IF KEY(0)'EVENT AND KEY(0) = '1' THEN --设置秒的个位 IF DATATMP(3 DOWNTO 0) = "1001" THEN --9自动跳转到0 DATATMP(3 DOWNTO 0) <= "0000"; ELSE DATATMP(3 DOWNTO 0) <= DATATMP(3 DOWNTO 0) + 1; END IF; END IF; --否则自动加1 END IF; DATA <= DATATMP; END PROCESS; PROCESS(SET_T,RESET) --设置时间和复位进程 BEGIN IF RESET = '1' THEN --复位时设置时间变为低电平 SET_T0 <= '0'; ELSIF SET_T'EVENT AND SET_T = '1' THEN --按下SET_T键时 SET_T0 <= NOT SET_T0; --SET_T非它前之状态 END IF; IF SET_T0 = '1' THEN LED_SET_T <= '1'; --赋予SET_T持续电平 ELSE LED_SET_T <= '0'; --赋予SET_T持续电平 END IF; END PROCESS; PROCESS(CLK,CUR,SET_T,START,TEST,DONE) IS BEGIN NXT<=IDLE; --将IDLE载入NXT LD_TEST<='0'; --复位 LD_DONE<='0'; LD_CLK<='0'; COOK<='0'; CASE CUR IS WHEN LAMP_TEST=> --译码器显示测试状态 LD_TEST<='1'; COOK<='0'; WHEN SET_CLOCK=> --烹调时间测试状态 LD_CLK<='1'; COOK<='0'; WHEN DONE_MSG=> --完成信息显示状态 LD_DONE<='0'; COOK<='0'; WHEN IDLE=> --初始状态定义 IF TEST='1' THEN NXT<=LAMP_TEST; --设置TEST LD_TEST<='1'; ELSIF SET_T0='1' THEN --设置 SET_T NXT<=SET_CLOCK; LD_CLK<='1'; ELSIF START='1' AND DONE='0' THEN --设置计时模式 NXT<=TIMER; COOK<='1'; END IF; WHEN TIMER=> IF DONE='1' THEN --设置计时完成 NXT<=DONE_MSG; LD_DONE<='0'; ELSE NXT<=TIMER; COOK<='1'; END IF; -- WHEN OTHERS=>NULL; END CASE; END PROCESS; END rtl; -------------------------------------------------------------------------------------- --数据装载电路的VHDL实现如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY loader IS PORT( DATAIN:IN STD_LOGIC_VECTOR(15 DOWNTO 0); --输入16位数据 LD_TEST:IN STD_LOGIC; LD_CLK:IN STD_LOGIC; LD_DONE:IN STD_LOGIC; DATAOUT:OUT STD_LOGIC_VECTOR(15 DOWNTO 0); --输出16位数据 LOAD:OUT STD_LOGIC --选择状态 ); END loader; ARCHITECTURE rtl OF loader IS BEGIN PROCESS(DATAIN,LD_TEST,LD_CLK,LD_DONE) CONSTANT ALLS:STD_LOGIC_VECTOR(15 DOWNTO 0)--测试信息 :="1000100010001000"; --显示8888 CONSTANT DONE:STD_LOGIC_VECTOR(15 DOWNTO 0)--烹调完成信息 :="1010101111001101"; VARIABLE TEMP:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN LOAD<=LD_TEST OR LD_DONE OR LD_CLK; --三选一状态 TEMP:=LD_TEST&LD;_DONE&LD;_CLK; --中间变量定义 CASE TEMP IS WHEN"100"=>--测试 DATAOUT<=ALLS; WHEN"010"=>--烹调完成 DATAOUT<=DONE; WHEN"001"=> DATAOUT<=DATAIN; WHEN OTHERS=>NULL; END CASE; END PROCESS; END rtl; -------------------------------------------------------------------------------------------------- --十进制计数器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY cnt10 IS PORT( CLK:IN STD_LOGIC; LOAD,CLR:IN STD_LOGIC; --CLR:清除数据 EN:IN STD_LOGIC; --信号使能 DATAIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入的4位数据 Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --输出的4位数据 CARRY_OUT:OUT STD_LOGIC --数据装载 ); END cnt10; ARCHITECTURE rtl OF cnt10 IS SIGNAL TMP:STD_LOGIC_VECTOR(3 DOWNTO 0); --链接输入输出 BEGIN --数据的信号 PROCESS(CLK,LOAD,CLR,EN) BEGIN IF CLR = '1' THEN --当CLR高电平,数据变为0000 TMP<= "0000"; ELSIF LOAD='1'THEN --否则装载输入的数据 TMP<=DATAIN; ELSIF CLK'EVENT AND CLK='0'THEN --上升沿时,执行10进制减法 IF EN='1'THEN IF TMP="0000"THEN --0跳转到9 TMP<="1001"; ELSE --自动减1 TMP<=TMP-'1'; END IF; END IF; END IF; IF TMP="0000"THEN CARRY_OUT<='1'; --COOK<=CARRY_OUT ELSE CARRY_OUT<='0'; END IF; END PROCESS; Q<=TMP; END rtl; -------------------------------------------------------------------------------------------------- --六进制减法计数器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY cnt6 IS PORT( CLK:IN STD_LOGIC; LOAD,CLR:IN STD_LOGIC; EN:IN STD_LOGIC; DATAIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0); Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CARRY_OUT:OUT STD_LOGIC ); END cnt6; ARCHITECTURE rtl OF cnt6 IS SIGNAL TMP:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(CLK,LOAD,CLR,EN) BEGIN IF CLR = '1' THEN TMP<= "0000"; ELSIF LOAD='1' THEN TMP<=DATAIN; ELSIF CLK'EVENT AND CLK='0'THEN --上升沿时进行6进制减法 IF EN='1'THEN IF TMP="0000"THEN --0自动跳转到5 TMP<="0101"; ELSE TMP<=TMP-'1'; --否则自动减1 END IF; END IF; END IF; IF TMP="0000"THEN CARRY_OUT<='1'; --赋值给COOK ELSE CARRY_OUT<='0'; END IF; END PROCESS; Q<=TMP; END rtl; -------------------------------------------------------------------------------------------------- --计时电路的VHDL实现如下: --计数器电路模块设计 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY counter IS PORT( COOK:IN STD_LOGIC; LOAD,CLR:IN STD_LOGIC; CLK:IN STD_LOGIC; DATA:IN STD_LOGIC_VECTOR(15 DOWNTO 0); SEC0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --秒个位 SEC1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --秒十位 MIN0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --分个位 MIN1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --分十位 DONE:OUT STD_LOGIC --完成 ); END counter; ARCHITECTURE rtl OF counter IS --定义十进制和六进制计数器电路模块 COMPONENT cnt10 IS PORT( CLK:IN STD_LOGIC; LOAD,CLR:IN STD_LOGIC; EN:IN STD_LOGIC; DATAIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入 Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --输出 CARRY_OUT:OUT STD_LOGIC --状态 ); END COMPONENT cnt10; COMPONENT cnt6 IS PORT( CLK:IN STD_LOGIC; LOAD,CLR:IN STD_LOGIC; EN:IN STD_LOGIC; DATAIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0); Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CARRY_OUT:OUT STD_LOGIC ); END COMPONENT cnt6; SIGNAL CLK0:STD_LOGIC; SIGNAL S0:STD_LOGIC; SIGNAL S1:STD_LOGIC; SIGNAL S2:STD_LOGIC; SIGNAL S3:STD_LOGIC; BEGIN --元件例化 CLK0 <= NOT CLK; U1:cnt10 PORT MAP(CLK0,LOAD,CLR,COOK,DATA(3 DOWNTO 0),SEC0,S0); U2:cnt6 PORT MAP(S0,LOAD,CLR,COOK,DATA(7 DOWNTO 4),SEC1,S1); U3:cnt10 PORT MAP(S1,LOAD,CLR,COOK,DATA(11 DOWNTO 8),MIN0,S2); U4:cnt6 PORT MAP(S2,LOAD,CLR,COOK,DATA(15 DOWNTO 12),MIN1,S3); DONE<=S0 AND S1 AND S2 AND S3; END rtl; -------------------------------------------------------------------------------------------------- --顶层模块的VHDL实现如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY top IS PORT( KEY: IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入4位16进制 RESET:IN STD_LOGIC; --复位键 SET_T:IN STD_LOGIC; --设置时间 START:IN STD_LOGIC; --开始计时 TEST:IN STD_LOGIC; --测试模式 CLK :IN STD_LOGIC; --输入脉冲 COOK:OUT STD_LOGIC; --烹调状态 LED2:OUT STD_LOGIC_VECTOR(1 DOWNTO 0); --LED显示状态 SEC0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); SEC1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); MIN0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); MIN1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END top; ARCHITECTURE rtl OF top IS --定义状态控制电路模块 COMPONENT controllor IS PORT( RESET:IN STD_LOGIC; KEY: IN STD_LOGIC_VECTOR(3 DOWNTO 0); SET_T:IN STD_LOGIC; START:IN STD_LOGIC; TEST:IN STD_LOGIC; CLK :IN STD_LOGIC; DONE:IN STD_LOGIC; COOK:OUT STD_LOGIC; LD_TEST:OUT STD_LOGIC; LD_CLK:OUT STD_LOGIC; DATA:OUT STD_LOGIC_VECTOR(15 DOWNTO 0); LED_SET_T:OUT STD_LOGIC; LD_DONE:OUT STD_LOGIC ); END COMPONENT controllor; --定义数据装载电路模块 COMPONENT loader IS PORT( DATAIN:IN STD_LOGIC_VECTOR(15 DOWNTO 0); LD_TEST:IN STD_LOGIC; LD_CLK:IN STD_LOGIC; LD_DONE:IN STD_LOGIC; DATAOUT:OUT STD_LOGIC_VECTOR(15 DOWNTO 0); LOAD:OUT STD_LOGIC); END COMPONENT loader; --定义计时电路模块 COMPONENT counter IS PORT( COOK:IN STD_LOGIC; LOAD,CLR:STD_LOGIC; CLK:IN STD_LOGIC; DATA:IN STD_LOGIC_VECTOR(15 DOWNTO 0); SEC0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); SEC1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); MIN0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); MIN1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); DONE:OUT STD_LOGIC ); END COMPONENT counter; SIGNAL COOK_TMP:STD_LOGIC; SIGNAL TEST_TMP:STD_LOGIC; SIGNAL CLK_TMP:STD_LOGIC; SIGNAL DONE_TMP:STD_LOGIC; SIGNAL LOAD_TMP:STD_LOGIC; SIGNAL DONE:STD_LOGIC; SIGNAL DATA_TMP,DATA_TMP1:STD_LOGIC_VECTOR(15 DOWNTO 0); BEGIN COOK<=COOK_TMP; LED2(0)<=COOK_TMP; --电路模块例化 U1:controllor PORT MAP(RESET,KEY,SET_T,START,TEST,CLK,DONE,COOK_TMP, TEST_TMP,CLK_TMP,DATA_TMP1,LED2(1),DONE_TMP); U2:loader PORT MAP(DATA_TMP1,TEST_TMP,CLK_TMP,DONE_TMP,DATA_TMP, LOAD_TMP); U3:counter PORT MAP(COOK_TMP,LOAD_TMP,RESET,CLK,DATA_TMP,SEC0,SEC1,MIN0, MIN1,DONE); END rtl;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值