状态机问题,初始状态怎摸决定?
本帖最后由 fpgaw 于 2010-11-18 16:01 编辑module state2 ( nrst,clk,
i1,i2,
o1,o2,
err
);
input nrst,clk;
input i1,i2;
output o1,o2,err;
reg o1,o2,err;
reg NS,CS;
parameter //one hot with zero idle
IDLE = 3'b000, 初始状态怎摸决定?
S1 = 3’b001,
S2 = 3’b010,
ERROR = 3’b100;
//sequential state transition
always @ (posedge clk or negedge nrst)
if (!nrst)
CS <= IDLE;
else
CS <=NS; 为什摸将不是将cs附给ns,不是先有cs再有ns吗?
//combinational condition judgment
always @ (CS or i1 or i2)
begin
NS = 3'bx; x是什摸?
ERROR_out;
case (CS)
IDLE: begin
IDLE_out;
if (~i1) NS = IDLE; 为什摸不写成<=
if (i1 && i2) NS = S1;
if (i1 && ~i2) NS = ERROR;
end
S1: begin
S1_out;
if (~i2) NS = S1;
if (i2 && i1) NS = S2;
if (i2 && (~i1)) NS = ERROR;
end
S2: begin
S2_out;
if (i2) NS = S2;
if (~i2 && i1) NS = IDLE;
if (~i2 && (~i1)) NS = ERROR;
end
ERROR: begin
ERROR_out;
if (i1) NS = ERROR;
if (~i1) NS = IDLE;
end
endcase
end
//output task
task IDLE_out;
{o1,o2,err} = 3'b000; 据书上说此步为封装,没看懂有什摸用?
endtask
task S1_out;
{o1,o2,err} = 3'b100;
endtask
task S2_out;
{o1,o2,err} = 3'b010;
endtask
task ERROR_out;
{o1,o2,err} = 3'b111;
endtask 楼主,不好意思的说,代码怎么这么乱呀? 是很乱,摸不到头绪,请多指教了. 第一个,初始状态由reset确定<br>
下一个,ns是下一个状态,cs是现态,赋值的时候你说是把次态赋给现态,还是反过来?<br>
下一个,X是不确定状态<br>
下一个,这里是组合逻辑电路,所以用=不用<=<br>
下一个,{}表示拼接,可以认为是封装<br>
<br>
结论:上面那些问题都是很基础的,问题不是出在状态机复杂上,而是楼主基础知识不是很扎实<br>
建议楼主再好好熟悉一下基础知识 谢谢楼上了,但为啥把次态赋给现态?我认为先有现态再有次态,所以NS <=CS; <br>
初始状态怎摸决定?000,001,010是根据什麽决定的?你说的reset不是复位吗?<br>
说的罗哩叭嗦,不知道写清楚了没? 举个例子,状态1s变化一次。<br>
现态是现在的状态cs,比如是0时刻;<br>
次态是将来的ns,比如说是1s时刻的<br>
现在的状态运行完了,要进入下一个状态,<br>
就是应该在1s时刻要运行的状态,所以此时要有cs=ns;<br>
而此时的下一个状态ns是啥,则由其他条件决定。<br>
<br>
000,001什么的都是参数,这个你可以随便选,一般fpga的话用独热码,具体你可以查相关资料。<br>
而reset是使电路在初始的时候进入正常的确定的状态循环<br>
<br>
说得很罗唆,不知道讲清楚没 很清楚了,不知道你能否给解释一下关于线性反馈移位寄存器的原理与实现? 写的好详细,已经明白了,刚开始自学,还要多多看书.(学校刚学完VHDL,但状态机被空过去了,从坛子上看貌似很重要) 谢谢了. 原帖由 kuxi4969 于 2006-10-16 11:02 发表<br>
很清楚了,不知道你能否给解释一下关于线性反馈移位寄存器的原理与实现? 线性反馈移位寄存器<br>
你有它的原理图没有?<br>
在网上找一下吧,一看图马上就明白怎么回事了<br>
你先看看,如果有不明白再问 解释的很详细!
页:
[1]
2