哪位帮忙修改下这段VHDL语言的密码锁程序?
先谢谢大家,很多问题在这都解决了。现在在做毕业设计遇到了点问题,下面是我编的一段密码锁控制程序,但是提示好像多个进程中的相同变量被赋值了,麻烦高手帮忙修改下,就是从语法上修改就行了http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_550375.jpg
(原文件名:未命名.jpg)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CTRL IS
PORT(DATA_N:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DATA_F:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
FLAG_N:IN STD_LOGIC;
FLAG_F:IN STD_LOGIC;
CLK: IN STD_LOGIC;
ENLOCK:OUT STD_LOGIC;
ALARM: OUT STD_LOGIC;
DATA_BCD:OUT STD_LOGIC_VECTOR(19 DOWNTO 0)
);
END ENTITY;
ARCHITECTURE structure of CTRL IS
type state_type is (INIT,OUTLOCK_READY,PS_WRONG,PS_CHANGE,OUTLOCK_SUCCESS,DEAD_LOCK);
SIGNAL state : state_type;
SIGNAL NC,ERR_N:STD_LOGIC_vector(2 downto 0);
SIGNAL ACC,REG:STD_LOGIC_VECTOR(19 DOWNTO 0);
BEGIN
REG<="00010010001101000101"; --设置一个初始密码12345
-- INIT-------------->初始状态
-- OUTLOCK_READY----->待开锁状态
-- PS_WRONG---------->密码错误状态
-- PS_CHANGE--------->密码修改状态
-- OUTLOCK_SUCCESS--->开锁成功状态
-- DEAD_LOCK--------->死锁状态
--状态机
process(CLK)
BEGIN
IF rising_edge(CLK) THEN
CASE state IS
WHEN INIT => --初始状态(安静状态,警报关闭,没有按键输入)
ALARM<='0'; --清除报警信号
-- FLAG_N='0';
-- FLAG_F='0';
ENLOCK <='1';
NC<="000";ERR_N<="000";
ACC<=(others=>'0');
-- IF RST='1' THEN
-- state <= INIT;
-- ELSIF DATA_F="1101" THEN
-- state <= OUTLOCK_READY;
IF DATA_F="1101" THEN --按下开锁键
state <= OUTLOCK_READY;--等待开锁状态
ELSE state <= INIT;
END IF;
WHEN OUTLOCK_READY =>
IF NC=5THEN
IF DATA_F="1011" THEN
IF ACC=REG THEN
state <=OUTLOCK_SUCCESS; --开锁成功
ELSE
state <=PS_WRONG; --返回错误状态
ERR_N <=ERR_N+1; --错误次数计数器加1
END IF;
END IF;
END IF;
WHEN PS_WRONG =>
IF ERR_N <3 THEN
state <= OUTLOCK_READY;
ELSE
state <= DEAD_LOCK; --密码错误次数超过3次就进入死锁状态
ALARM <= '1';enlock<='1';--报警、上锁
END IF;
WHEN OUTLOCK_SUCCESS =>
ENLOCK <='0';
IF DATA_F="1110" THEN --密码设置键
state <= PS_CHANGE;
ELSIF DATA_F="1010" THEN --上锁键
state <= INIT;
END IF;
WHEN PS_CHANGE =>
REG <=(others=>'0'); --清除密码存储器中密码
IF NC=5 AND DATA_F="1011" THEN
state <= OUTLOCK_SUCCESS;
REG <=ACC;
ELSEstate <= PS_CHANGE;
END IF;
WHEN DEAD_LOCK =>
ALARM<='1';
IF DATA_F="1100" THEN --按下复位键
state <= INIT;
ELSE state <= DEAD_LOCK;
END IF;
END CASE;
END IF;
END process;
Process(FLAG_N)
Begin
IF FLAG_N'event and FLAG_N='1' THEN --当数据标志上升沿到来时,就表明有数字按键按下
IF NC<5 THEN
ACC <=ACC(15 downto 0)&DATA_N; --密码位数不超过五位时,每按下一个数字键最低位数字就被更新一次,同时其它位左移一位
NC <=NC+1; --并且密码位数计数变量NC加1
END IF;
END IF;
END PROCESS;
END structure; 能写出这么长的代码了,这点错误应该能改吧。vhdl无能 对,你对ACC的操作要放同一个进程 回复【2楼】888888888888
-----------------------------------------------------------------------
我认真学VHDL语言也就这2个月,因为做毕业设计,但是我现在不知道怎么去修改了,如果放进同一个进程里,那下面那个进程怎么办呢?因为有个上升沿判断在那里 开始思路就没理清楚才会写出同意输出两个进程驱动的代码,没法改(我没兴趣改)
页:
[1]