搜索
bottom↓
回复: 4

哪位帮忙修改下这段VHDL语言的密码锁程序?

[复制链接]

出0入0汤圆

发表于 2010-4-29 20:13:04 | 显示全部楼层 |阅读模式
先谢谢大家,很多问题在这都解决了。现在在做毕业设计遇到了点问题,下面是我编的一段密码锁控制程序,但是提示好像多个进程中的相同变量被赋值了,麻烦高手帮忙修改下,就是从语法上修改就行了

(原文件名:未命名.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=5  THEN
                     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;
                   ELSE  state <= 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;

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-4-29 20:30:01 | 显示全部楼层
能写出这么长的代码了,这点错误应该能改吧。vhdl无能

出0入0汤圆

发表于 2010-4-29 20:31:29 | 显示全部楼层
对,你对ACC的操作要放同一个进程

出0入0汤圆

 楼主| 发表于 2010-4-29 20:36:46 | 显示全部楼层
回复【2楼】888888888888
-----------------------------------------------------------------------
我认真学VHDL语言也就这2个月,因为做毕业设计,但是我现在不知道怎么去修改了,如果放进同一个进程里,那下面那个进程怎么办呢?因为有个上升沿判断在那里

出0入0汤圆

发表于 2010-4-29 20:42:58 | 显示全部楼层
开始思路就没理清楚才会写出同意输出两个进程驱动的代码,没法改(我没兴趣改)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 17:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表