注册 登录
ET创芯网论坛(EETOP) 返回首页

yuedx的个人空间 http://blog.eetop.cn/?317611 [收藏] [复制] [分享] [RSS]

日志

FPGA 中使用 Verilog 语言设计序列检测器

已有 2696 次阅读2009-3-30 19:42 |个人分类:FPGA设计

 
看北航夏宇闻老师写的《verilog 数字系统设计教程》中利用有限状态机进行时序逻辑的设计一个练习,发觉状态机的设计优点问题。检测的目标序列是 10010,原代码是这样设计的。

原文的设计程序
-----------------------------------------------------------------------------------------------------------------------
module test(clock,reset,signalin,signalout);
    input clock,signalin,reset;
    output signalout;
    reg [2:0] state;
   
    parameter
        idle = 3'd0,
        a = 3'd1,
        b = 3'd2,
        c = 3'd3,
        d = 3'd4,
        e = 3'd5,
        f = 3'd6,
        g = 3'd7;
   
    assign signalout = (state == e && signalin == 0)?1:0;
   
    always@(posedge clock)
        if(!reset)
            begin
                state <= idle;
            end
        else
            begin
                casex(state)
                    idle:
                        begin
                            if(signalin == 1)
                                state <= a;
                            else
                                state <= idle;
                        end
                    a:
                        begin
                            if(signalin == 0)
                                state <= b;
                            else
                                state <= a;
                        end
                    b:
                        begin
                            if(signalin == 0)
                                state <= c;
                            else
                                state <= f;
                        end
                    c:
                        begin
                            if(signalin == 1)
                                state <= d;
                            else
                                state <= g;
                        end
                    d:
                        begin
                            if(signalin == 0)
                                state <= e;
                            else
                                state <= a;
                        end
                    e:
                        begin
                            if(signalin == 0)
                                state <= c;
                            else
                                state <= a;
                        end
                    f:
                        begin
                            if(signalin == 1)
                                state <= a;
                            else
                                state <= b;
                        end
                    g:
                        begin
                            if(signalin == 1)
                                state <= a;
                            else
                                state <= f;
                        end
                    default:
                        state <= idle;
                endcase
            end
endmodule
-------------------------------------------------------------------------------------------------------------------------------------
如果将上述系统的状态转移图画出来可以发现,根本用不上这么多的状态,而且在某些情况下,序列的检测是错误的,仿真如下图所示:


上图中,在第 6 us后的一个10000010 的序列被认为是一个10010的序列,这显然是错误的。


经过分析,重新设计了新的有限状态机,用到了6个状态 idle,a,b,c,d,e,仿真后也得到了正确的序列检测结果。

修改后的设计程序
-------------------------------------------------------------------------------------------------------------------------------------
module test(clock,reset,signalin,signalout);
    input clock,signalin,reset;
    output signalout;
    reg [2:0] state;
   
    parameter
        idle = 3'd0,
        a = 3'd1,
        b = 3'd2,
        c = 3'd3,
        d = 3'd4,
        e = 3'd5;

    assign signalout = (state == e && signalin == 0)?1:0;
   
    always@(posedge clock)
        if(!reset)
            begin
                state <= idle;
            end
        else
            begin
                casex(state)
                    idle:
                        begin
                            if(signalin == 1)
                                state <= a;
                            else
                                state <= idle;
                        end
                    a:
                        begin
                            if(signalin == 0)
                                state <= b;
                            else
                                state <= a;
                        end
                    b:
                        begin
                            if(signalin == 0)
                                state <= c;
                            else
                                state <= a;
                        end
                    c:
                        begin
                            if(signalin == 1)
                                state <= d;
                            else
                                state <= idle;
                        end
                    d:
                        begin
                            if(signalin == 0)
                                state <= e;
                            else
                                state <= a;
                        end
                    e:
                        begin
                            if(signalin == 0)
                                state <= c;
                            else
                                state <= a;
                        end
                    default:
                        state <= idle;
                endcase
            end
endmodule
-------------------------------------------------------------------------------------------------------------
仿真波形如下:

发表评论 评论 (4 个评论)

回复 astory 2015-5-19 14:29
什么也看不到啊
回复 astory 2015-5-19 14:29
仿真波形在哪

facelist

您需要登录后才可以评论 登录 | 注册

关闭

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

小黑屋|手机版|Archiver|ET创芯网 ( 京ICP备:10050787号 京公网安备:110105001212 )

GMT+8, 2019-4-25 08:18 , Processed in 0.037213 second(s), 9 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

返回顶部