我在AHDL中有一个控制单元(UC)的实现,我应该模拟它,看它是否按照相应的ASM图中的定义工作。 我使用 MAX + plus II 来模拟它,它不能像我预期的那样工作,但我不能说出错是什么,因为我不熟悉AHDL,更不用说表部分。
这是我的控制单位:
SUBDESIGN EXP1_UC ( CLKUC: INPUT; RES: INPUT; N1,N2,M1,M2: INPUT;
CLR1, CLR2, CLR3, EN1, EN2, EN3, SEL: OUTPUT; ) VARIABLE UC: MACHINE OF BITS (CLR1, CLR2, CLR3, EN1, EN2, EN3, SEL) WITH STATES ( s0 = B"1110000", s1= B"0001000", s2= B"0000100", s3= B"0000000", s4= B"0000010", s5= B"0000001", s6= B"0000011" ); BEGIN UC.CLK = CLKUC; UC.RESET = RES; TABLE UC, N1,N2,M1,M2 => UC; s0, 0, 0, X, X => s0; s0, 1, X, X, X => s1; s0, X, 1, X, X => s2; s1, X, X, X, X => s3; s2, X, X, X, X => s3; s3, 0, 0, 0, 0 => s3; s3, 1, X, X, X => s1; s3, X, 1, X, X => s2; s3, X, X, 1, X => s4; s3, X, X, X, 1 => s5; s4, X, X, X, X => s3; s5, X, X, X, X => s6; s6, X, X, X, X => s3; END TABLE; END;
模拟中有两种情况我不明白:
1)当前状态为S3且输入为M1 = 1且M2 = 1时,下一状态为S6。我不明白,因为我看到它的方式,没有先通过S5而无法进入S6。
2)当前状态为S0且输入为N1 = 1且N2 = 1时,下一状态在模拟中定义为“12”。好吧,没有这样的状态......
任何人都可以帮助我吗? 感谢。
更新:
1)我必须使用ADHL和MAX + plus II,即使它不是最好的工具组合,因为这是大学的文书工作,我没有写代码(就像我说的,我只是假设为了模拟它,我无法改变它。)
答案 0 :(得分:1)
首先:你真的必须使用AHDL吗? - 多年来它一直没有得到Altera土地的适当支持。 MAX Plus II是一个非常古老的软件 - 获得Quartus并学习VHDL(如果必须的话,学习Verilog)将是我的建议。对不起,如果这听起来很刺耳!
但是你的问题听起来真的是一个传统的逻辑问题......你的状态机的输入是否正确同步?如果没有,你可以获得各种奇怪的效果,因为它们接近时钟边缘变化,然后信号到达时钟一侧的状态机的一部分和时钟“另一侧”的其他部分(即直到下一个周期才看到)。这会让事情搞得一团糟!另外,确保您的复位信号也与clk信号同步。
快速入侵 - 在每个输入上的链中粘贴两个触发器。然后阅读同步异步输入...