搜索
bottom↓
回复: 7

懂vhdl帮帮忙 我在编写密码锁状态机的时候出问题了 一直找不出 急!!!

[复制链接]

出0入0汤圆

发表于 2010-12-11 12:52:31 | 显示全部楼层 |阅读模式
--ZTQ.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ZTQ 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;
       CLK:IN STD_LOGIC;
       CLK_1S:IN STD_LOGIC;
       KAI:OUT STD_LOGIC;
       WARN:OUT STD_LOGIC;
       DATA:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
END ENTITY ZTQ;
ARCHITECTURE ART OF ZTQ IS
    SIGNAL ACC,REE,MIMA:STD_LOGIC_VECTOR(15 DOWNTO 0);
    SIGNAL NC,DIR:STD_LOGIC_VECTOR(2 DOWNTO 0);
    SIGNAL CUO:STD_LOGIC_VECTOR(1 DOWNTO 0);
    SIGNAL TWICE,JINGGAO,CHANG,DUAN,SPEAKER,ANJIAN,KAISUO,ENLOCK:STD_LOGIC;
    TYPE STATE_TYPE IS (S0,S1,S2,S3,S4);
    ---S0输入状态, S1输入后按键判断状态, S2开锁状态, S3输入错误状态,S4密码重新设置状态;
    SIGNAL STATE:STATE_TYPE;
   BEGIN
   PROCESS(DATA_F,CUO,KAISUO,JINGGAO,TWICE,ANJIAN)IS
   BEGIN
    REE<="0000000000000000";  ----初始化
    NC<="000";
    TWICE<='0';
    CUO<="00";
    ENLOCK<='0';
    JINGGAO<='0';
    CHANG<='0';
    DUAN<='0';
    SPEAKER<='0';
    DIR<="000";
    KAISUO<='0';
    ANJIAN<='0';
    IF DATA_F="1000" THEN
     STATE<=S0;
    END IF;
    CASE STATE IS
      WHEN S0=>
         IF ANJIAN='1' THEN
           IF NC<4 THEN
             ACC<=ACC(11 DOWNTO 0)&DATA_N;
             NC<=NC+1; ANJIAN<='0';
             STATE<=S0;
           END IF;
         ELSIF
           (DATA_F="0100")THEN      ---清除;
            NC<="000";ACC<="0000000000000000";
            STATE<=S0;   
         ELSIF
           (DATA_F="0001")THEN      ---确认;
           STATE<=S1;
         ELSE
           STATE<=S0;
         END IF;
      WHEN S1=>
         IF NC<4 THEN
           STATE<=S3;
         ELSIF (NC=4)THEN
           IF ENLOCK='0' THEN
              IF ACC=MIMA THEN    --密码符合;
                STATE<=S2;KAISUO<='1';
              ELSIF ACC="0000100100100011" THEN   --万用密码;
                STATE<=S2;KAISUO<='1';
              ELSE
                STATE<=S3;
              END IF;
           ELSE
              STATE<=S4;
           END IF;
         END IF;
      WHEN S2=>ENLOCK<='1';CUO<="00";NC<="000";ACC<="0000000000000000";
         IF(DATA_F=0010)THEN       ---设置密码;
            STATE<=S0;
         ELSIF(DATA_F="1000")THEN    ---关锁;
            STATE<=S0;ENLOCK<='0';NC<="000";ACC<="0000000000000000";
         END IF;
      WHEN S3=>JINGGAO<='1';
         IF CUO<2 THEN            ---短报警;
           CUO<=CUO+1; DUAN<='1';NC<="000";ACC<="0000000000000000";TWICE<='0';
           STATE<=S0;
         ELSIF CUO=2 THEN      ---长报警;
           NC<="000";ACC<="0000000000000000";CUO<="00";CHANG<='1';
           STATE<=S0;
         END IF;
       WHEN S4=>
         IF (TWICE='0')THEN     ---第一次输入密码;
            TWICE<='1'; REE<=ACC;
            STATE<=S0; NC<="000";ACC<="0000000000000000";
         ELSIF(TWICE='1')THEN    ---确认密码;
            IF(REE=ACC)THEN
               MIMA<=REE;STATE<=S2;
            ELSE
               STATE<=S3;
            END IF;
         END IF;
      END CASE;
    END PROCESS;

