问一个VHDL的基础问题

[复制链接]
4061|19
 楼主| frily 发表于 2007-9-16 10:12 | 显示全部楼层 |阅读模式
小弟刚学VHDL不久,昨天写了一个状态机,在仿真的时候,发现状态的转换跟我预期的不<br /><br />一样,是两个周期才转换一次。实在找不出问题,就慢慢的删程序,最后把程序删到了只<br /><br />有状态转换部分,但是仿真出来还是两个周期才切换一次状态。<br /><br />我感觉应该是一个周期转换一次状态才对。<br />不知道是我的理解有问题,还是程序有问题。<br />我把代码贴在下面了,麻烦各位帮我看看。<br /><br />谢谢了!!!<br /><br />library&nbsp;IEEE;<br />use&nbsp;IEEE.STD_LOGIC_1164.ALL;<br />use&nbsp;IEEE.STD_LOGIC_ARITH.ALL;<br />use&nbsp;IEEE.STD_LOGIC_UNSIGNED.ALL;<br /><br /><br />entity&nbsp;NonStopWrite&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;port(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clk:in&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rst:in&nbsp;std_logic<br />&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;;<br />end&nbsp;NonStopWrite;<br /><br />architecture&nbsp;Behavioral&nbsp;of&nbsp;NonStopWrite&nbsp;is<br />type&nbsp;NonStopState&nbsp;is&nbsp;(IDLE,WR1,WR2,WR3,WR4,WR5);<br />signal&nbsp;pre_state,next_state:&nbsp;NonStopState;<br />begin<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;process(clk,rst)<br />&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rst='1')then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;IDLE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif(rising_edge(clk))then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;pre_state&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;IDLE&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR1&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR2&nbsp;=&gt&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR3;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR3&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR4&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR5;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR5&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;others=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;IDLE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;case;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;process(clk,rst)<br />&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rst='1')then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre_state&nbsp;&lt=&nbsp;IDLE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif(rising_edge(clk))then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre_state&nbsp;&lt=&nbsp;next_state;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;<br /><br />end&nbsp;Behavioral;<br />
 楼主| frily 发表于 2007-9-16 10:15 | 显示全部楼层

仿真波形

仿真波形如下
 楼主| frily 发表于 2007-9-17 11:41 | 显示全部楼层

bangmang

麻烦大家帮忙看看啊
amtek 发表于 2007-9-17 15:45 | 显示全部楼层

N年前俺好象也犯过同样错误

<br />&nbsp;把第一个process(clk,rst)的clk去掉,但还存在很多很多问题。你最好找个师傅先带带,不然你要走很多弯路。<br />
liangzhitu 发表于 2007-9-17 20:18 | 显示全部楼层

回复

按我的注解修改即可!<br /><br />library&nbsp;IEEE;<br />use&nbsp;IEEE.STD_LOGIC_1164.ALL;<br />use&nbsp;IEEE.STD_LOGIC_ARITH.ALL;<br />use&nbsp;IEEE.STD_LOGIC_UNSIGNED.ALL;<br /><br /><br />entity&nbsp;NonStopWrite&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;port(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clk:in&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rst:in&nbsp;std_logic<br />&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;;<br />end&nbsp;NonStopWrite;<br /><br />architecture&nbsp;Behavioral&nbsp;of&nbsp;NonStopWrite&nbsp;is<br />type&nbsp;NonStopState&nbsp;is&nbsp;(IDLE,WR1,WR2,WR3,WR4,WR5);<br />signal&nbsp;pre_state,next_state:&nbsp;NonStopState;<br />begin<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;process(clk,rst)<br />&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rst='1')then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;IDLE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;if(rising_edge(clk))then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;pre_state&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;IDLE&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR1&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR2&nbsp;=&gt&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR3;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR3&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR4&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR5;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR5&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;others=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;IDLE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;case;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;process(clk,rst)<br />&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rst='1')then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre_state&nbsp;&lt=&nbsp;IDLE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif(rising_edge(clk))then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre_state&nbsp;&lt=&nbsp;next_state;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;<br /><br />end&nbsp;Behavioral;<br /><br />
 楼主| frily 发表于 2007-9-17 21:00 | 显示全部楼层

非常感谢

非常感谢上面两位大侠的帮助!<br /><br />不过我还是想不明白的一个问题就是:<br /><br />按照我原来的写法,感觉应该是每个上升沿状态就会有一次变化啊,<br />但是实际上为什么就要两个周期才变化一次呢?
 楼主| frily 发表于 2007-9-17 21:21 | 显示全部楼层

回复

不过4楼的方法好象有问题<br /><br />如果把clk从敏感信号列表中去掉的话,那将只有rst变化的时候才会引起该进程的工作,系统将一直停留在WR1的状态<br />仿真波形如下:<br />
amtek 发表于 2007-9-18 15:35 | 显示全部楼层

所以说只去掉CLK不行

<br />&nbsp;&nbsp;<br />&nbsp;process(rst,pre_state)<br />&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rst='1')then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;IDLE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;--if(rising_edge(clk))then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;pre_state&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;IDLE&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR1&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR2&nbsp;=&gt&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR3;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR3&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR4&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR5;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;WR5&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;others=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;IDLE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;case;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;以上为专业做法,你如果不理解,就需要花点时间。
 楼主| frily 发表于 2007-9-18 22:46 | 显示全部楼层

谢谢大家

