当前位置:   article > 正文

摩尔状态机序列检测器检测1101序列(Basys3开发板)_1101序列检测器

1101序列检测器

 实验内容

1、设计“1101”序列检测的状态转换图。
2、并转串模块设计,利用移位寄存器原理,setd 端上升沿将 8 位输入数据
同时锁存到移位寄存器中,在后续的 8 个时钟周期内将 8 位数据逐次移位
输出。
3、调用并转串输出模块,使用 Verilog HDL 语言的行为描述方式实现一个
摩尔状态机,能检测一个 8 位的二进制数据中是否存在“1101”序列,如
果检测到该序列则指定的 LED 灯亮。
4、综合、实现、生成 bit 流,下载到开发板进行验证

原理图

 

模块划分

按钮防抖模块

  1. module fangdou#(parameter width=8,T100hz=249999)
  2. (input clk,
  3. input reset,
  4. input setd,
  5. input key,
  6. input[(width-1):0]data_in,
  7. output dout
  8. );
  9. integer cnt_100hz;
  10. reg clk_100hz;
  11. wire debkey;
  12. wire temp_out;
  13. always @(posedge clk or posedge reset)//对板子上面的时钟分频用于按键防抖
  14. if(reset)
  15. cnt_100hz<=32'b0;
  16. else
  17. begin
  18. cnt_100hz<=cnt_100hz+1'b1;
  19. if(cnt_100hz==T100hz)
  20. begin
  21. cnt_100hz<=32'b0;
  22. clk_100hz<=~clk_100hz;
  23. end
  24. end
  25. reg key_rrr,key_rr,key_r;
  26. always@(posedge clk_100hz or posedge reset)
  27. if(reset)
  28. begin
  29. key_rrr<=1'b1;
  30. key_rr<=1'b1;
  31. key_r<=1'b1;
  32. end
  33. else
  34. begin
  35. key_rrr<=key_rr;// key_rrr等于前两个时钟上升沿的 key
  36. key_rr<=key_r;// key_rr等于前一个时钟上升沿的 key
  37. key_r<=key;//key_r等于当前时钟上升沿的key,当按键抖动时
  38. end
  39. assign debkey=key_rrr & key_rr & key_r;//当且仅当key_rrr,key_rr,key_r都等于1的时候debkey才等与一
  40. //按键发生抖动难以满足三者同时为1的条件,所以可以有效进行防抖
  41. bing_to_chuan #(width) btc(.btn_clk(debkey),.reset(reset),.en(setd),.data_in(data_in),.dout(temp_out));
  42. /*调用bing_to_chuan模块,将输入的数据进行锁存。debkey为按动按键手动产生的时钟,每按一次按键产生一次上升沿。
  43. 每次按下按钮,bing_to_chuan模块就会截取一位锁存的数据传入zhuangtaiji模块,即完成对并行输入的数据,进行串行
  44. 检测的要求,按下按钮8次后才会将当前锁存的数据全部检测完*/
  45. zhuangtaiji ztj( .clk(debkey),.reset(reset),.din(temp_out),.dout(dout));
  46. //根据串行传入的数据进行检测1101序列的模块
  47. endmodule

 

锁存数据、并转串模块

  1. module bing_to_chuan#(parameter width=8)
  2. (input btn_clk,input reset,input en, input[(width-1):0]data_in, output reg dout);
  3. reg [(width-1):0] temp_d;
  4. always@(posedge en or posedge btn_clk or posedge reset)
  5. begin
  6. if(en)//en有效时传入数据,将数据锁存在temp_d中
  7. temp_d=data_in;
  8. else if(reset)//重置信号
  9. dout=1'b0;
  10. else
  11. begin
  12. dout=temp_d[0];
  13. temp_d={1'b0,temp_d[(width-1):1]};
  14. /*对信号进行移位,每当btn_clk到达上升沿,也即按下按钮,
  15. 取出temp_d的一位数据传入状态转换模块*/
  16. end
  17. end
  18. endmodule

 

状态转移判断序列模块

  1. module zhuangtaiji(
  2. input clk, input reset, input din, output reg dout);
  3. parameter s0=3'b000;
  4. parameter s1=3'b001;
  5. parameter s2=3'b010;
  6. parameter s3=3'b011;
  7. parameter s4=3'b100;//状态声明
  8. reg [2:0] current_state,next_state;//现态与次态
  9. always@(posedge clk or posedge reset)
  10. begin
  11. if(reset)//重置
  12. begin
  13. current_state<=s0;
  14. end
  15. else
  16. current_state<=next_state;
  17. end
  18. always@(current_state or din or reset)//状态转换判断
  19. begin
  20. if(reset)//重置
  21. next_state=s0;
  22. else
  23. begin
  24. case(current_state)
  25. //对现态以及传入的数据进行判断后,确定次态
  26. //具体转换逻辑详见原理图
  27. s0:
  28. if(din==1'b1) next_state=s1; else next_state =s0;
  29. s1:
  30. if(din==1'b1) next_state=s2; else next_state =s0;
  31. s2:
  32. if(din==1'b0) next_state=s3; else next_state=s2;
  33. s3:
  34. if(din==1'b1) next_state=s4; else next_state=s0;
  35. s4:
  36. if(din==1'b1) next_state=s1; else next_state=s0;
  37. default: next_state=s0;
  38. endcase
  39. end
  40. end
  41. always@(reset or next_state)//判断输出
  42. begin
  43. if(reset)//重置
  44. dout=0;
  45. else
  46. begin
  47. if(next_state == s4)dout=1;
  48. //次态等于状态s4时,即检测到1101序列,输出信号赋值1
  49. else
  50. dout=0;
  51. //次态不等于状态s4说明未检测到序列1101,输出信号赋值0
  52. end
  53. end
  54. endmodule

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/676640
推荐阅读
相关标签
  

闽ICP备14008679号