巴克码相关器
巴克码相关器原理:巴克码相关器能够检测巴克码序列峰值,并且能够在1bits错误情况下检测巴克码序列峰值。
巴克码是20世纪50年代初R.H巴克提出的一种具有特殊规律的二进制码组。它是一个非周期序列,一个n位的巴克码(x1, x3, ... xn),每个码元只可能取值 +1或 -1 。而十一位的巴克码是11’b11100010010 。
巴克码检测器输入是一位序列,需要先移至移位寄存器中,再将移位寄存器中的值与标准巴克码同或,通过判断同或值是否大于阈值来确定巴克码。
巴克码检测器的结构图如下:
其verilog HDL设计代码如下:
1. //2018/5/5 2. //巴克码相关器设计 3. //巴克码检测器输入是1位序列,需要先移至移位寄存器中,再将移位寄存器中的值与标准巴克码同或 4. //通过判断同或值是否大于阈值来确定巴克码。 5. module buc(clk, rst, din, valid, threshold); 6. input clk; //时钟 7. input rst; //异步复位信号 8. input din; //输入巴克码 9. input[3:0] threshold; //阈值信号 10. output valid; //当输入待检测信号满足阈值条件时,valid为1,否则为0. 11. 12. wire[10:0] data_buc; 13. wire[3:0] threshold; 14. 15. //巴克码检测器模块例化 16. buc_devider U1(.din_buc(data_buc), .threshold(threshold), .valid(valid)); 17. 18. //数据接收模块例化 19. buc_recieve U2(.clk(clk), .rst(rst), .din(din), .dout_buc(data_buc)); 20. endmodule 21. 22. //数据接收模块 23. module buc_recieve(clk, rst, din, dout_buc); 24. input clk; 25. input rst; //异步复位信号 26. input din; //待检测数据输入 27. output[10:0] dout_buc; //此模块输出,检测器模块的输入 28. reg[10:0] dout_buc; 29. 30. always@(posedge clk or negedge rst) 31. if(!rst) //异步复位信号有效 32. begin 33. dout_buc <= 11'b0; 34. end 35. else //每一个时钟上升沿到达时,接收一位数据到达移位寄存器 36. begin 37. dout_buc <= {dout_buc[9:0],din}; 38. end 39. 40. endmodule 41. 42. //巴克码检测模块 43. module buc_devider(din_buc, threshold, valid); 44. parameter LENGTH = 11; //序列长度 45. parameter BUC = 11'b111_000_10010; //标准巴克码 46. input[10:0] din_buc; //输入的待检测序列 47. input[3:0] threshold; //阈值 48. output valid; //valid==1代表待检测序列满足检测要求 49. reg valid; 50. 51. reg[4:0] sum; 52. integer i; 53. 54. always@(din_buc) //每输入一位数据,din_buc变化一次,下面的语句也就执行一次 55. begin 56. sum = 0; //每次敏感元素变化时,sum清零 57. for(i = 0; i < LENGTH; i = i + 1) 58. if(din_buc[i]^~BUC[i] == 1) //逐位检测待检测序列,若与标准巴克码一致,则sum加1,否则减1 59. sum = sum + 1; 60. else 61. sum = sum - 1; //待检测数据11位,若有1位与标准巴克码不一样,则sum等于9,2位不一样,则sum等于7,全部 62. end //一致,sum等于11 63. 64. always@(sum or threshold) //sum和threshold成为敏感信号 65. begin 66. if(sum[4] == 0) //sum最大为11,用4位数据即可,此刻出现的第5位意思是若sum为负 67. begin 68. if(sum[3:0] >= threshold) //sum数值大于阈值,则满足要求,valid置为1 69. valid = 1; 70. else //否则valid清零 71. valid = 0; 72. 73. end 74. else 75. valid = 0; 76. 77. end 78. 79. endmodule
其测试文件如下:
1. //测试文件 2. `timescale 1ns/1ns; 3. module buc_tb; 4. reg clk, rst, din; 5. reg[3:0] threshold; 6. reg[32:0] data; //输入数据2为33位数据,即3个待检测序列 7. 8. initial //时钟生成,时钟周期为20ns 9. begin 10. clk = 1'b0; 11. forever 12. #10 clk = ~clk; 13. end 14. 15. initial 16. begin 17. rst = 1'b0; //异步复位信号 18. #5 rst = 1'b1; 19. end 20. 21. initial 22. begin 23. data = 33'b11100010011_11100010001_11100010010; 24. threshold = 4'b1001; //阈值为9,分析见buc.v 25. end 26. 27. integer i; 28. always@(posedge clk or negedge rst) 29. if(!rst) //复位信号有效 30. begin 31. din = 1'b0; //输入清零 32. i = 32; //i 赋值为32 33. end 34. else 35. begin 36. if(i == 0) //i == 0的意思是数据到最后一位,输入完成。 37. begin 38. din = data[i]; 39. i = 32; 40. end 41. else 42. begin 43. din = data[i]; //输入正在进行中,每个时钟上升沿到达时,移入1位数据 44. i = i - 1; 45. end 46. end 47. //巴克码相关器的例化 48. buc v1(.clk(clk), .rst(rst), .din(din), .valid(valid), .threshold(threshold)); 49. 50. 51. endmodule
在Modelsim中仿真得到的波形图为: