Verilog学习笔记简单功能实现(五)...............序列检测设计
这里采用夏宇闻教授第十五章的序列检测为例来学习;


从以上的状态转换图可以写出状态机的程序:
1 module seqdet(x,out,clk,rst); 2 input x,clk,rst; 3 output out; 4 reg [2:0]state; 5 wire out; 6 parameter IDLE=3'b0, 7 A=3'd1, 8 B=3'd2, 9 C=3'd3, 10 D=3'd4, 11 E=3'd5, 12 F=3'd6, 13 G=3'd7; 14 assign out=(state==D&&x==0)?1:0; 15 always @(posedge clk or negedge rst) 16 begin 17 if(!rst) 18 state=IDLE; 19 else 20 case(state) 21 IDLE:if(x==1) state<=A; 22 else state<=IDLE; 23 A:if(x==0) state<=B; 24 else state<=A; 25 B:if(x==0) state<=C; 26 else state<=F; 27 C:if(x==1) state<=D; 28 else state<=G; 29 D:if(x==0) state<=E; 30 else state<=A; 31 E:if(x==0) state<=C; 32 else state<=A; 33 F:if(x==0) state<=B; 34 else state<=A; 35 G:if(x==1) state<=F; 36 else state<=G; 37 default: state<=IDLE; 38 endcase 39 40 end 41 endmodule
以下是测试模块:
1 `timescale 1ns/1ns
2 `define halfperiod 20
3
4 module testseqdet;
5 reg clk,rst;
6 reg [23:0]data;
7 wire out,x;
8 assign x=data[23];
9 initial begin
10 clk=0;
11 rst=1;
12 #2 rst=0;
13 #30 rst=1;
14 data=20'b1100_1001_0000_1001_0100;
15 end
16 always #(`halfperiod) clk=~clk;
17 always @(posedge clk)
18 begin
19 #2 data={data[22:0],data[23]};
20 end
21 seqdet m(.x(x),.out(out),.clk(clk),.rst(rst));
22 endmodule 其实这里也可以采用六个状态来实现功能:

1 module seqdet(x,out,clk,rst,state); 2 input x,clk,rst; 3 output out; 4 output [2:0]state; 5 reg [2:0]state; 6 wire out; 7 parameter IDLE=3'd0, 8 A=3'd1, 9 B=3'd2, 10 C=3'd3, 11 D=3'd4, 12 E=3'd5; 13 assign out=(state==D&&x==0)?1:0; 14 always @(posedge clk) 15 begin 16 if(!rst) state<=IDLE; 17 else 18 case(state) 19 IDLE:if(x==1) state<=A; 20 else state<=IDLE; 21 A:if(x==0) state<=B; 22 else state<=A; 23 B:if(x==0) state<=C; 24 else state<=A; 25 C:if(x==1) state<=D; 26 else state<=IDLE; 27 D:if(x==0) state<=E; 28 else state<=A; 29 E:if(x==0) state<=C; 30 else state<=A; 31 default: state<=IDLE; 32 endcase 33 end 34 endmodule
以下是测试模块:
1 `timescale 1ns/1ns
2 module test_seqdet;
3 reg clk,rst;
4 reg [22:0]data;
5 wire [2:0]state;
6 wire x,out;
7 assign x=data[22];
8 initial
9 begin
10 clk=0;
11 rst=1;
12 #2 rst=0;
13 #30 rst=1;
14 data=20'b1100_1001_0000_1001_0100;
15 end
16
17 always #20 clk=~clk;
18 always @(posedge clk)
19 begin
20 data={data[21:0],data[22]};
21 end
22 seqdet m(.x(x),.clk(clk),.rst(rst),.out(out),.state(state));
23 endmodule 
也可以用移位寄存器来实现:
1 module seqdet
2 (
3 input wire x,
4 input wire clk,
5 input wire rst,
6 output wire z,
7 output reg [4:0] q
8 );
9
10 wire [4:0] q_next;
11
12 assign q_next ={q[3:0],x};
13 assign z = (q_next== 5'b10010) ? 1'b1:1'b0;
14
15 always @ (posedge clk,negedge rst)
16 if(!rst)
17 q <= 5'd0;
18 else
19 q <= q_next;
20
21 endmodule 寄存器的实现参照http://www.cnblogs.com/qiweiwang/archive/2011/04/18/2019952.html ,在这里感谢齐威王!
相关推荐
Clairezz 2020-04-17
sdwylry 2020-01-04
xiaoxiaoCNDS 2019-12-21
wannagonna 2007-07-13
千锋 2019-10-31
LeoChenBlog 2016-04-19
csdnxpw 2018-12-24
zagnix 2019-06-27
hzyuhz 2017-10-24
坚持是一种品质 2018-05-10
邮件服务器配置 2011-05-23
lundongcai 2016-04-27
webhero 2015-03-30
TonPerZend 2012-10-10
suncainiao 2006-12-13
编程10000问 2019-03-27
前端外刊评论 2017-12-13