序列状态机的转换

xiaoxiao 6月前 47

 
     
西南科技大学 实验报告 
 
       
课程名称:        FPGA                          
实验名称:      用状态机实现序列检测器的设计               姓    名:                      
学    号:                               班    级:         电子12                     指导教师:                               
 
  
       西南科技大学信息工程学院制
 
 
实验题目 
一、 实验原理 
序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出A,否则输出b。由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。在检测过程中,任何一位不相等都将回到初始状态重新开始检测。 
二、 实验步骤   并行 6bits数据  串行数据 串行检测模块 并转串 模块 顶层模块  4bits数据 数码管显示模块  7bits数据 clk   reset 
1)并行数据转串行数据模块(xulie.v) 
 输入端口: 
clk-----系统时钟,由按键K2通过消抖模块后提供 din6-----6bits输入数据,需在时钟控制下,串行输出 
reset----系统复位信号,当reset=1’b1时,系统输出复位,否则系统正常工作 输出端口: 
din----------1bit输出信号 2)串行检测模块(schk.v) 输入信号: 
DIN-----1bit的串行输入数据 CLK-----同步输入时钟 
CLR ------异步清零信号,当CLR=1,系统输出置0,否则,系统正常工作 输出信号: 
AB--------4bits数据,如果系统检测到6’b100101的串行输入,AB=4’b1010,否则,AB=4’b1011. 
根据设计要求,画出串行检测模块(schk.v)的状态转移图,并自行设计HDL源代码。 3)数码管显示模块(decled7s .v)  
用Verilog HDL设计数码管驱动电路、系统顶层电路。 
注意顶层系统中,应加入消抖模块,对K2输入的时钟clk进行消抖处理。 
 

 
4)消抖模块  :由于需要用按键K2作为时钟输入,为保证实验效果,调用实验二中应用的消抖模块,对时钟clk输入信号进行消抖。 
并行数据转串行数据模块(xulie.v),串行检测模块(schk.v)均采用有限状态机的描述方式。 
三、 实验结果及分析 
序列检测代码: 
我是先画出了状态图再进行程序的编写。 module testchange(din,clk,reset,AB); input din; input clk; input reset; output[3:0] AB ; 
parameter //一共有7种状态,因为我要检测的是20=010100分别是0,1,01,010,0101,01010,010100.    s0 = 3'b000;    s1 = 3'b001;    s2 = 3'b010;    s3 = 3'b011;    s4 = 3'b100;    s5 = 3'b101;  
s6 = 3'b110; 
reg[2:0] cur_state,nex_tstate=0; reg[3:0] AB; 
always@(posedge clk)  begin   if(reset)   cur_state<=s0;  else 
  cur_state<=nex_tstate;   end 
always@( cur_state or din )   begin 
   case(cur_state)    s0:     begin      if(din)      begin 
 

     
 
     // cur_state<=nex_tstate;       nex_tstate<=s0;   AB<=4'b1011;   end   else 
  begin 
  //cur_state<=nex_tstate;   nex_tstate<=s1;   AB<=4'b1011;   end 
    end  
s1: 
    begin      if(din)      begin 
      //cur_state<=nex_tstate;       nex_tstate<=s2;   AB<=4'b1011;   end  else 
  begin 
  //cur_state<=nex_tstate;   nex_tstate<=s1;   AB<=4'b1011;   
end 
    end 
 
 s2:     begin      if(din)      begin 
      //cur_state<=nex_tstate;       nex_tstate<=s0;   AB<=4'b1011;   end  else 
  begin 
 
 
//cur_state<=nex_tstate; 
 

 
  nex_tstate<=s3;   AB<=4'b1011;   
end 
    end 
 
 s3:     begin      if(din)      begin 
      //cur_state<=nex_tstate;       nex_tstate<=s4;   AB<=4'b1011;   end  else 
  begin 
  //cur_state<=nex_tstate;   nex_tstate<=s1;   AB<=4'b1011;   
