终于迈向了testbench的学习,第一个就拿简单的练练手,没想这都遇到了好几个问题,在一番折腾下,终于把问题调试完毕,趁热乎过来写下本人的第一篇博客。。序列信号检测器对串行输出进行检测,如果检测到连续的1001,则输出1,否则输出0。
程序采用两段式状态机写法。两段式状态机即:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移,另外一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出。状态机编码方式采用独热码方式,《Verilog数字系统设计与FPGA应用》【赵倩、林丽萍】一书中说:“CPLD器件更多地提供组合逻辑资源,而FPGA器件更多的提供触发器资源,所以对于CPLD的数字系统设计多使用格雷码编码,而基于FPGA的数字系统设计多使用独热码编码。”代码如下:
Detected_1001.v
1 module Detected_1001(Data_in,Clock,Reset,Detected); 2 3 input Data_in,Clock,Reset; 4 output Detected; 5 reg Detected; 6 reg [4:0]state; 7 parameter s0=5'b10000, 8 s1=5'b01000, 9 s2=5'b00100, 10 s3=5'b00010, 11 s4=5'b00001; 12 always@(state) 13 begin 14 case(state) 15 s0: 16 Detected=1'b0; 17 s1: 18 Detected=1'b0; 19 s2: 20 Detected=1'b0; 21 s3: 22 Detected=1'b0; 23 s4: 24 Detected=1'b1; 25 26 default:Detected=1'b0; 27 endcase 28 end 29 /*assign Detected=(state==s4)?1:0;*/ 30 always@(posedge Clock or negedge Reset) 31 begin 32 if(!Reset) 33 begin 34 state<=s0; 35 end 36 else 37 case(state) 38 s0:if(Data_in==1'b0)state<=s0; 39 else state<=s1; 40 41 s1:if(Data_in==1'b0)state<=s2; 42 else state<=s0; 43 44 s2:if(Data_in==1'b0)state<=s3; 45 else state<=s0; 46 47 s3:if(Data_in==1'b0)state<=s0; 48 else state<=s4; 49 50 s4:if(Data_in==1'b0)state<=s0; 51 else state<=s1; 52 53 default:state<=s0; 54 endcase 55 end 56 endmodule