在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3260|回复: 3

[求助] 关于数字钟调节模块的小问题

[复制链接]
发表于 2011-3-24 22:43:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 pureelite 于 2011-3-24 22:45 编辑

最近刚学ISE12.1不久,做了一个数字钟,但是在调时模块遇到了点小小的问题,就是在进行功能仿真时(1)CLK1HZ的输入信号不能传递到输出的CLK上;(2)S_CE,M_CE,H_CE输出不正确。先附上此部分源代码,写得很详细也很罗嗦,希望有大虾能够帮助我,在此谢谢了!

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;

entity adjuster is
    Port (
     CLK1HZ : in  STD_LOGIC;  --输入时钟,在test bench中设置成一个方波信号
           SET : in  STD_LOGIC;  --输入设置,在MODE不同按下次数时可以分别给秒分时当时钟(给上升沿)进行调时
           MODE : in  STD_LOGIC;  --MODE按下不同次数改变信号CON的值从而实现计数或者调时的切换

           EN : in  STD_LOGIC;    --EN,S_ENOUT,M_ENOUT为输入使能信号,正常计数时EN始终为1(在top模块中设置为1,此处未贴出)
           S_ENOUT : in  STD_LOGIC;  --秒到60进位时变为1(连接了信号输入,此处未贴秒计数模块)
           M_ENOUT : in  STD_LOGIC;  --分到60进位时变为1(连接了信号输入,此处未贴秒计数模块)

           CLK : out  STD_LOGIC;   --这4个信号是输出,正常模式下CLK输出应该和CLK1HZ同步,调时情况下SET代替CLK提供上升沿)
           S_CE : out  STD_LOGIC;   --输出使能,调秒分时分别使S_CE为1,M_CE为1,H_CE为1
           M_CE : out  STD_LOGIC;
           H_CE : out  STD_LOGIC
     );
end adjuster;

architecture rtl of adjuster is
SIGNAL SEL   :STD_LOGIC;      --确定是计时还是调节的信号,为1就计数,为0就调时
SIGNAL SCE_REG :STD_LOGIC; --临时信号,分别保存秒分时的调时信号,为1时(此时要SEL为0)进行相应位的调时
SIGNAL MCE_REG :STD_LOGIC;
SIGNAL HCE_REG :STD_LOGIC;
SIGNAL CON   :INTEGER RANGE 0 TO 3 :=0;      --0表示正常计数,1,2,3分别为秒分时的调时信号,初始为0

begin
COUNT :  PROCESS(MODE,SET)             --SET没用,不过写不写程序都不正常,此进程为一个4位计数器
BEGIN
IF rising_edge(MODE) THEN          --MODE按键按下后,产生上升沿,CON加一
  IF CON = 3 THEN
   CON <= 0;
  ELSE
   CON <= CON + 1;
  END IF;
END IF;
END PROCESS;

CON_PRO :  PROCESS(CON)      --根据CON的值的不同来改变SEL的值(1为正常计数,0为调整),在SEL为0时,SCE_REG,MCE_REG
,HCE_REG分别有效,在后面在赋给输出量
BEGIN
CASE CON IS
  WHEN 0 => SEL <='1';   
      SCE_REG <='0';
      MCE_REG <='0';
      HCE_REG <='0';
  WHEN 1 => SEL <='0';         
      SCE_REG <='1';
      MCE_REG <='0';
      HCE_REG <='0';
  WHEN 2 => SEL <='0';
      SCE_REG <='0';
      MCE_REG <='1';
      HCE_REG <='0';
  WHEN 3 => SEL <='0';
      SCE_REG <='0';
      MCE_REG <='0';
      HCE_REG <='1';
  WHEN OTHERS => SEL <='0';
      SCE_REG <='0';
      MCE_REG <='0';
      HCE_REG <='0';  
  END CASE;
END PROCESS;

SEL_PRO :  PROCESS(SEL)
BEGIN
CASE SEL IS
  WHEN '0' => S_CE<= SCE_REG;      --为SEL=0就是将刚刚的0,1给输出使能,为1时对应的秒分时计时模块有效(此次未附加上)
      M_CE<= MCE_REG;
      H_CE<= HCE_REG;
      CLK<= SET;
  WHEN '1' => S_CE<= EN;    ----为SEL=1则正常计数,EN始终有效,秒计数模块按照输出CLK的上升沿计数,产生的进位信号S_ENOUT给分计时模块的使能端M_CE,分进位M_ENOUT给时计时使能端H_CE
      M_CE<= S_ENOUT;
      H_CE<= M_ENOUT;
      CLK<= CLK1HZ;      
  WHEN OTHERS => S_CE<= EN;
       M_CE<= S_ENOUT;
       H_CE<= M_ENOUT;
       CLK<= CLK1HZ;      
END CASE;
END PROCESS;
end rtl;


麻烦大家帮我看一看,我找不到哪里出错了,仿真时CLK1HZ信号不能传给CLK,当MODE和SET改变时输出的S_CE有变化,但M_CE,H_CE无变化。谢谢各位了!
 楼主| 发表于 2011-3-24 22:55:24 | 显示全部楼层
调了好久了,不懂哪里错了。。。
发表于 2011-3-25 13:36:00 | 显示全部楼层
第三个process用一个if...else就搞定了,何必用case,太麻烦;和之前的放在一起即可。而且全部都是组合逻辑,应该没什么问题,最好仿真的时候看看内部信号的变化是不是符合预期。你的设计风格还是不太好的,像按键最好不要这样去捕捉边沿,仿真的时候没问题,但是实际当中的按键未必和你仿真给的激励一样。
 楼主| 发表于 2011-3-25 19:18:41 | 显示全部楼层
回复 3# gaurson


    谢谢!非常感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-30 19:30 , Processed in 0.027439 second(s), 9 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表