end 
    end 
 
 s4:     begin      if(din)      begin 
      //cur_state<=nex_tstate;       nex_tstate<=s0;   AB<=4'b1011;   end  else 
  begin 
  //cur_state<=nex_tstate;   nex_tstate<=s5;   AB<=4'b1011;   
end 
    end 
 
 s5:     begin      if(din) 
 


123
 
     begin 
      //cur_state<=nex_tstate;       nex_tstate<=s4;          
       
AB<=4'b1011; end begin 
//cur_state<=nex_tstate; nex_tstate<=s6; 
AB<=4'b1011;//虽然进入了s6状态的判别,但是还是在s5状态输出 end 
 else 
    end 
 s6:     begin      if(din)      begin 
      //cur_state<=nex_tstate;       nex_tstate<=s2;            
        
AB<=4'b1011; end begin 
 
 else 
//cur_state<=nex_tstate; nex_tstate<=s1; 
AB<=4'b1010;//这个才是真正的s6,刚开始搞错了在前面s5的时候就输出了0101,//AB<=4'b1011; end 
导致之判断了5个输入就检测到了 
    end 
 default AB<=4'b0000; endcase 
 end endmodule 
  
 

 
 
Testbench_testchange的激励文件如下: initial begin   // Initialize Inputs   din = 1'b1;   clk = 0;   reset = 0;   reset=1;   #100;   reset=0; 
  // Wait 100 ns for global reset to finish   #100; 
       
  // Add stimulus here   din=0;   #20;   din=0;   #20;   din=1;   #20;   din=0;   #20;   din=1;   #20;   din=1;   #20;   din=0;   #20;   din=1;   #20;   din=0;   #20;   din=1;   #20;   din=0;  
 
#20; 
 

 
    
   end 
din=0; #20 din=1; 
   always  #10 clk="clk; 
输入din是001011的时候输出AB是1011 
 
从320ns开始输入的是010100,十进制数20号,所以输出就是AB=4’b1010 顶层模块的例化代码 
module topp(clk_50,clk,reset,din6,LED7S); //module  XULIEQI(clk,reset,din6,LED7S); input clk,clk_50; input reset; input [5:0] din6; output [6:0] LED7S;  
wire [3:0] AB; 
debounce_module u0( .CLK(clk_50), .RSTn(reset), .Pin_In(clk), .Pin_Out(Pin_Out)); change u1 (.clk(clk_50), .din6(din6), .reset(reset), .din(din)); //change(clk, din6, reset, din); 
testchange u2 (.din(din),.clk(clk_50),.reset(reset),.AB(AB));  
decled7s u3 (.AB(AB),.LED7S(LED7S)); //decled7s(AB,LED7S    ); endmodule 
实验刚开始的时候结果是正确的,但是把50M时钟作为了时钟输入,后来改了一下,仿真结果就有问题。  
 
四、 实验思考题解答(实验指导书要求的思考题) 
 

 
说明本设计的代码表达的是什么类型的状态机,它的优点是什么?详述其功能和对序列数检测的逻辑过程 
是mealy型的状态机,与输入和当前状态有关。功能是检测特定的串行数据,当前如果是0,1,01,01,010,0101,01010,010100,分别对应不同的状态,s0"S5.当每一种信号输入时当前状态的跳变情况不同。 
优点是:具有良好的同步时序,减少了竞争冒险现象。 
五、 体会 
本次试验使我重新复习数字电路的知识,为了学习了解状态机,我复习了移位寄存器以及状态图的画法,使我在上实验课的时候很快画出了,遗憾是程序下载到板子上没有输出,其中我的程序逻辑也有一点问题,经过下课后的深入思考和请教了研究生师兄,最终发现并解决了问题。        
 9 

123
最新回复 (0)
返回
免责申明:本站点所有资源来自互联网网友发布,如侵犯您的合法权益,请联系zzjfuture@gmail.com,我们立刻处理。 @2010-2020 技术支持: 软件开发