名称: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
完整代码
扫描文章末尾的公众号二维码