智能洗衣机控制系统设计Verilog代码Quartus仿真

名称:智能洗衣机控制系统设计Verilog代码Quartus仿真(文末获取)

软件:Quartus

语言:Verilog

代码功能:

其中EDA技术所用到的最D的一种语是Verilog, Verilog HDL是一种硬件描述语言(以文本形式来描述数字系统硬件的结构和行为的语言),用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。因此我们在设计智能洗衣机控制系统中就采用了这种语言

基于 Verilog HDL语言的智能洗衣机控制系统的基本功能设计如下:

1可以设计为4种洗衣模式

(1)强力洗衣模式:工作程序为,注水>洗衣>排水>用干

注水>漂洗>排水>甩干

注水>漂洗>排水>甩干。(其中洗衣时间设置为10分钟

(2)普通洗衣模式:工作程序为,注水>洗衣>排水>用干

注水>漂洗>排水>甩干

注水>漂洗>排水>用干。(其中洗衣时间设置为5分钟)

(3)漂洗模式:工作程序为,注水>漂洗>排水>甩千

注水>漂洗>排水>甩干。

(4)甩干模式:工作程序,甩干

在以上四种洗衣模式中,注水时间为1-3分钟,漂洗为5分钟,排水为2分钟,甩干为3分钟

2显示洗衣完成所需时间。

3用不同的LED灯显示洗衣机当前的工作状态(注水、洗衣、排水、甩干)

4洗衣完成后锋鸣3次提示

智能洗衣机控制系统要求.jpg

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. 仿真图(仿真图上左侧为信号名,信号名的具体含义见代码端口注释)

整体仿真图

上图为整体仿真图,图中start_p为开始按键,高电平表示按下按键,开始洗衣。Mode表示洗衣模式,mode=2’b00表示属于强力洗衣模式,此时通过led信号可以观察到洗衣机的工作状态。其中led[4]表示注水,led[3]表示洗衣,led[2]表示漂洗,led[1]表示排水,led[0]表示甩干。上图中,在强力洗衣模式下,依次进行了注水,洗衣,排水,甩干,再注水,漂洗,排水,甩干,注水,漂洗...等步骤。

图中bit_select表示数码管的位选信号,bit_select表示数码管段选信号,数码管显示洗衣时间。具体的显示内容分析在后文显示模块进行分析。

分频模块

分频模块原理为使用计数器进行计数,要将50MHz分频到1Hz,需要从0计数到24999999得到1Hz的半个周期,然后控制1Hz信号翻转,同时计数器清零并且重新开始计数。如此循环就能得到1Hz的信号。在进行仿真时,为便于仿真,将24999999的计数值减小为25。实际应该是24999999。

上图为分频模块仿真图,分频模块用于将50MHz的时钟分频为1Hz的时钟,1Hz对应1秒钟,使用1Hz信号就能得到分钟信号,从而控制洗衣机的运行时间。

图中clk_50M表示输入的50MHz时钟,clk_1Hz表示分频输出的1Hz时钟,可以看到1Hz时钟的周期明显大于50MHz。

控制模块

控制模块为核心处理模块,图中start_p为开始按键,mode为洗衣模式设置信号,left_time为洗衣完成剩余时间,beep表示蜂鸣器,led表示洗衣机当前个状态,led[4]表示注水,led[3]表示洗衣,led[2]表示漂洗,led[1]表示排水,led[0]表示甩干。

上图为4个模式的洗衣仿真图,mode信号分别为00,01,10,11,代表4种模式,图中可以看到,当start_p按下后,洗衣机开始工作,分别按强力洗衣、正常洗衣、漂洗、甩干等模式洗衣,且洗衣结束后蜂鸣器信号变为高电平提示洗衣结束。下面依次详细分析强力洗衣、正常洗衣、漂洗、甩干等模式。

上图为强力洗衣模式,图中mode信号为00,表示强力洗衣模式。Start_p信号开始后,left_time显示41分钟,从41开始倒计时,按注水->洗衣->排水->甩干->注水->漂洗->排水->甩干->注水->漂洗->排水->甩干的步骤进行,其中洗衣时间10分钟,注水时间2分钟,漂洗5分钟,排水2分钟,甩干3分钟。

上图为强力洗衣模式,洗衣结束时,beep蜂鸣器响3次

上图为正常洗衣模式,图中mode信号为01,表示正常洗衣模式。Start_p信号开始后,left_time显示36分钟,从36开始倒计时,按注水->洗衣->排水->甩干->注水->漂洗->排水->甩干->注水->漂洗->排水->甩干的步骤进行,其中洗衣时间5分钟,注水时间2分钟,漂洗5分钟,排水2分钟,甩干3分钟,结束后蜂鸣器响3声。

上图为漂洗模式,图中mode信号为10,表示漂洗模式。Start_p信号开始后,left_time显示24分钟,从24开始倒计时,按注水->漂洗->排水->甩干->注水->漂洗->排水->甩干的步骤进行,其中注水时间2分钟,漂洗5分钟,排水2分钟,甩干3分钟,结束后蜂鸣器响3声。

上图为甩干模式,图中mode信号为11,表示甩干模式。Start_p信号开始后,left_time显示3分钟,从3开始倒计时,直接进入甩干的步骤,甩干3分钟,结束后蜂鸣器响3声。

显示模块

显示模块显示剩余时间,使用2位数码管显示,数码管为共阳极数码管,当数码管的段选信号为低电平时,对应的段亮。两位数码管,其内部连接如下图。

由此图可知,两位 8 段数码管共 10 个引脚,每位数码管的阳极连接在一起, 为共阳极数码管,每位数码管相同段的 led 的阴极连接在一起,这样当给第 10 和第 5 脚高电平,给第 3 脚 低电平时,两个数码管的发光二极管 A 都点亮。以显示数字“18”为例,

既然同时给第 10 和第 5 脚高电平不可行,那么是不是可以先给第 5 脚高电平,第 10 脚低电平,此时, 让其显示数字“8”时,左边的数码管不显示,右边的数码管显示数字“8”;然后给第 10 脚高电平,第 5 脚低电平,此时,让其显示数字“1”时,左边的数码管显示数字“1”,右边的数码管不显示,这样就可 以显示数字“18”了。但有一个问题,多长时间切换显示的数码管呢,时间如果太长就只能看到数字―8” 或数字“1”了,时间太短呢,结果是显示不清晰而且显示亮度不够。由于人眼的视觉暂留(人眼在观察景 物时,光信号传人大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残

留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”)及发光二极管的余辉效应(当停止向发光二极管供电时,发光二极管亮度仍能维持一段时间),每位数码管的点亮时间为 1~2ms 时,显示效果能满足使用需要。数码管的这种驱动方式称为数码管的动态驱动,实际上就是分时轮流控制不同数码管的显示。

以上就是数码管显示的原理,根据该原理,只需要按顺序依次显示剩余时间的十位和个位即可。

显示模块用于显示洗衣倒计时,图中left_time为洗衣剩余时间,图中可以看到时间从19开始,依次倒计时到17。Seg_select为数码管段选,bit_select为数码管位选。位选控制的是哪个数码管点亮,seg_select控制当前数码管显示什么内容,比如图中10010000表示9,11111001表示1,组合起来就是19,18,17也是同理。

不足之处:

本代码根据要求进行了仿真,并且仿真了代码功能,但是由于没有实际的硬件,并未进行硬件测试,后期有条件可以进行硬件测试,进一步验证代码功能。

部分代码展示:

//洗衣机
//注水时间1~3分钟,漂洗5分钟,排水2分钟,甩干3分钟
//模式1 强力洗衣(洗衣10分钟)
//注水->洗衣->排水->甩干
//注水->漂洗->排水->甩干
//注水->漂洗->排水->甩干
//模式2 普通洗衣(洗衣5分钟)
//注水->洗衣->排水->甩干
//注水->漂洗->排水->甩干
//注水->漂洗->排水->甩干
//模式3 漂洗
//注水->漂洗->排水->甩干
//注水->漂洗->排水->甩干
module wash_machine(
input clk_50M,//1Hz
input rst_n,//复位
input start_p,//开始按键
input [1:0] mode,//洗衣模式
output beep,//蜂鸣器,高电平响
output [4:0] led,//显示洗衣机当前工作状态(注水,洗衣,漂洗,排水,甩干)
output  [1:0] bit_select,//数码管位选
output  [7:0] seg_select//数码管段选
);
wire clk_1Hz;//1Hz
wire [7:0] left_time;//洗衣完成剩余时间
源代码

点击下方的公众号卡片获取

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于FPGA的数字计频器的Verilog代码,同时包含了Quartus II的仿真测试代码: ```verilog module freq_counter ( input clk, // 输入时钟 input reset, // 复位信号 input start, // 开始计数信号 output reg [31:0] freq_count // 输出计数器计数值 ); reg [31:0] count; // 内部计数器 always @(posedge clk) begin if (reset) begin count <= 0; freq_count <= 0; end else if (start) begin count <= count + 1; freq_count <= count; end end endmodule module freq_counter_test(); reg clk; reg reset; reg start; wire [31:0] freq_count; freq_counter counter( .clk(clk), .reset(reset), .start(start), .freq_count(freq_count) ); initial begin clk = 0; reset = 1; start = 0; #10 reset = 0; #100 start = 1; #1000 start = 0; #100000 $finish; end always #5 clk = ~clk; endmodule ``` 在这个例子中,我们定义了一个频率计数器模块`freq_counter`,它包含了一个时钟输入`clk`、一个复位信号`reset`、一个开始计数信号`start`和一个计数器计数值输出`freq_count`。在每个时钟上升沿时,如果复位信号为1,则计数器复位为0;如果开始计数信号为1,则计数器加1,并将计数器计数值赋值给输出端口。 我们还定义了一个测试模块`freq_counter_test`,它包含了一个时钟输入`clk`、一个复位信号`reset`、一个开始计数信号`start`和一个计数器计数值输出`freq_count`。在测试模块中,我们通过给时钟、复位和开始计数信号赋值的方式来测试计数器模块的功能。具体来说,我们在仿真开始时将复位信号置为1,经过一段时间后将其置为0,然后在一定时间后将开始计数信号置为1,经过一定时间后再将其置为0。最后,在一定时间后仿真结束。 在Quartus II中,我们可以通过仿真波形来验证计数器模块是否能够正确地计数。具体来说,我们可以打开波形编辑器,将测试模块的输入和输出端口添加到波形中,然后运行仿真。在仿真结果中,我们可以看到计数器模块的计数值是否与预期相符。如果相符,则说明计数器模块的功能是正确的。 希望这个Verilog代码Quartus II仿真测试代码对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值