• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

Quartus 4层电梯控制器verilog代码

06/09 13:29
1105
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-231225162KI45.doc

共1个文件

名称:Quartus 4层电梯控制器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 将电梯移至三楼

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

设计文档:

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

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=407

  • 2-231225162KI45.doc
    下载

相关推荐