|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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无变化。谢谢各位了! |
|