小白创作,请多指教。
设计要求:
1、实现 2 层楼的简易电梯控制系统。
2、电梯有 4 个按键。1 楼外只有向上按键(KEY0),2 楼外只有向下按键(KEY1),电梯内还
有 2 个按键分别为 1 楼按键(KEY2)和 2 楼按键(KEY3)。所有楼层外和电梯内的按键产生的信
号作为给电梯的运行请求信号。电梯在 1 楼时,只有 KEY1、KEY3 有效,在 2 楼时只有 KEY0、
KEY2 有效。电梯在上升过程中只有 KEY0、KEY2 有效,且到达 2 楼后会自动运行回到 1 楼。
在下降过程中只有 KEY1、KEY3 有效,且到达 1 楼后会自动运行回到 2 楼。
3、电梯有 4 个指示灯(LED0、LED1、LED2、LED3)。
LED0(P9): 按下 KEY0 键,若电梯不在 1 楼,则 LED0 亮。
LED1(R8): 按下 KEY1 键,若电梯不在 2 楼,则 LED1 亮。
LED2(R7): 电梯在 2 楼,按 KEY2 键, 则 LED2 亮,电梯到 1 楼后 LED2 灭。
LED3(T5): 电梯在 1 楼,按 KEY3 键, 则 LED3 亮,电梯到 2 楼后 LED3 灭。
4、有 2 个数码管,分别显示当前运行状态及楼层。
(1)1 个数码管(H13)显示当前运行状态,电梯有三个运行状态:待机、上行、下行。待机:
电梯停在 1 楼或 2 楼且无请求信号时均为待机状态。
上行状态:电梯停在 1 楼,有 KEY1 或 KEY3 被按下,进入上行状态。
下行状态:电梯停在 2 楼,有 KEY0 或 KEY2 被按下,进入下行状态。
(2)1 个数码管(G12)显示所在楼层,显示 1 或 2;每一层楼之间的运行时间间隔为 5 秒。
5、有 2 个拨码开关。
(1)复位开关 SW11(F3),向下拨动后,电梯复位回到 1 楼。
(2)启动开关 SW0(T9),向上拨动后,按键有效,电梯正常工作。
6、数码管 N14、N11 显示电梯运行剩余时间,精确到 0.1 秒。
7、电梯在 1 楼时,只有 KEY1、KEY3 有效,在 2 楼时只有 KEY0、KEY2 有效。电梯在上升
过程中只有 KEY0、KEY2 有效,且到达 2 楼后会自动运行回到 1 楼。在下降过程中只有 KEY1、
KEY3 有效,且到达 1 楼后会自动运行回到 2 楼。
8、电梯到达新楼层后蜂鸣器会发出“嘀”声。
设计方案:
Vivado代码:
1.顶层模块lift.v
`timescale 1ns / 1psmodule lift(input clk,         //50M时钟input [3:0] col,   //按键消抖后的信号input reset,       //复位input start,       //启动output [3:0] row,  //矩阵键盘行线output [7:0] seg,  //数码管显示output [5:0] dig,  //数码管使能output [3:0] led,  //LED灯output buzzer_out  //蜂鸣器标志信号);
wire [3:0] btn_out,r0,r4,r5;
wire [1:0] r1;
wire btn_clk,buzzer;
//分频,50Hz
clk_div l1(.clk(clk),.btn_clk(btn_clk));
//按键消抖
ajxd l2(.col(col),.row(row),.btn_clk(btn_clk),.btn_out(btn_out));
//数码管显示
dynamic_led l3(.r0(r0),.r1(r1),.r4(r4),.r5(r5),.clk(clk),.seg(seg),.dig(dig));
//蜂鸣器
buzzer l4(.clk(clk),.buzzer(buzzer),.buzzer_out(buzzer_out));
//电梯控制
lift_ctrl l5(.clk(clk),.key_in(btn_out),.reset(reset),.start(start),.r1(r1),.r0(r0),.r4(r4),.r5(r5),.led(led),.buzzer(buzzer));
endmodule

2.电梯控制模块lift_ctrl.v

`timescale 1ns / 1psmodule lift_ctrl(input clk,input [3:0] key_in,input reset,input start,output [1:0] r1,output [3:0] r0,output [3:0] r4,output [3:0] r5,  //数码管显示output [3:0] led,output buzzer);
//定义寄存器
reg f=0,i=0,flag=0,buzzer_reg=0,rst_reg=1;
reg key_flag=1;  //按键允许标志
reg nd_2=0;  //是否按下第二次标志
reg buzzer_flag=0;  //蜂鸣器发声标志
reg [1:0] k=0,state=0;
reg [3:0] key=0,key1=0,key2=0,led_o=0,floor=1;
reg [5:0] show_time=0;
reg [30:0] count=0;
assign led=led_o;
assign r0=floor;
assign r1=state;
assign r4=show_time%10;//将show_time分为
assign r5=(show_time-(show_time%10))/10;//十位和个位
assign buzzer=buzzer_reg;always@(posedge clk)
begin//检测复位信号,转化为单周期脉冲if((f==0)&&(reset==0))beginrst_reg<=reset;f<=1;endelse if((f==1)&&(rst_reg==0))beginrst_reg<=1;endelse if((f==1)&&(rst_reg==1)&&(reset==1))beginf<=0;end//检测按键信号,转化为单周期脉冲if((start==1)&&(i==0)&&(key_in!=4'b0000))beginkey<=key_in;i<=1;endelse if((i==1)&&(key!=4'b0000))beginkey<=4'b0000;endelse if((i==1)&&(key==4'b0000)&&(key_in==4'b0000))begini<=0;end//检测按键、复位脉冲,控制输出if((rst_reg==0)&&(floor==2)&&(state==0))beginstate<=2;flag<=1;key_flag<=0;  //复位期间按键无效endelse if((key!=0)&&(rst_reg==1)&&(key_flag==1))beginif(key[0])//检测KEY0beginif((key1==4'b0000)&&(floor==2))beginflag<=1;led_o[0]<=1;key1[0]<=1;state<=2;endelse if((key1[1]==1)||(key1[3]==1))beginled_o[0]<=1;key2[0]<=1;key_flag<=0;endendelse if(key[1])//检测KEY1beginif((key1==4'b0000)&&(floor==1))beginflag<=1;led_o[1]<=1;key1[1]<=1;state<=1;endelse if((key1[0]==1)||(key1[2]==1))beginled_o[1]<=1;key2[1]<=1;key_flag<=0;endendelse if(key[2])检测KEY2beginif((key1==4'b0000)&&(floor==2))beginflag<=1;led_o[2]<=1;key1[2]<=1;state<=2;endelse if((key1[1]==1)||(key1[3]==1))beginled_o[2]<=1;key2[2]<=1;key_flag<=0;endendelse if(key[3])//检测KEY3beginif((key1==4'b0000)&&(floor==1))beginflag<=1;led_o[3]<=1;key1[3]<=1;state<=1;endelse if((key1[0]==1)||(key1[2]==1))beginled_o[3]<=1;key2[3]<=1;key_flag<=0;endendendelse无按键按下beginif(count==1)beginshow_time<=50;count<=count+1;endelse if((count>0)&&(count<250000000)&&(count%5000000==0))beginshow_time<=50-count/5000000;count<=count+1;endelse if((count>250000000)&&(count<500000000)&&(count%5000000==0))begincount<=count+1;show_time<=100-count/5000000;endelse if(count==30'd250000000)beginbuzzer_reg<=1;show_time<=0;  //显示回零,蜂鸣器"嘀"k[0]<=1;count<=count+1;endelse if(count==30'd250000002)begink[0]<=0;count<=count+1;endelse if(count==30'd500000000)begink[1]<=1;buzzer_reg<=1;show_time<=0;  //显示回零,蜂鸣器"嘀"count<=count+1;endelse if(k[0]==1)/检测5sbegincount<=count+1;buzzer_reg<=0;if(floor==1)  floor<=2;else if(floor==2)  floor<=1;if(led_o==4'b0000)  //复位完成beginstate<=0;k[0]<=0;flag<=0;count<=0;key_flag<=1;endelse if((led_o==4'b0001)||(led_o==4'b0010)||(led_o==4'b0100)||(led_o==4'b1000))  //没有按第二次,将灯熄灭beginkey1<=4'b0000;key2<=4'b0000;led_o<=4'b0000;state<=0;k[0]<=0;flag<=0;count<=0;key_flag<=1;endelse  //按了第二次,将第一次按的灯熄灭begincount<=count+1;nd_2<=1;  //按了第二次if(state==1)  state<=2;else if(state==2)  state<=1;  //运行状态反转case(key1)4'b0001:led_o[0]<=0;4'b0010:led_o[1]<=0;4'b0100:led_o[2]<=0;4'b1000:led_o[3]<=0;default:led_o<=4'b0000;endcaseendendelse if(k[1]==1)/检测10sbeginif(floor==1)  floor<=2;else if(floor==2)  floor<=1;key1<=4'b0000;key2<=4'b0000;led_o<=4'b0000;state<=0;k[1]<=0;key_flag<=1;flag<=0;count<=0;buzzer_reg<=0;end else计数beginif(flag==1)  count<=count+1;  endend
end
endmodule

3.分频模块clk_div.v

`timescale 1ns / 1psmodule clk_div( clk,btn_clk);
input clk;
output  btn_clk;// 20ms两个输出
reg[31:0] btn_clk_cnt = 0;//对50M时钟1M分频的计数器
reg btn_clk = 0;//50Hz信号,周期20ms,初值为0
always@(posedge clk) //系统时钟上升沿时,20ms,50Hz,50M/50=1000000 ,1M分频
beginif(btn_clk_cnt==499999)beginbtn_clk =~ btn_clk;btn_clk_cnt = 0;endelsebtn_clk_cnt = btn_clk_cnt+1'b1;
end
endmodule

4.按键消抖模块ajxd.v

`timescale 1ns / 1ps
//按键消抖模块
module ajxd(input [3:0] col,output [3:0] row,input btn_clk,output [3:0] btn_out);
reg [2:0] btn0,btn1,btn2,btn3;
assign row=4'b0001;
assign btn_out[0]=(btn0[2]&btn0[1]&btn0[0])|(~btn0[2]&btn0[1]&btn0[0]);
assign btn_out[1]=(btn1[2]&btn1[1]&btn1[0])|(~btn1[2]&btn1[1]&btn1[0]);
assign btn_out[2]=(btn2[2]&btn2[1]&btn2[0])|(~btn2[2]&btn2[1]&btn2[0]);
assign btn_out[3]=(btn3[2]&btn3[1]&btn3[0])|(~btn3[2]&btn3[1]&btn3[0]);
always@ (posedge btn_clk)
begin//KEY0btn0[0]<=col[0];btn0[1]<=btn0[0];btn0[2]<=btn0[1];//KEY1btn1[0]<=col[1];btn1[1]<=btn1[0];btn1[2]<=btn1[1];//KEY2btn2[0]<=col[2];btn2[1]<=btn2[0];btn2[2]<=btn2[1];//KEY3btn3[0]<=col[3];btn3[1]<=btn3[0];btn3[2]<=btn3[1];
end
endmodule

5.数码管显示模块dynamic_led.v

`timescale 1ns / 1psmodule dynamic_led(input [3:0] r0,input [1:0] r1,input [3:0] r4,input [3:0] r5,input clk,output reg [7:0] seg,output reg [5:0] dig);
//分频
reg[24:0] clk_div_cnt=0;
reg clk_div=0;
always @ (posedge clk)
beginif (clk_div_cnt==25000)beginclk_div=~clk_div;clk_div_cnt=0;endelse clk_div_cnt=clk_div_cnt+1;
end
//6进制计数器
reg [2:0] num=0;
always @ (posedge clk_div)
beginif (num>=5)num=0;elsenum=num+1;
end
//译码器
always @ (num)
begin   case(num)0:dig=6'b111110;1:dig=6'b111101;2:dig=6'b111011;3:dig=6'b110111;4:dig=6'b101111;5:dig=6'b011111;default: dig=6'b111111;endcase
end//选择器,确定显示数据
always @ (num)
begin   if(num==0)begincase(r0)4'h0: seg=8'h3f;// DP,GFEDCBA4'h1: seg=8'h06;4'h2: seg=8'h5b;4'h3: seg=8'h4f;4'h4: seg=8'h66;4'h5: seg=8'h6d;4'h6: seg=8'h7d;4'h7: seg=8'h07;4'h8: seg=8'h7f;4'h9: seg=8'h6f;4'ha: seg=8'h77;4'hb: seg=8'h7c;4'hc: seg=8'h39;4'hd: seg=8'h5e;4'he: seg=8'h79;4'hf: seg=8'h71;default: seg=0;endcaseendelse if(num==1)begincase(r1)2'b00: seg=8'h40;2'b01: seg=8'h01;2'b10: seg=8'h08;2'b11: seg=8'h00;default:seg=0;endcaseendelse if(num==4)begincase(r4)4'h0: seg=8'h3f;// DP,GFEDCBA4'h1: seg=8'h06;4'h2: seg=8'h5b;4'h3: seg=8'h4f;4'h4: seg=8'h66;4'h5: seg=8'h6d;4'h6: seg=8'h7d;4'h7: seg=8'h07;4'h8: seg=8'h7f;4'h9: seg=8'h6f;4'ha: seg=8'h77;4'hb: seg=8'h7c;4'hc: seg=8'h39;4'hd: seg=8'h5e;4'he: seg=8'h79;4'hf: seg=8'h71;default: seg=0;endcaseendelse if(num==5)begincase(r5)4'h0: seg=8'hbf;// DP,GFEDCBA,显示小数点4'h1: seg=8'h86;4'h2: seg=8'hdb;4'h3: seg=8'hcf;4'h4: seg=8'he6;4'h5: seg=8'h6d;4'h6: seg=8'hfd;4'h7: seg=8'h87;4'h8: seg=8'hff;4'h9: seg=8'hef;4'ha: seg=8'hf7;4'hb: seg=8'hfc;4'hc: seg=8'hb9;4'hd: seg=8'hce;4'he: seg=8'hf9;4'hf: seg=8'hf1;default: seg=0;endcaseendelseseg=8'h00;
end
endmodule

6.蜂鸣器模块buzzer.v

`timescale 1ns / 1psmodule buzzer(input clk,input buzzer,output buzzer_out);
reg buzzer_clk=0,buzzer_out_flag;
reg [30:0] buzzer_clk_cnt=0;
reg [30:0] buzzer_out_cnt=0;
assign buzzer_out=buzzer_out_flag&&buzzer_clk;
always@(posedge clk) //系统时钟上升沿时 begin  //5kHz,50M/5000=10000 ,1M分频if(buzzer_clk_cnt==4999)beginbuzzer_clk =~ buzzer_clk;buzzer_clk_cnt = 0;endelsebeginbuzzer_clk_cnt = buzzer_clk_cnt+1'b1;end//当buzzer脉冲到来时,将buzzer_out_flag置高0.5秒,即蜂鸣器"嘀"0.5秒if(buzzer==1)beginbuzzer_out_flag<=1;endelse if((buzzer==0)&&(buzzer_out_cnt>=25000000))beginbuzzer_out_flag<=0;endif(buzzer_out_flag==1)beginbuzzer_out_cnt<=buzzer_out_cnt+1;endelsebeginbuzzer_out_cnt<=0;endendendmodule

RTL分析:

Vivado两层电梯简易设计相关推荐

  1. 【单片机毕业设计】【mcuclub-jj-003】基于单片机的八层电梯的设计

    最近设计了一个项目基于单片机的八层电梯系统,与大家分享一下: 一.基本介绍 项目名:八层电梯 项目编号:mcuclub-jj-003 单片机类型:STC89C52.STM32F103C8T6 功能简介 ...

  2. 基于单片机的六层电梯设计

    设计简介: 本设计是基于单片机的六层电梯设计,主要实现以下功能: ①可实现通过内机按键和外机按键控制电梯到达楼层 ②可实现通过一个四相步进电机控制电梯升降,另一个四相步进电机控制电梯开关门 ③可实现通 ...

  3. 两层板PCB如何设计的? 三层板的PCB又是如何设计的?

    来自群友的疑难杂症(加杨老师V信:PCB206 可入群):杨老师,三层板如何设计?我想先学三层板,然后一直往后学,学到十层板? 杨老师(PCB206)经过一些简单分析后,先让他学习两层板,然后学习一个 ...

  4. 基于8086简易电子琴系统仿真设计-基于8086红外自动门控制系统设计-基于单片机8x8矩阵键盘两机串口通信-基于单片机8层电梯控制系统仿真设计-基于单片机ADC0809和DAC0832模数和数模设计

    1189基于8086简易电子琴系统仿真设计-设计资料 编写一实现电子琴的程序,并实现若干扩展功能. 基本功能:用键盘输入对应的七个音阶,通过实验箱的喇叭发出声音,并通过七段数码管显示输入音阶: 扩展功 ...

  5. 基于单片机的八层电梯设计

    设计简介: 本设计是基于单片机的八层电梯设计,主要实现以下功能: ①可实现通过内机按键和外机按键控制电梯到达楼层 ②可实现通过一个四相步进电机控制电梯升降,另一个四相步进电机控制电梯开关门 ③可实现通 ...

  6. si9000阻抗匹配计算_如何在设计之初计算出两层PCB板差分线的阻抗,线宽,间距...

    最近在设计一款两层板PCB.板上一些高速信号线,分别是MIMP接口的差分线和USB2.0的差分线.既然是高速线,那么就需要设计成阻抗匹配走线.MIMP差分线需要做100ohm匹配,USB线需要做90o ...

  7. 基于51单片机的多层电梯(1-16层)运行系统仿真设计_层数可改

    基于51单片机的多层电梯(1-16层)运行系统仿真设计_层数可改 仿真图proteus 8.9 程序编译器:keil 4/5 编程语言:C语言 设计编号:S0027 视频演示 基于51单片机的多层电梯 ...

  8. 西门子1200plc两部六层电梯程序

    西门子1200plc两部六层电梯程序. 适用于博图V14sp1以上版本,含程序和HMI画面,无须eet,使用博图即可仿真. 另外还有单部六层.四层,三部十层.六部十层等程序75386196055509 ...

  9. 两部6层电梯西门子S7-200PLC梯形图程序

    两部6层电梯西门子S7-200PLC梯形图程序 . 一.电梯具有的功能 1.电梯内选和外选按钮的呼叫与对应指示灯的显示功能: 2.电梯开门和关门动作,开门到位: 3.电梯上升和下降的动作: 4.电梯停 ...

最新文章

  1. 【无标题】ubuntu20.04 开机引导后黑屏 光标闪现 无法进入图形桌面的解决方案_Denis.Zzzzzzzz?的博客-CSDN博客_ubuntu20黑屏光标闪烁
  2. python基础知识资料-python基础知识整理(值得收藏)
  3. ORA-25153: Temporary Tablespace is Empty
  4. MySQL-日志二进制日志binlog初探
  5. @description iPhoneX炫彩渐变背景实现
  6. 常用的LINQ to SQL 用法
  7. 找单词(母函数问题)
  8. 网际控制报文协议---ICMP
  9. 幸福框架:模式驱动开发
  10. 组合范畴语法 CCG
  11. 富文本常用封装(NSAttributedString浅析)
  12. Thinking in Java 10.8.1 闭包与回调
  13. 为什么我们要使用图嵌入?
  14. php键盘输入函数,基础篇php常用输入语句和函数
  15. react-native 0.63.4 Xcode升级到13后遇到的问题
  16. 原生滑动选择器 html,自已开发完美的触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器 - j.king...
  17. 一分给情怀,一分给摩尔 IP
  18. Python为什么叫爬虫?Python与爬虫有什么关系?
  19. 【Excle数据透视表】如何移动数据透视表的位置
  20. APP全局色彩饱和度修改

热门文章

  1. 精通JavaScript--05设计模式:创建型
  2. js中的 与或运算顺序 (包含例子)
  3. 巴菲特五度减持中石油 共回笼资金30亿
  4. 安卓开发中遇到The application could not be installed: INSTALL_PARSE_FAILED_MANIFEST_MALFOR
  5. DNSPod x QQ音乐,守护周杰伦“奇迹现场重映计划”千万级线上直播
  6. Android挂断电话最新教程
  7. python主页_主页 - Python 宽客之道
  8. threejs学习记录
  9. T型反馈放大电路详解
  10. 抖音seo,抖音企业号管理,抖音搜索排名源码搭建