基于FPGA的洗衣机控制器电子定时器

文章目录

功能描述

一、框架

二、verilog代码

控制模块实现

三、视频上板效果展示



功能描述

(1)定时启动正转20秒暂停10秒反转20秒暂 停10秒,定时未到回到"正转20秒暂停10秒......",定时到则停止; 若定时到,则停机发出音响信号;

(2)用两个数码管显示洗涤的预置时间(默认10分钟),再用两个数码管按倒计时方式对各个洗涤状态过程作计时显示,直到 时间到停机;(3)洗涤过程由"开始"信号开始;

(4)三只LED灯表示"正转","反转"、"暂停"三个状态。

(5)用动态扫描控制四个数码管的输出

一、框架

输入:时钟、复位、开始按键

输出:LED指示灯 数码管段选和位选

这个板子段选是38译码器,所以sel是3位bit

二、verilog代码

控制模块实现

主要思想就是通过两层状态机进行控制:

首先控制空闲状态、工作状态以及结束状态。

其中围绕工作状态展开进行二次状态设计,正转、反转以及暂停等等。

Matlab 复制代码
module control(
      input       clk,
      input       rst_n,
      input       key_start,
      
      output      wire        led_R,
      output      wire        led_L,
      output      wire        led_P,
      output      reg [7:0]   data_time,
      output      reg [7:0]   sec_time
      
    );
    
    //����״̬�����С�������ֹͣ
    parameter   IDLE           =3'd0;
    parameter   WORKING        =3'd1;
    parameter   OVER           =3'd2;
    
    //����״̬�µ�״̬����ת ֹͣ ��ת
    parameter   W_IDLE             =4'd0;
    parameter   R_ROTATE           =4'd1;
    parameter   PAUSE1             =4'd2;
    parameter   L_ROTATE           =4'd3;
    parameter   PAUSE2             =4'd4;
    
    
    reg [2:0]   state_all;
    reg [3:0]   state;
    
    //10����
//    reg [7:0]   data_time;
//    reg [7:0]   sec_time;//��
    reg [25:0]  count;
    
    assign led_R=(state_all==WORKING)?(state==R_ROTATE)?1'b1:1'b0:1'b0;
    assign led_L=(state_all==WORKING)?(state==L_ROTATE)?1'b1:1'b0:1'b0;
    assign led_P=(state_all==WORKING)?(state==PAUSE1 || state==PAUSE2)?1'b1:1'b0:1'b0;
    //10����
    always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        data_time<=8'h10;
    end
    else if(state_all==WORKING && state==PAUSE2 && count==49999999 && sec_time==8'h00)begin
        if(data_time[3:0]==4'h0 && data_time[7:4]>4'h0)begin
            data_time[3:0]<=4'h9;
            data_time[7:4]<=data_time[7:4]-4'd1;
        end
        else if(data_time[3:0]>4'h0 && data_time[7:4]>=4'h0)begin
            data_time[3:0]<=data_time[3:0]-4'd1;
            data_time[7:4]<=data_time[7:4];
        end
        else if(data_time[3:0]==4'h0 && data_time[7:4]==4'h0)begin
            data_time[3:0]<=data_time[3:0];
            data_time[7:4]<=data_time[7:4];
        end
    end
    else if(state_all==IDLE || state_all==OVER )begin
        data_time<=8'h10;
    end
    end    
Matlab 复制代码
   
    //��ת�ͷ�ת����ͣ������
    always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        sec_time<=8'h20;
    end
    else if(count==49999999 && (state==R_ROTATE || state==L_ROTATE))begin
        if(sec_time[3:0]==4'h0 && sec_time[7:4]>4'h0)begin
            sec_time[3:0]<=4'h9;
            sec_time[7:4]<=sec_time[7:4]-4'd1;
        end
        else if(sec_time[3:0]>4'h0 && sec_time[7:4]>=4'h0)begin
            sec_time[3:0]<=sec_time[3:0]-4'd1;
            sec_time[7:4]<=sec_time[7:4];
        end
        else if(sec_time[3:0]==4'h0 && sec_time[7:4]==4'h0)begin
            sec_time<=8'h10;
        end
    end
    else if(count==49999999 && (state==PAUSE1 || state==PAUSE2))begin
        if(sec_time[3:0]==4'h0 && sec_time[7:4]>4'h0)begin
            sec_time[3:0]<=4'h9;
            sec_time[7:4]<=sec_time[7:4]-4'd1;
        end
        else if(sec_time[3:0]>4'h0 && sec_time[7:4]>=4'h0)begin
            sec_time[3:0]<=sec_time[3:0]-4'd1;
            sec_time[7:4]<=sec_time[7:4];
        end
        else if(sec_time[3:0]==4'h0 && sec_time[7:4]==4'h0)begin
            sec_time<=8'h20;
        end
    end
    else if(state==W_IDLE)begin
        sec_time<=8'h20;
    end
    end    
    
    //1��������
    always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        count<=26'd0;
    end
    else if(state==R_ROTATE || state==PAUSE1|| state==L_ROTATE|| state==PAUSE2)begin
        if(count<49999999)begin
            count<=count+1;
        end
        else begin
            count<=26'd0;
        end
    end
    else begin
        count<=26'd0;
    end
    end
    
    
    
    //��״̬�л�
    always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        state <= W_IDLE;
        end
    else if(state_all==WORKING)begin
        case(state)
        W_IDLE:begin
            state<=R_ROTATE;
        end
        R_ROTATE:begin
            if(count==49999999 && sec_time==8'h00)begin
                state<=PAUSE1;
            end
            else begin
                state<=R_ROTATE;
            end
        end
        PAUSE1:begin
            if(count==49999999 && sec_time==8'h00)begin
                state<=L_ROTATE;
            end
            else begin
                state<=PAUSE1;
            end
        end
        L_ROTATE:begin
            if(count==49999999 && sec_time==8'h00)begin
                state<=PAUSE2;
            end
            else begin
                state<=L_ROTATE;
            end
        end
        PAUSE2:begin
            if(count==49999999 && sec_time==8'h00)begin
                state<=W_IDLE;
            end
            else begin
                state<=PAUSE2;
            end
        end
        default:state <= W_IDLE;
        endcase
    end
    else begin
        state <= W_IDLE;
    end
    end    
    
    //�ܹ���״̬�л�
    always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        state_all <= IDLE;
        end
    else begin
        case(state_all)
        IDLE:begin
            if(key_start==1'b1)begin
                state_all<=WORKING;
            end
            else begin
                state_all<=IDLE;
            end
        end
        WORKING:begin
            if(data_time==8'h00)begin
                state_all<=OVER;
            end
            else begin
                state_all<=WORKING;
            end
        end
        OVER:begin
                state_all<=IDLE;
        end
        default:state_all <= IDLE;
        endcase
    end
    
    
    end
endmodule

三、视频上板效果展示

基于fpga的洗衣机控制器 定时器

相关推荐
讽刺人生Yan19 小时前
RFSOC学习记录(一)RF data converter总览
学习·fpga开发·rfsoc
Moonnnn.19 小时前
【FPGA】三八译码器——Verilog实现
fpga开发
Moonnnn.1 天前
【FPGA】时序逻辑原理之D触发器与计数器原理
fpga开发
FPGA_小田老师1 天前
FPGA基础知识(七):引脚约束深度解析--从物理连接到时序收敛的完整指南
fpga开发
cycf1 天前
面向模块的综合技术之重定时优化(六)
fpga开发
勇闯天涯&波仔1 天前
verilog阻塞赋值和非阻塞赋值的区别
后端·fpga开发·硬件架构·硬件工程
FPGA-李宇航2 天前
FPGA中,“按键控制LED灯实验”学习中常见问题、解决思路和措施以及经验总结!!!(新手必看)
学习·fpga开发·按键控制led灯
czhaii2 天前
STC32G144K246,高速PWM@240Mhz 运行测试
stm32·单片机·fpga开发
Moonnnn.2 天前
【FPGA】设计流程——Verilog输入
fpga开发
国科安芯2 天前
AS32S601ZIT2抗辐照MCU在商业卫星飞轮系统中的可靠性分析
服务器·网络·人工智能·单片机·嵌入式硬件·fpga开发·1024程序员节