名称:基于FPGA的洗衣机控制器设计Verilog代码Quartus 正点原子开发板(文末获取)
软件:Quartus
语言:Verilog
代码功能:
主要任务和基本要求如下:
一、主要任务
设计并实现一个基于FPGA的洗衣机控制器,使用Verilog或VHDL语言进行硬件描述。
控制器应能实现对洗衣机工作过程的智能控制,包括洗涤、漂洗和甩干等阶段,并能实时监测洗衣机的状态。
控制器应具备人机交互功能,能通过按键或触摸屏进行控制。
完成控制器的硬件设计和仿真测试,并进行实际应用测试。
提交完整的项目报告,包括设计文档、测试报告和实际应用报告。
二、基本要求
1.循环输出正转、反转、暂停信号。
2.可以预置洗衣时间。
3.可以显示输入的定时时间。
4.可操作性、可靠性要好。
5.实现定时启动→正转25s→暂停5s→反转25s→暂停5s→如果时间未到,则回到“正转25s→暂停5s→……”,定时到则停止。
本代码已在正点原子开发板验证,正点原子开发板如下,其他开发板可以修改管脚适配:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 管脚分配
6. Testbench
7. 仿真图
整体仿真图
分频到1K模块
分频到1Hz模块
控制模块
显示模块
部分代码展示:
//控制模块 module control( input clk_1Hz,//1Hz input key_add,//加按键 input key_sub,//减按键 input key_start,//启动暂停按键 input key_reset,//复位按键 output end_led,//结束指示灯 output reg D1,//正转 output reg D2,//反转 output reg D3,//暂停 output [7:0] time_data//剩余时间 ); parameter s_idle=3'd0; parameter s_start=3'd1;//启动 parameter s_suspend=3'd2;//暂停 parameter s_end=3'd3;//停止 reg [2:0] state=s_idle; reg [7:0] time_data_buf=8'd10;//剩余时间 always@(posedge clk_1Hz or negedge key_reset) if(~key_reset)//复位按键,按下高电平 state<=s_idle; else case(state)//空闲,设置定时时间 s_idle: if(key_start==0)//启动 state<=s_start;//启动 else state<=s_idle; s_start: if(key_start==0)//暂停 state<=s_suspend;//暂停 else if(time_data_buf==8'd0)//计时结束 state<=s_end; else state<=s_start; s_suspend: if(key_start==0)//启动 state<=s_start;//启动 else state<=s_suspend; s_end: state<=s_end; default:; endcase reg [7:0] D_count=8'd0; always@(posedge clk_1Hz) case(state)//空闲,设置定时时间 s_idle: //显示设置时间 if(key_add==0)//加按键,按下高电平 time_data_buf<=time_data_buf+8'd1; else if(key_sub==0)//减按键 if(time_data_buf==8'd0) time_data_buf<=8'd0; else time_data_buf<=time_data_buf-8'd1; s_start: if(time_data_buf==8'd0) time_data_buf<=8'd0; else if(D_count==8'd59) time_data_buf<=time_data_buf-8'd1;//倒计时 s_end: time_data_buf<=8'h0;//显示0 default:; endcase always@(posedge clk_1Hz or negedge key_reset) if(~key_reset) D_count<=8'd0; else if(state==s_start) if(D_count==8'd59) D_count<=8'd0; else D_count<=D_count+8'd1;//计数0~59 else D_count<=D_count; always@(*) if(state==s_start) if(D_count<8'd25)//25s,0~24 D1<=1;//正转 else D1<=0; else D1<=0; always@(*) if(state==s_start) if((D_count>=8'd25 && D_count<=8'd29)||(D_count>=8'd55 && D_count<=8'd59)) D3<=1;//暂停 else D3<=0; else D3<=0; always@(*) if(state==s_start) if(D_count<=8'd54 && D_count>=8'd30)//30~54 D2<=1;//反转 else D2<=0; else
源代码
扫描文章末尾的公众号二维码