非常感谢大家,尤其是&quot;amtek&quot;!<br /><br />8楼的&quot;qinxg&quot;&nbsp;说:<br />&quot;第一个process要一个时钟后才能作出反映.第2个process也是一样.&nbsp;循环下来不就是2个Clk了&quot;<br />&nbsp;<br />我的理解是:next_state一直超前pre_state一个周期,要完成一次完整的状态的变换的话,首先要用一个周期给next_state变化,然后再用一个周期给pre_state转化,也就是你所说的两个周期完成一次完整的循环.<br /><br />但是单独对于pre_state或者next_state来说的话,应该是一个周期就要变化一次,也就是说应该按照我在下面的图中注释的那样变化,不知道我理解有没有错.
 楼主| frily 发表于 2007-9-18 22:47 | 显示全部楼层
 楼主| frily 发表于 2007-9-18 22:53 | 显示全部楼层

组合逻辑

对于amtek在9楼的写法我想我应该理解到了<br /><br />这个状态机确实应该写成组合逻辑,而且也应该把敏感变量列表中的clk换成pre_state才更准确.<br />不过要靠自己想,估计....<br /><br />多谢指点,非常感谢!
amtek 发表于 2007-9-19 10:36 | 显示全部楼层

我一直想在深圳业余

<br />&nbsp;我一直想在深圳业余收两个徒弟,免费传授国际专业的ASIC设计方法,可从来就没人相信,觉得天上不会掉馅饼。其实我只是想在以后筹建IC开发室时能有更多的选择。<br /><br />&nbsp;楼上如还有技术问题,或深圳真有哥们想学ASIC设计,可给我发邮件:amtek@126.com<br /><br />&nbsp;如果您原来是搞单片机的,又有兴趣创业的,可去“人才聘任”子论坛看帖子“大家一起创业”,那里有我们的一个计划。&nbsp;
风中De舞者 发表于 2007-9-20 09:40 | 显示全部楼层

信号的代入不是即时的

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;IDLE&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR1;<br />也就是说即使初态是IDLE&nbsp;&nbsp;他需要转换成次态&nbsp;&nbsp;首先需要一个上升沿除法这条语句&nbsp;&nbsp;然后需要另一个上升沿来完成信号的代入&nbsp;&nbsp;所以完成这个过程需要俩个信号的上升沿<br />这应该是8楼兄弟的意思&nbsp;&nbsp;<br />顺便问问你的问题搞定了没?&nbsp;&nbsp;把搞定的程序贴出来大家看看&nbsp;&nbsp;也学习学习
风中De舞者 发表于 2007-9-20 09:49 | 显示全部楼层

amtek的做法应该是可靠的

也就是说不用判断CLK是否是上升沿&nbsp;&nbsp;只进行状态转换&nbsp;&nbsp;因为在信号代入语句会形成一个寄存器来保存信号的状态&nbsp;&nbsp;一个CLK脉冲后才代入到另一个信号中&nbsp;&nbsp;这样就省了那个触发信号代入语句执行的CLK脉冲&nbsp;&nbsp;达到了1个CLK就进行转换的目的&nbsp;&nbsp;看来你课本还没有理解透彻哦&nbsp;&nbsp;书上一再强调&nbsp;信号的代入不是即时生效&nbsp;&nbsp;而变量的赋值是即时生效的&nbsp;&nbsp;应该多钻研一下
 楼主| frily 发表于 2007-9-23 10:27 | 显示全部楼层

有点不明白

谢谢楼上的关注!<br />问题已经解决,就是采用的amtek的做法.<br /><br />关于你在14楼提到的内容,我想问一下是不是应该这样理解:<br /><br />状态的转换和next_state的真正的值的变化不是同一个行为?&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />那假如我在编码的时候,定义IDLE编码为:00000,WR1为00001,按照你的意思是不是说:<br />case&nbsp;pre_state&nbsp;is&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;IDLE&nbsp;=&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_state&nbsp;&lt=&nbsp;WR1;<br />如果要执行上面几句话,首先需要一个上升沿来把next_state的状态变为WR1,但是由于信号带入不是即时的,此时虽然next_state的状态已经是WR1了,但他的真正电平还是00000,需要在紧跟的下一个上升沿再把next_state的真正的电平值赋为00001,所以需要两个时钟.<br /><br /><br /><br />不知道我的理解是否正确?<br /><br /><br /><br /><br />
dspjs 发表于 2007-9-23 20:54 | 显示全部楼层

学习。
 楼主| frily 发表于 2007-9-29 12:07 | 显示全部楼层

呼唤 风中De舞者

风中De舞者&nbsp;再来看看啊
zhanghao35 发表于 2007-9-29 20:23 | 显示全部楼层

我也在学习中!<br />
ling631220 发表于 2007-10-6 20:51 | 显示全部楼层

回复frily

信号的执行赋值与完成赋值是不在同一时刻发生的!!完成赋值是执行赋值后一个小延时后发生的!第一个时钟周期next_state变成WR1,第二个时钟周期next_state还是WR1,因为pre_state还没有完成赋值,也就是说CLK上升的时候pre_state还是IDLE,pre_state在小延时后才变成WR1,所以next_state还是WRI,
风中De舞者 发表于 2007-10-10 08:49 | 显示全部楼层

恩 基本上是对的

因为第1个脉冲来的时候条件满足&nbsp;&nbsp;所以要把next_state的状态变为WR1&nbsp;&nbsp;而这是需要一个脉冲才能完成的&nbsp;&nbsp;所以在第2个脉冲结束后next_state的值才真正变成WR1&nbsp;&nbsp;但是在第2个脉冲来的时候next_state的值还不是WR1所以不满足下一个语句的触发条件&nbsp;&nbsp;所以系统不会发生矛盾
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

54

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部