VHDL设计——电梯控制器模块
设计一个10层楼的电梯控制器模块,要求:(1)时间先后优先级;(2)位置先后优先级。
电梯运行规则:
当电梯处在上升模式时,只响应比电梯所在位置高的上楼请求,由下向上逐个执行,直到最后一个上楼请求执行完毕。如果高层有下楼请求,直接升到有下楼请求的最高楼层,然后进入下降模式。下降模式类似。
定义每层楼的状态,可扩展至任意楼层。
FLOOR(IN):XXXXXXXXXX(10~1楼;1有效,0无效)
POSITION(OUT):XXXX(当前楼层)
UP_DOWN:X(0上升模式,1下降模式)
Design Block:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ELEVATOR ISPORT(CLK,RST:IN STD_LOGIC;FLOOR:IN STD_LOGIC_VECTOR(10 DOWNTO 1);POSITION:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END ELEVATOR;
ARCHITECTURE BEHAV OF ELEVATOR IS
TYPE STATES IS (S0,S1,S2,S3,S4,S5,S6,S7,S8);ATTRIBUTE ENUM_ENCODING:STRING;ATTRIBUTE ENUM_ENCODING OF STATES:TYPE IS "gray";SIGNAL C_ST,N_ST:STATES:=S0;SIGNAL UP_DOWN,UD:STD_LOGIC:='0'; --0上升,1下降BEGINCOM:PROCESS(C_ST,FlOOR,UP_DOWN,RST)VARIABLE P:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF RST='1' THEN P:="0001";END IF;CASE C_ST ISWHEN S0 => IF FLOOR="0000000000" THEN N_ST<=S0;ELSIF UP_DOWN='0' THENIF P="0001" THEN IF (FLOOR(2) OR FLOOR(3) OR FLOOR(4) OR FLOOR(5) OR FLOOR(6) OR FLOOR(7) OR FLOOR(8) OR FLOOR(9) OR FLOOR(10))='0' THEN UD<='1';END IF;ELSIF P="0010" THEN IF (FLOOR(3) OR FLOOR(4) OR FLOOR(5) OR FLOOR(6) OR FLOOR(7) OR FLOOR(8) OR FLOOR(9) OR FLOOR(10))='0' THEN UD<='1';END IF;ELSIF P="0011" THEN IF (FLOOR(4) OR FLOOR(5) OR FLOOR(6) OR FLOOR(7) OR FLOOR(8) OR FLOOR(9) OR FLOOR(10))='0' THEN UD<='1';END IF;ELSIF P="0100" THEN IF (FLOOR(5) OR FLOOR(6) OR FLOOR(7) OR FLOOR(8) OR FLOOR(9) OR FLOOR(10))='0' THEN UD<='1';END IF;ELSIF P="0101" THEN IF (FLOOR(6) OR FLOOR(7) OR FLOOR(8) OR FLOOR(9) OR FLOOR(10))='0' THEN UD<='1';END IF;ELSIF P="0110" THEN IF (FLOOR(7) OR FLOOR(8) OR FLOOR(9) OR FLOOR(10))='0' THEN UD<='1';END IF;ELSIF P="0111" THEN IF (FLOOR(8) OR FLOOR(9) OR FLOOR(10))='0' THEN UD<='1';END IF;ELSIF P="1000" THEN IF (FLOOR(9) OR FLOOR(10))='0' THEN UD<='1';END IF;ELSIF P="1001" THEN IF FLOOR(10)='0' THEN UD<='1';END IF;ELSIF P="1010" THEN UD<='1';END IF;N_ST<=S3;ELSIF UP_DOWN='1' THENIF P="1010" THEN IF (FLOOR(9) OR FLOOR(8) OR FLOOR(7) OR FLOOR(6) OR FLOOR(5) OR FLOOR(4) OR FLOOR(3) OR FLOOR(2) OR FLOOR(1))='0' THEN UD<='0';END IF;ELSIF P="1001" THEN IF (FLOOR(8) OR FLOOR(7) OR FLOOR(6) OR FLOOR(5) OR FLOOR(4) OR FLOOR(3) OR FLOOR(2) OR FLOOR(1))='0' THEN UD<='0';END IF;ELSIF P="1000" THEN IF (FLOOR(7) OR FLOOR(6) OR FLOOR(5) OR FLOOR(4) OR FLOOR(3) OR FLOOR(2) OR FLOOR(1))='0' THEN UD<='0';END IF;ELSIF P="0111" THEN IF (FLOOR(6) OR FLOOR(5) OR FLOOR(4) OR FLOOR(3) OR FLOOR(2) OR FLOOR(1))='0' THEN UD<='0';END IF;ELSIF P="0110" THEN IF (FLOOR(5) OR FLOOR(4) OR FLOOR(3) OR FLOOR(2) OR FLOOR(1))='0' THEN UD<='0';END IF;ELSIF P="0101" THEN IF (FLOOR(4) OR FLOOR(3) OR FLOOR(2) OR FLOOR(1))='0' THEN UD<='0';END IF;ELSIF P="0100" THEN IF (FLOOR(3) OR FLOOR(2) OR FLOOR(1))='0' THEN UD<='0';END IF;ELSIF P="0011" THEN IF (FLOOR(2) OR FLOOR(1))='0' THEN UD<='0';END IF;ELSIF P="0010" THEN IF FLOOR(1)='0' THEN UD<='0';END IF;ELSIF P="0001" THEN UD<='0';END IF;N_ST<=S3;END IF;POSITION<=P;WHEN S1 => IF FLOOR="0000000000" THEN N_ST<=S0;ELSEP:=P+1;IF FLOOR(CONV_INTEGER(P))='1' THEN N_ST<=S0;ELSE N_ST<=S7;END IF;END IF;WHEN S2 => IF FLOOR="0000000000" THEN N_ST<=S0;ELSEP:=P-1;IF FLOOR(CONV_INTEGER(P))='1' THEN N_ST<=S0;ELSE N_ST<=S8;END IF;END IF;WHEN S3 => N_ST<=S4;WHEN S4 => N_ST<=S5;WHEN S5 => N_ST<=S6;WHEN S6 =>IF UP_DOWN='0' THEN N_ST<=S1;ELSIF UP_DOWN='1' THEN N_ST<=S2;END IF;WHEN S7 => N_ST<=S1;WHEN S8 => N_ST<=S2;END CASE;END PROCESS COM; REG:PROCESS(CLK,UD,RST)BEGINIF RST='1' THEN C_ST<=S0;ELSIF CLK'EVENT AND CLK='1' THEN UP_DOWN<=UD;C_ST<=N_ST;END IF;END PROCESS REG;
END BEHAV;
Test Bench:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ELEVATOR_vhd_tst IS
END ELEVATOR_vhd_tst;
ARCHITECTURE ELEVATOR_arch OF ELEVATOR_vhd_tst IS
SIGNAL CLK1,RST1 : STD_LOGIC;
SIGNAL FLOOR1 : STD_LOGIC_VECTOR(10 DOWNTO 1);
SIGNAL POSITION1 : STD_LOGIC_VECTOR(3 DOWNTO 0);
CONSTANT CLK_P:TIME:=1 us;
COMPONENT ELEVATORPORT(CLK,RST:IN STD_LOGIC;FLOOR:IN STD_LOGIC_VECTOR(10 DOWNTO 1);POSITION:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COMPONENT;
BEGINi1 : ELEVATOR PORT MAP(CLK => CLK1, RST => RST1, FLOOR => FLOOR1, POSITION => POSITION1);PROCESSBEGINCLK1<='0'; WAIT FOR CLK_P;CLK1<='1'; WAIT FOR CLK_P;END PROCESS;RST1<='1','0' AFTER 2 us;FLOOR1<="1010000110","0000000000" AFTER 72 us,"0010000011" AFTER 90 us,"0000000000" AFTER 152 us;
END ELEVATOR_arch;
仿真波形图:
VHDL设计——电梯控制器模块相关推荐
- Verilog HDL设计——电梯控制器模块
设计一个10层楼的电梯控制器模块,要求:(1) 以按键的时间先后优先级进行设计:(2) 以楼层最短位置先后优先级进行设计. 电梯运行规则: 当电梯处在上升模式时,只响应比电梯所在位置高的上楼请求,由下 ...
- 微型计算机课设电梯控制8255,东南大学吴健雄学微机课程设计电梯控制器.doc
东南大学吴健雄学微机课程设计电梯控制器 东南大学吴健雄学院 <微机实验及课程设计> 课程设计报告 FBI Warning: 汇编代码是好几届之前的一个学姐的只是修改了一下后完美运行是我自己 ...
- 原理图以及vhdl设计一位全加器
原理图设计以及VHDL设计 一位加法器 全加器原理 全加器真值 输出表达式 原理图设计法 VHDL设计法 代码如下: 全加器是用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器.一位全加器 ...
- 左移寄存器vhdl_双向移位寄存器VHDL设计.doc
双向移位寄存器VHDL设计.doc 双向移位寄存器 引言 移位寄存器就是指具有移位功能的触发器组,它是在普通寄存器的基础上添加了移位功能的一种特殊的寄存器.通常,移位功能就是指在寄存器里面存储的二进制 ...
- 模块设计之“模块”与“模块化”
模块设计之"模块"与"模块化" 模块泛指软件系统的功能部件.在软件的体系结构设计完成之际,我们就已经确定了所有模块的功能,并且把模块安放在体系结构的恰当位置上. ...
- TPS54560设计降压模块需要注意事项
TPS54560设计降压模块需要注意的一些问题 • TPS54560是一款输入电压高达60V,输出电流高达5A的降压稳压器.可以方便灵活的适用于电源的设计中.下面我们一起来看看这个芯片的结构,以及设计 ...
- 【电商】电商后台设计—商品模块
在今天,互联网电商的发展如火如荼,如果有同学想做电商,但对电商后台模块不了解,可以进来学习交流一下.作者就电商产品的后台设计--商品模块的内容进行了一个简单的归纳总结,供你学习参考. 从本期开始,我将 ...
- VHDL设计——交通红绿灯控制器模块
设计一个交通红绿灯控制器模块,实现主干道和支路之间红绿黄灯的信号转换. Design Block: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEE ...
- AD4003 VHDL设计及仿真
AD4003 VHDL语言设计,在quartusII19.1下进行综合和仿真 下面是工程综合和仿真: 顶层模块设计: library ieee; use ieee.std_logic_1164.all ...
最新文章
- 24、嵌合体序列Chimeras
- solr 中文分词 mmseg4j 使用例子 ,NGramTokenizerFactory
- Mysql load data local命令详解
- python命令行解析库——argparse库的使用
- 网络流之最小点权覆盖和最大点权独立集学习
- java 静态方法调用的问题
- 在线XML转CSV工具
- 调用阿里API获取城市天气信息
- northwind数据库介绍
- python flag=1_python中flag什么意思
- ARM Cortex 详解
- 找工作就来程序c#/.net开发求职招聘QQ群
- linux设备号——常见设备的主次设备号
- 神经网络编译器图层面IR
- 利用pcs+pacemaker+corosync实现(HA)高可用集群
- tableView 取消 cell 默认下划线样式 - iOS
- 【C语言习题】两素数之差为2,则称该两素数为双胞胎数。求出[2,300]内双胞胎数。
- freopen函数详解
- Windows资源监控工具大全
- THead USB适配方案