追风者

序列检测器

0
阅读(2198)
序列检测器是时序数字电路中非常常见的设计之一。它的主要功能是:将一个指定的序列从数字码流中识别出来。接下来就以设计“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输出为高电平。

Baidu
map