集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2987|回复: 8

一个状态机的问题

[复制链接]
CCIE 发表于 2010-6-26 01:24:18 | 显示全部楼层 |阅读模式
本帖最后由 fpgaw 于 2010-11-18 16:23 编辑

我设计一个状态机
状态机是用两个按键来进行状态的转变的
可是综合有错误,查了一些资料,说状态机的转变只能用同一信号的触发沿来进行
是不是这样呢?
那如果要设计一个 靠按键的触发沿来实现状态转变的状态机怎么实现呢?
大虾们能不能指点一下,先谢谢了!
CHA 发表于 2010-6-26 02:06:57 | 显示全部楼层
你说的"查了一些资料,说状态机的转变只能用同一信号的触发沿来进行" 我想是时钟驱动状态机运转的意思,跟控制状态具体怎么转没关系的!<br>
我理解的是"这个唯一的时钟驱动状态机不停的望前走,但具体走到哪个状态.还是保持还来的状态就由控制信号决定了.<br>
例如在VHDL中状态机除开说明部分外,还有"主控时序进程" ,"主控组合进程","辅助进程"-----<br>
我写状态机还不很熟,敬供参考个人意见
tim 发表于 2010-6-26 03:40:00 | 显示全部楼层
下面的是我写的用按键1和按键2来控制状态状态转移的程序<br>
不知道大家有没有去skywolf 大虾的网站上看见过 多功能时钟的设计 ,这就是我针对其中跑表那段设计的&nbsp;&nbsp;<br>
大家帮我看看这个错误吧. <br>
error:<br>
Always Construct error: more than one register in the Event Control of an Always Construct is not used in the rest of the Always Construct<br>
_____________________________________________________________<br>
`timescale 1ns/1ns<br>
module stopwatch10(display_value,key2,key1,clk);<br>
output [7:0] display_value;<br>
input key1,key2,clk;<br>
reg [7:0] counter,holding_time;<br>
reg [1:0] present_state,next_state;<br>
parameter stopping = 2'b00,running=2'b11,holding=2'b01;<br>
always @(posedge key2 or posedge key1)&nbsp; &nbsp;&nbsp; &nbsp;//报错行<br>
begin<br>
present_state&lt;=next_state;<br>
case(present_state)<br>
stopping:<br>
begin<br>
if(key2)<br>
next_state&lt;=running;<br>
else <br>
holding_time&lt;=8'b0;<br>
end<br>
running:<br>
begin<br>
if(key2)<br>
next_state &lt;= stopping;<br>
if(key1)<br>
next_state&lt;=holding;<br>
holding_time &lt;= counter;<br>
end<br>
holding:<br>
begin<br>
if(key2)<br>
//refresh<br>
holding_time&lt;=counter;<br>
if(key1)<br>
next_state&lt;=running;<br>
end<br>
default:&nbsp; &nbsp;begin<br>
next_state &lt;= stopping;<br>
holding_time &lt;= 8'b0;<br>
end<br>
endcase<br>
end<br>
always @(posedge clk)<br>
begin<br>
if(present_state[0])<br>
begin<br>
counter &lt;= counter+1;<br>
end<br>
else<br>
begin<br>
counter &lt;= 8'b0;<br>
end<br>
end<br>
assign display_value = present_state[1]?counter:holding_time;<br>
endmodule<br>
HDL 发表于 2010-6-26 05:31:18 | 显示全部楼层
是不是程序太长,大家没耐性看下去了?<br>
就帮我分析一下这个错误就行了<br>
不明白为什么 always @(posedge key2 or posedge key1)&nbsp; &nbsp; <br>
会有错那?
UFO 发表于 2010-6-26 06:00:30 | 显示全部楼层
这是触发器的描述方式<br>
如果进程中有 if key1 ... 那么就把key2当成时钟,key1当成异步信号<br>
否则 仿真器认为你要在一个触发器上加两个时钟 这个实际中是没有的<br>
改成 always @ (key1 or key2) 吧
AAT 发表于 2010-6-26 07:58:19 | 显示全部楼层
zigzag说得极是,但是本人认为还是用同步的电路比组合电路要稳定些,就用一个时钟不可以吗??比如always @ (posedge key1),另外一个作为使能判断不行吗??
interi 发表于 2010-6-26 08:43:56 | 显示全部楼层
说说你always @(posedge key2 or posedge key1)的错误提示是什么
usd 发表于 2010-6-26 10:31:26 | 显示全部楼层
两个是按键,而不是时钟
Sunlife 发表于 2015-6-24 10:44:01 | 显示全部楼层
你说的"查了一些资料,说状态机的转变只能用同一信号的触发沿来进行" 我想是时钟驱动状态机运转的意思,跟控制状态具体怎么转没关系的!<br>
我理解的是"这个唯一的时钟驱动状态机不停的望前走,但具体走到哪个状态.还是保持还来的状态就由控制信号决定了.<br>
例如在VHDL中状态机除开说明部分外,还有"主控时序进程" ,"主控组合进程","辅助进程"-----<br>
我写状态机还不很熟,敬供参考个人意见
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

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

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-5-6 17:49 , Processed in 0.071750 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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