zhupingheng 发表于 2010-4-29 20:13:04

哪位帮忙修改下这段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;

yvhksovo 发表于 2010-4-29 20:30:01

能写出这么长的代码了,这点错误应该能改吧。vhdl无能

NJ8888 发表于 2010-4-29 20:31:29

对,你对ACC的操作要放同一个进程

zhupingheng 发表于 2010-4-29 20:36:46

回复【2楼】888888888888
-----------------------------------------------------------------------
我认真学VHDL语言也就这2个月,因为做毕业设计,但是我现在不知道怎么去修改了,如果放进同一个进程里,那下面那个进程怎么办呢?因为有个上升沿判断在那里

NJ8888 发表于 2010-4-29 20:42:58

开始思路就没理清楚才会写出同意输出两个进程驱动的代码,没法改(我没兴趣改)
页: [1]
查看完整版本: 哪位帮忙修改下这段VHDL语言的密码锁程序?