搜索
bottom↓
回复: 25

懂vhdl的大哥们帮帮忙 小女子在编写密码锁状态时出了点问题

[复制链接]

出0入0汤圆

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


    --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入168汤圆

发表于 2010-12-11 13:03:39 | 显示全部楼层
老规矩

出0入0汤圆

 楼主| 发表于 2010-12-11 13:05:26 | 显示全部楼层
什么意思

出0入0汤圆

发表于 2010-12-11 13:19:27 | 显示全部楼层
回复【3楼】llh1234
-----------------------------------------------------------------------

老规矩,小女子的话,先上照片才回答问题了。

出0入0汤圆

 楼主| 发表于 2010-12-11 13:26:49 | 显示全部楼层
我上了 不知道怎么上不了

出0入0汤圆

 楼主| 发表于 2010-12-11 13:27:06 | 显示全部楼层
有权限吗?

出0入0汤圆

发表于 2010-12-11 13:44:36 | 显示全部楼层
你用中文把PORT,SIGNAL作用标明下,也许可以帮你。

出0入0汤圆

发表于 2010-12-11 13:50:24 | 显示全部楼层
老规矩,无图不真相

出0入0汤圆

发表于 2010-12-11 13:52:02 | 显示全部楼层
老规矩

出0入0汤圆

发表于 2010-12-11 13:53:25 | 显示全部楼层
一段式状态机,很难看懂啊我。首先你要确定你这个状态转化图式正确的

出0入0汤圆

 楼主| 发表于 2010-12-11 13:58:58 | 显示全部楼层
怎么确定  不是很懂

出0入0汤圆

 楼主| 发表于 2010-12-11 14:07:51 | 显示全部楼层
为什么一定要图呢?
给了你们图是不是就能解决呢  我是来问问题的啊

出110入26汤圆

发表于 2010-12-11 14:13:13 | 显示全部楼层
回复【12楼】llh1234  
为什么一定要图呢?
给了你们图是不是就能解决呢  我是来问问题的啊
-----------------------------------------------------------------------

别给,不想回答的拉倒。
以后发帖不要用‘小女子’这些字眼,不要以为在这里可以更受关照。
这类帖子恶劣情况下甚至几天都解决不了。

出0入0汤圆

 楼主| 发表于 2010-12-11 14:21:56 | 显示全部楼层
回复【7楼】40130064 博德之门IV
-----------------------------------------------------------------------

       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;  --1S脉冲
       KAI:OUT STD_LOGIC;   --开锁状态位置1  用于控制4位数码管显示open的
       WARN:OUT STD_LOGIC;  --报警状态位置1   用于控制4位数码管显示warn的
       DATA:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));--数据输出  就是存入ACC的值赋给data送显示
END ENTITY ZTQ;
ARCHITECTURE ART OF ZTQ IS
    SIGNAL ACC,REE,MIMA:STD_LOGIC_VECTOR(15 DOWNTO 0); --ACC寄存器存输入密码的--REE用于暂存重新设定的密码 --MIMA存储设定好的新密码
    SIGNAL NC,DIR:STD_LOGIC_VECTOR(2 DOWNTO 0); --NC 输入数字位数 不能超过4   --DIR是1S时钟模块里 1S就加1
    SIGNAL CUO:STD_LOGIC_VECTOR(1 DOWNTO 0); --cuo错误次数 小于3次短报警  大于3次长报警
    SIGNAL TWICE,JINGGAO,CHANG,DUAN,SPEAKER,ANJIAN,KAISUO,ENLOCK:STD_LOGIC;
  --twice 设置密码时要输入两遍,twice置1就表示输入第2编了
  --jinggao  有产生错误 就置1
  --chang duan 分别是上报警 短报警标识
  -- speaker 是蜂鸣器信号
  --anjian  有按键输入时置1
  --enlock  在开锁模式下  置1 表面再开锁模式下  在这个模式下 才能按设置键 进行密码更改

出0入0汤圆

 楼主| 发表于 2010-12-11 14:22:54 | 显示全部楼层
懂的能加个Q联系下吗

出0入0汤圆

 楼主| 发表于 2010-12-11 14:23:50 | 显示全部楼层
我错了

出0入4汤圆

发表于 2010-12-11 14:25:45 | 显示全部楼层
先上“小女子”照片,再加QQ

出0入0汤圆

发表于 2010-12-11 14:57:21 | 显示全部楼层
上次有个人妖装女人,恶心得大家好久没逛坛子,以后自称小女子的规矩就是PP 三维啥的问清楚了确认是小女子才回答问题

出0入0汤圆

 楼主| 发表于 2010-12-11 17:33:39 | 显示全部楼层
怎么判断自己的状态转换图的正误呢

出0入0汤圆

发表于 2010-12-11 20:30:40 | 显示全部楼层
平时发个求助帖,几乎没几个人回帖,尤其是这么长的代码,而今天这么多人。。。。。。无语了。。。。

出0入0汤圆

发表于 2010-12-11 20:40:19 | 显示全部楼层
专程进来围观自称“小女子”的人。

出0入0汤圆

发表于 2010-12-11 21:18:24 | 显示全部楼层
人多热闹!!!

其实这代码我仔细看过了,要在这基础上改,以自己的水平不是几个小时能完成的。整体框架太乱了,有心无力。

出0入0汤圆

发表于 2013-3-12 17:31:07 | 显示全部楼层
小女子,你的电子密码锁做出来没。。能不能分享下。我现在忙着做毕设。但是我小白一枚。完全摸不着北啊

出0入0汤圆

发表于 2013-3-16 23:05:12 | 显示全部楼层
围观小女子

出0入0汤圆

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

本版积分规则

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

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

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

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