这里的日志均为读书时转载的,再次澄清说明~~~

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

上一篇 / 下一篇  2009-03-30 19:42:14 / 个人分类: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
-------------------------------------------------------------------------------------------------------------
仿真波形如下:


TAG:

引用 删除 astory   /   2015-05-19 14:29:40
仿真波形在哪
引用 删除 astory   /   2015-05-19 14:29:13
3
引用 删除 astory   /   2015-05-19 14:29:09
什么也看不到啊
引用 删除 云梦闲人   /   2015-03-18 17:54:35
1
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar