CHAN 发表于 2010-6-26 00:12:41

verilog01状态检测怎么输出有问题

简单的检测输入序列中 检测序列的状态机,但是输出后不能全部检测,有些 ”01“,输出为 0;

大侠帮我看看吧

我的程序:
fsm01.v
//////////////////////////////////////////
module fsm01(rst,clk,din,dout);
input rst,clk;
input din;
output dout;
reg dout;
reg state,nextstate;
parameter A = 2'b00,
   B = 2'b11,
   IDLE = 2'b01;
always @(posedge clk)
if(!rst)
state <= IDLE;
else
state <= nextstate;

always @(posedge clk)
begin
nextstate = 2'bx;
dout = 1'b0;

case(state)
A: if(din == 1)
   begin
    dout = 1'b1;
   nextstate = B;
   end
   else
   nextstate = A;
B:
   if(din == 1)
   nextstate = B;
   else
    nextstate = A;
   
IDLE:if(din == 0)
    nextstate = A;
    else
    nextstate = IDLE;

endcase
end

endmodule
////////////////////////////////////
testbench

testfsm01.v
//////////////////////////////////////////
`timescale 1ns/1ns
module testfsm01;
reg t_clk,t_rst;
reg data;
wire x,z;
assign x = data;
initial
begin
t_clk = 0;
t_rst = 0;
#45 t_rst = 1;
data = 26'b10011001100101101010010110;
end
always #30 t_clk = ~t_clk;
always @(posedge t_clk)
data = {data,data};//移位

fsm01 DUT(
   .clk(t_clk),
   .rst(t_rst),
   .din(x),
   .dout(z)
   );

endmodule

longtime 发表于 2010-6-26 00:55:21

高手都哪去啦,帮我看看吧

interi 发表于 2010-6-26 02:02:21

怎么没有人啊?、我没找到问题再哪,郁闷的哦

VVC 发表于 2010-6-26 03:08:44

dout 输出指定不全,生成了一个锁存器,输出当然会出错。<br>
建议在各个状态下都为&nbsp; &nbsp; dout 指定输出。

ICE 发表于 2010-6-26 04:21:07

状态机变量state一共有00,01,11,10四个状态,程序中没有说明10状态,也没有default可能也会影响结果吧

ANG 发表于 2010-6-26 04:44:01

这个状态机完全不对,错误之处很多<br>
首先,第二个always语句应该是组合逻辑,敏感表中怎么有时钟信号,而不是输入信号<br>
其次,dout在每个状态下都应该有输出,否则会产生latch<br>
再次,如果是同步复位的话,那么同步复位信号rst释放之后应该在哪个状态?

Sunlife 发表于 2015-6-17 09:28:32


dout 输出指定不全,生成了一个锁存器,输出当然会出错。<br>
建议在各个状态下都为&nbsp; &nbsp; dout 指定输出。
页: [1]
查看完整版本: verilog01状态检测怎么输出有问题