Quartus4层电梯控制器verilog代码仿真

名称:Quartus4层电梯控制器verilog代码仿真(文末获取)

软件:Quartus

语言:Verilog

代码功能:

1. 要求

电梯可在4层之间移动,每层都有按钮,所有按钮都在电梯外部。 按下按钮意味着需要采取某些措施,以下各节将对此进行详细说明。 电梯系统可以建模为有限状态机,该有限状态机经历状态转换并根据提供的输入产生输出。 设计有限状态机并通过使用状态图或表来描述其行为。 根据以下规范在Verilog中实施该系统,并提交代码,波形以及描述该波形的详细记录。

1.1 描述

除时钟信号外,系统还有6个输入。 时钟信号用于同步目的。 按钮1U位于一楼,2U和2D位于二楼,3U和3D位于三楼,4D位于四楼。 按下按钮及其含义如下表所示。

请注意,不同楼层的相同名称的开关连接在一起。 因此,例如,如果在任意楼层按下1U,则只有一个信号将被激活并被馈送到电梯控制器

输入(按钮)

意义

1U

一楼的人想去二楼

2U

二楼的人想去三楼

3U

三楼的人想去四楼

4D

四楼的人想去三楼

3D

三楼的人想去二楼

2D

二楼的人想去一楼

1.2 输出说明

有3个输出指示要采取的措施,并在下表中列出。

输出 (电梯的动作)

意义

Up

电梯向上走

Down

电梯向下走

Stay

电梯停在相同的层

1.3 系统行为

电梯可以位于4层中的任何一层; 1楼,2楼,3楼或4楼。在每个时钟周期,根据是否按下按钮,必须采取某些措施,其列表如下:

电梯当前位置

输入

采取的行动顺序

一楼

1U

将电梯移至二楼

2U

将电梯移至二楼,然后移至三楼

2D

将电梯移至第二层,然后移至第一层

3U

将电梯移至3楼,然后移至4楼

3D

将电梯移至三楼,然后移至二楼

4D

将电梯移至4楼,然后移至3楼

二楼

1U

将电梯移至第一层,然后移至第二层

2U

将电梯移至三楼

2D

将电梯移至二楼

3U

将电梯移至3楼,然后移至4楼

3D

将电梯移至三楼,然后移至二楼

4D

将电梯移至4楼,然后移至3楼

三楼

1U

将电梯移至第一层,然后移至第二层

2U

将电梯移至二楼,然后移至三楼

2D

将电梯移至第二层,然后移至第一层

3U

将电梯移至4楼

3D

将电梯移到二楼

4D

将电梯移至4楼,然后移至3楼

四楼

1U

将电梯移至第一层,然后移至第二层

2U

将电梯移至二楼,然后移至三楼

2D

将电梯移至第二层,然后移至第一层

3U

将电梯移至3楼,然后移至4楼

3D

将电梯移至3楼,然后移至2楼

4D

将电梯移至三楼

1. 工程文件

2. 程序文件

3. 程序编译

4. Testbench

5. 仿真图

1、按下D3,电梯原本在1楼,先上升到3楼,再下降到2楼。

2、按下U1,电梯原本在2楼,先下降到1楼,再上升到2楼。

3、同时按下U3和D2,电梯原本在2楼,先执行U3,上升到3楼,再上升到4楼,然后执行D2,下降到2楼,再下降到1楼。

4、按下D4,电梯原本在1楼,先上升到4楼,再下降到3楼。

5、按下U2,电梯原本在3楼,先下降到2楼,再上升到3楼。

部分代码展示:

module InputBuffer(clk,U1,U2,U3,D2,D3,D4,done,qEmpty,up_down_key);
input clk;//时钟
input U1,U2,U3,D2,D3,D4;//输入按键
input done;//done信号
output qEmpty;//高电平表示缓冲区没有待响应按键
output [5:0] up_down_key;//按键编号
//定义信号
reg [5:0] up_down_key=6'b0;
reg [5:0] btn_up_down=6'b000000;//6it按键缓存,最高位->最低位依次代表U1,U2,U3,D2,D3,D4
reg qEmpty;
//定义按键D触发器缓存
reg U1_buf0,U1_buf1;
reg U2_buf0,U2_buf1;
reg U3_buf0,U3_buf1;
reg D2_buf0,D2_buf1;
reg D3_buf0,D3_buf1;
reg D4_buf0,D4_buf1;
//定义按键上升沿信号
wire U1_p;
wire U2_p;
wire U3_p;
wire D2_p;
wire D3_p;
wire D4_p;
//D触发器缓存2级
always@(posedge clk)
begin
U1_buf0<=U1;
U1_buf1<=U1_buf0;
end
//D触发器缓存2级
always@(posedge clk)
begin
U2_buf0<=U2;
U2_buf1<=U2_buf0;
end
//D触发器缓存2级
always@(posedge clk)
begin
U3_buf0<=U3;
U3_buf1<=U3_buf0;
end
//D触发器缓存2级
always@(posedge clk)
begin
D2_buf0<=D2;
D2_buf1<=D2_buf0;
end
//D触发器缓存2级
always@(posedge clk)
begin
D3_buf0<=D3;
D3_buf1<=D3_buf0;
end
//D触发器缓存2级
always@(posedge clk)
begin
D4_buf0<=D4;
D4_buf1<=D4_buf0;
end
//获取按键上升沿,信号为一个时钟的高电平
assign U1_p=U1_buf0 & ~U1_buf1;//1U按键上升沿,1个时钟高电平
assign U2_p=U2_buf0 & ~U2_buf1;//2U按键上升沿,1个时钟高电平
assign U3_p=U3_buf0 & ~U3_buf1;//3U按键上升沿,1个时钟高电平
assign D2_p=D2_buf0 & ~D2_buf1;//D2按键上升沿,1个时钟高电平
assign D3_p=D3_buf0 & ~D3_buf1;//D3按键上升沿,1个时钟高电平
assign D4_p=D4_buf0 & ~D4_buf1;//D4按键上升沿,1个时钟高电平
//按键缓存到btn_up_down
always@(posedge clk)
begin
if(U1_p==1) 
btn_up_down[5]<=1; //1U按键缓存在btn_up_down的bit5
else if(up_down_key==6'b100_000)//按键执行
btn_up_down[5]<=0;//清除缓存
else
btn_up_down[5]<=btn_up_down[5];//keep
if(U2_p==1) 
btn_up_down[4]<=1; //2U按键缓存在btn_up_down的bit4
else if(up_down_key==6'b010_000)//按键执行
btn_up_down[4]<=0;//清除缓存
else
btn_up_down[4]<=btn_up_down[4];//keep
if(U3_p==1) 
btn_up_down[3]<=1; //3U按键缓存在btn_up_down的bit3
else if(up_down_key==6'b001_000)//按键执行
btn_up_down[3]<=0;//清除缓存
else
btn_up_down[3]<=btn_up_down[3];//keep
if(D2_p==1) 
btn_up_down[2]<=1; //2D按键缓存在btn_up_down的bit2
else if(up_down_key==6'b000_100)//按键执行
btn_up_down[2]<=0;//清除缓存
else
btn_up_down[2]<=btn_up_down[2];//keep
if(D3_p==1) 
btn_up_down[1]<=1; //3D按键缓存在btn_up_down的bit1
else if(up_down_key==6'b000_010)//按键执行
btn_up_down[1]<=0;//清除缓存
else
btn_up_down[1]<=btn_up_down[1];//keep
if(D4_p==1) 
btn_up_down[0]<=1; //4D按键缓存在btn_up_down的bit0
else if(up_down_key==6'b000_001)//按键执行
btn_up_down[0]<=0;//清除缓存
else
btn_up_down[0]<=btn_up_down[0];//keep
end
always@(*) 
begin
if(done==1)//done==1表示可以读取按键缓存btn_up_down[5:0]内的数据,按 1U, 2U, 3U, 2D, 3D, 4D顺序执行
if(btn_up_down[5])      
up_down_key=6'b100_000;//执行1U按键
else if(btn_up_down[4]) 
up_down_key=6'b010_000;//执行2U按键
else if(btn_up_down[3]) 
up_down_key=6'b001_000;//执行3U按键
else if(btn_up_down[2]) 
up_down_key=6'b000_100;//执行2D按键
else if(btn_up_down[1]) 
up_down_key=6'b000_010;//执行3D按键
else if(btn_up_down[0]) 
up_down_key=6'b000_001;//执行4D按键
else
up_down_key=6'b000_000;//清除
else
up_down_key=up_down_key;
if(btn_up_down==6'b000_000)//若btn_up_down==6'b000_000表示没有待响应按键,输出高电平,否则输出低电平
qEmpty=1;
else
qEmpty=0;
end
endmodule
完整代码

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

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于FPGA设计的智能电梯控制器设计WORD文档+quartus13.0工程Verilog源码文件,可以做为你的课程设计参考。 1.1 设计要求 ① 楼的高度大于等于6,根据降低运行成本的原则,设计并实现一个以方向优先电梯调度算法。 ②要求能够使用按键模拟对电梯的控制,为了便于观察,将电梯所在的楼(1~6)用数码管显示出来,将电梯的上下楼状态(上,下,开门,关门,静止)用发光管或数码管显示出来,并且能够实现对电梯实现锁定禁止运行。 ③ 画出电梯控制器的状态机,写出状态编码方案。 ④ 用Verilog语言对设计进行描述,并下载到实验板上调试成功,适当增加比较符合现实的控制限制。 ⑤ 写出设计性实验报告,并打印各次的源文件和仿真波形,然后作简要说明。 并谈谈此次实验的收获、感想及建议 1.2 设计思路 我把电梯的状态分为三种:上升、下降、停留(其中包括开门、关门、禁止),状态分别编码为00、01、10来识别。楼设计为六,一般的电梯在每外面都有上下请求的按钮,还有电梯内部的一楼到六楼的请求,以及持续开门、关门的请求。我们可以通过按键的输入对各种变量进行赋值,代表不同的请求,然后用case语句分各个楼进行条件判断,每分为两大块的响应,即本有无需求,若有需求,则进行开门动作,若无需求,则分上升的状态和下降和停留的状态,分别又有不同的请求(除第一和第六特殊,只有上升的或下降的请求),上升下降分别作不同的响应(主要对i值进行变化)即可 输入主要用按键实现(六个楼加向上向下两个,共八个),电梯的状态分为4种,上升,下降,停留,禁止分别用4个LED灯来表示,用数码管显示电梯所在楼。对电梯的锁定操作,是同时按上下两个按键,电梯锁定的操作是电梯自动回到一楼,并对请求无任何响应。 之后对该系统进行了改进,对于开门与关门的区别,我采用LCD显示,主要是对停留状态进行进一步分解,停留时对LCD显示进行控制,从而显示开门关门状态。 module dianti(ledup,leddown,ledforbid,ledstay,A,B,c1,c2,c3,c4,c5,c6,clock,out,LCD_DATA,LCD_EN, LCD_RS, LCD_RW, LCD_ON, LCD_BLON,test); output ledup,leddown,ledstay,ledforbid; output [6:0]out; output LCD_EN, LCD_RS, LCD_RW, LCD_ON, LCD_BLON; output [1:0]test;//用于测试开门关门状态 input A,B,clock,c1,c2,c3,c4,c5,c6; inout [7:0]LCD_DATA; //.输入输出变量的声明 reg [4:0] floor1; reg [5:1] floor2; reg [5:0] floor3; reg [3:0] i; reg [1:0] s; reg [6:0]out; reg [3:0]t; reg [1:0]control; //寄存器变量 wire clk_out;//分频后的输出时钟 wire [1:0]test; reg ledup,leddown,ledforbid,ledstay; assign test=control; Clock c(clock,clk_out); //分频 LCD d(clock,control,LCD_DATA,LCD_EN, LCD_RS, LCD_RW, LCD_ON, LCD_BLON);//LCD显示 always @(posedge clk_out) begin t<=t+4'b0001; ledup<=(s==2'b01 &&!(A==1 && B==1) ); //电梯上升中 leddown<=(s==2'b10 &&!(A==1 && B==1));//电梯下降中 ledforbid<=(A==1 && B==1);// 电梯处于锁定 ledstay<=(s==2'b00&&!(A==1 && B==1));//电梯停留 if( A==1 && B==0) begin // request up if(c5==1) floor1[4]<=1; if(c4==1) floor1[3]<=1; if(c3==1) floor1[2]<=1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值