原创 序列检测器

2011-5-21 06:50 3019 7 7 分类: FPGA/CPLD
序列检测器是时序数字电路中非常常见的设计之一。它的主要功能是:将一个指定的序列从数字码流中识别出来。接下来就以设计“01101”这个序列的检测器为例,说明Verilog HDL语言的具体应用。设X为数字码流输入,Z为检出标记输出,高电平表示“发现指定序列”,低电平表示“没有发现指定的序列”。设输入的码流为“001101101111011111...”,在时钟2~6中,码流X里出现指定序列“01101”,对应输出Z在第6个时钟变为高电平“1”,表示发现指定"01101”,Z输出“1”。同理在第9个时钟对应输出Z也为“1”。根据这个逻辑功能描述,我们可以分析得出状态转换图。


    其中状态A~E表示5位序列“01101”按顺序正确地出现在码流中。因为输入码流X是随机的,因此可能会有很多重叠的情况发生。这样在转换图中相应的还要有状态F和G。设初始状态为IDLE,则有相应的Verilog HDL语言程序如下。


//file name:seridetec.v

//function: 序列检测器,检测序列为:"01101"

//利用状态机实现.

module seridetec(x,z,clk,rst);

input x,clk,rst;

output z;

reg[8:0] state;

wire z;

parameter   IDLE=8'd1,

            A=8'd2,

            B=8'd4,

            C=8'd8,

            D=8'd16,

            E=8'd32,

            F=8'd64,

            G=8'd128;

           

assign z=(state==D && x==1)?1:0;

 

always@(posedge clk or negedge rst)

if(!rst)

begin

    state<=IDLE;

end

else

    casex(state)

    IDLE:if(x==0)

            state<=A;

        else state<=IDLE;

    A:if(x==1)

            state<=B;

        else state<=A;

    B:if(x==1)

            state<=C;

        else state<=F;

    C:if(x==0)

            state<=D;

        else state<=G;

    D:if(x==1)

            state<=E;

        else state<=A;

    E:if(x==1)

            state<=C;

        else state<=A;

    F:if(x==0)

            state<=A;

        else state<=B;

    G:if(x==0)

            state<=F;

        else state<=G;

default: state<=IDLE;

endcase

endmodule
由上述这个程序可以看出:Verilog HDL程序是由模块构成的。每个模块的内容都是嵌在module和endmodule两个语句之间实现特定的功能的。每个模块都由两部分组成,一部分描述接口;另一部分描述逻辑功能,即定义输入是如何影响输出的。如程序中的sequdet(x,z,clk,rst)就是模块的端口,声明了模块的输入、输出口。接下来就是模块中最重要的部分逻辑功能的定义。“assign”声明语句。这种方法很简单,只需写一个“assign”,后面再加一个方程式即可。这也是最常用的方法之一。如程序中的assign z==(state==D && x==1)?1:0;就表示状态为D时又收到了1,表明收到“01101”应使Z输出为高电平。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条