终于迈向了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
View Code

相关文章:

  • 2021-10-03
  • 2022-12-23
  • 2022-12-23
  • 2021-11-20
  • 2022-12-23
  • 2021-06-21
  • 2021-11-19
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-29
  • 2021-11-17
  • 2021-07-23
  • 2022-12-23
相关资源
相似解决方案