其中状态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输出为高电平。
文章评论(0条评论)
登录后参与讨论