SHIZHONG:BLOCK IS
    SIGNAL DIR:STD_LOGIC_VECTOR(2 DOWNTO 0);
    SIGNAL JINGGAO,CHANG,DUAN,SPEAKER,KAISUO:STD_LOGIC;
    BEGIN
    PROCESS(CLK_1S,KAISUO,JINGGAO,DUAN,CHANG,DIR)IS
    BEGIN
    IF CLK_1S'EVENT AND CLK_1S='1' THEN   --1S时钟;
      IF JINGGAO='1'THEN  
        SPEAKER<='1';DIR<=DIR+1;
         IF DUAN='1' THEN     --1S到了消除短报警信号
            IF(DIR="001") THEN DUAN<='0';SPEAKER<='0';DIR<="000";JINGGAO<='0';
            END IF;
         ELSIF CHANG='1' THEN    ---5S到了消除长报警信号
            IF(DIR="101") THEN CHANG<='0';SPEAKER<='0';DIR<="000";JINGGAO<='0';
            END IF;
         END IF;
      ELSIF KAISUO='1' THEN DIR<=DIR+1;    --开锁显示
         IF(DIR="001")THEN KAISUO<='0';DIR<="000";
         END IF;
      END IF;
     END IF;
     END PROCESS;
   END BLOCK SHIZHONG;

    KEYIN_PROCESS:BLOCK IS
SIGNAL ANJIAN:STD_LOGIC;
    BEGIN
    PROCESS(FLAG_N)IS
    BEGIN
     IF FLAG_N'EVENT AND FLAG_N='1' THEN    --判断数字按键;
        ANJIAN<='1';
     ELSE
        ANJIAN<='0';
     END IF;
    END PROCESS;
END BLOCK KEYIN_PROCESS;
    DATA<=ACC;    --最后数据输出
    KAI<=KAISUO;
    WARN<=JINGGAO;
END ARCHITECTURE ART;

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

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

出0入0汤圆

 楼主| 发表于 2010-12-11 12:54:03 | 显示全部楼层
我用ACC来做密码锁数字输入的寄存器,  最后输入给DATA做输出用于显示 ,但仿真的时候  DATA显示00000000   就是没有输出,还有在状态机里的某些信号比如‘ANJIAN’‘ KAISUO’ 等 调不出来。

出0入0汤圆

发表于 2010-12-13 17:57:36 | 显示全部楼层
回复【1楼】ltaifsq
-----------------------------------------------------------------------
有些中间变量再仿真时就是掉不出来,楼主的状态机好像没有初始化,我以前遇到过没有初始化会出现不可预测的错误。

出0入0汤圆

发表于 2010-12-15 20:02:30 | 显示全部楼层
这写的是什么状态机,就是你急死了,这也出不了结果。楼主似乎压根没有懂VHDL如何去描述状态机。回去好好找资料看看吧,别发这样的贴,连个端口的注释都没有,工作原理没有,就来问,这贴看着就烦。提示一下,你那经典的一段是状态机,综合出来是个组合逻辑。在看你那初始化,写的真神了。所以你仿真的结果一点都不奇怪。

出0入0汤圆

发表于 2010-12-18 20:32:44 | 显示全部楼层
找书上的例子看吧,有些问题自己琢磨到底最好,基础没搞好出来问,高手一般没空也不耐烦回答了。

出0入0汤圆

发表于 2010-12-18 20:34:34 | 显示全部楼层
想想前几天做那个汽车尾灯,哎,怎么也仿真不出来,结果老师不让我混,我就只好回来看书加百度了,发觉自己什么都不懂,还好最后勉强弄出来了。

出0入0汤圆

发表于 2013-3-12 17:30:09 | 显示全部楼层
能不能告诉我怎么做电子密码锁啊。。大哥。。我完全不会。但是毕业设计有必须做

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 07:11

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

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