巴克码相关器的verilog HDL设计

举报
李锐博恩 发表于 2021/07/15 07:57:29 2021/07/15
【摘要】 巴克码相关器   巴克码相关器原理:巴克码相关器能够检测巴克码序列峰值,并且能够在1bits错误情况下检测巴克码序列峰值。 巴克码是20世纪50年代初R.H巴克提出的一种具有特殊规律的二进制码组。它是一个非周期序列,一个n位的巴克码(x1, x3, ... xn),每个码元只可能取值 +1或 -1 。而十一位的巴克码是11’b11100010010 。 巴克码检测器...

巴克码相关器

 

巴克码相关器原理:巴克码相关器能够检测巴克码序列峰值,并且能够在1bits错误情况下检测巴克码序列峰值。

巴克码是20世纪50年代初R.H巴克提出的一种具有特殊规律的二进制码组。它是一个非周期序列,一个n位的巴克码(x1, x3, ... xn),每个码元只可能取值 +1-1 。而十一位的巴克码是11’b11100010010

巴克码检测器输入是一位序列,需要先移至移位寄存器中,再将移位寄存器中的值与标准巴克码同或,通过判断同或值是否大于阈值来确定巴克码。

巴克码检测器的结构图如下:

 

 

verilog HDL设计代码如下:

 


  
  1. 1. //2018/5/5
  2. 2. //巴克码相关器设计
  3. 3. //巴克码检测器输入是1位序列,需要先移至移位寄存器中,再将移位寄存器中的值与标准巴克码同或
  4. 4. //通过判断同或值是否大于阈值来确定巴克码。
  5. 5. module buc(clk, rst, din, valid, threshold);
  6. 6. input clk; //时钟
  7. 7. input rst; //异步复位信号
  8. 8. input din; //输入巴克码
  9. 9. input[3:0] threshold; //阈值信号
  10. 10. output valid; //当输入待检测信号满足阈值条件时,valid为1,否则为0.
  11. 11.
  12. 12. wire[10:0] data_buc;
  13. 13. wire[3:0] threshold;
  14. 14.
  15. 15. //巴克码检测器模块例化
  16. 16. buc_devider U1(.din_buc(data_buc), .threshold(threshold), .valid(valid));
  17. 17.
  18. 18. //数据接收模块例化
  19. 19. buc_recieve U2(.clk(clk), .rst(rst), .din(din), .dout_buc(data_buc));
  20. 20. endmodule
  21. 21.
  22. 22. //数据接收模块
  23. 23. module buc_recieve(clk, rst, din, dout_buc);
  24. 24. input clk;
  25. 25. input rst; //异步复位信号
  26. 26. input din; //待检测数据输入
  27. 27. output[10:0] dout_buc; //此模块输出,检测器模块的输入
  28. 28. reg[10:0] dout_buc;
  29. 29.
  30. 30. always@(posedge clk or negedge rst)
  31. 31. if(!rst) //异步复位信号有效
  32. 32. begin
  33. 33. dout_buc <= 11'b0;
  34. 34. end
  35. 35. else //每一个时钟上升沿到达时,接收一位数据到达移位寄存器
  36. 36. begin
  37. 37. dout_buc <= {dout_buc[9:0],din};
  38. 38. end
  39. 39.
  40. 40. endmodule
  41. 41.
  42. 42. //巴克码检测模块
  43. 43. module buc_devider(din_buc, threshold, valid);
  44. 44. parameter LENGTH = 11; //序列长度
  45. 45. parameter BUC = 11'b111_000_10010; //标准巴克码
  46. 46. input[10:0] din_buc; //输入的待检测序列
  47. 47. input[3:0] threshold; //阈值
  48. 48. output valid; //valid==1代表待检测序列满足检测要求
  49. 49. reg valid;
  50. 50.
  51. 51. reg[4:0] sum;
  52. 52. integer i;
  53. 53.
  54. 54. always@(din_buc) //每输入一位数据,din_buc变化一次,下面的语句也就执行一次
  55. 55. begin
  56. 56. sum = 0; //每次敏感元素变化时,sum清零
  57. 57. for(i = 0; i < LENGTH; i = i + 1)
  58. 58. if(din_buc[i]^~BUC[i] == 1) //逐位检测待检测序列,若与标准巴克码一致,则sum1,否则减1
  59. 59. sum = sum + 1;
  60. 60. else
  61. 61. sum = sum - 1; //待检测数据11位,若有1位与标准巴克码不一样,则sum等于92位不一样,则sum等于7,全部
  62. 62. end //一致,sum等于11
  63. 63.
  64. 64. always@(sum or threshold) //sumthreshold成为敏感信号
  65. 65. begin
  66. 66. if(sum[4] == 0) //sum最大为11,用4位数据即可,此刻出现的第5位意思是若sum为负
  67. 67. begin
  68. 68. if(sum[3:0] >= threshold) //sum数值大于阈值,则满足要求,valid置为1
  69. 69. valid = 1;
  70. 70. else //否则valid清零
  71. 71. valid = 0;
  72. 72.
  73. 73. end
  74. 74. else
  75. 75. valid = 0;
  76. 76.
  77. 77. end
  78. 78.
  79. 79. endmodule

 

其测试文件如下:

 


  
  1. 1. //测试文件
  2. 2. `timescale 1ns/1ns;
  3. 3. module buc_tb;
  4. 4. reg clk, rst, din;
  5. 5. reg[3:0] threshold;
  6. 6. reg[32:0] data; //输入数据2为33位数据,即3个待检测序列
  7. 7.
  8. 8. initial //时钟生成,时钟周期为20ns
  9. 9. begin
  10. 10. clk = 1'b0;
  11. 11. forever
  12. 12. #10 clk = ~clk;
  13. 13. end
  14. 14.
  15. 15. initial
  16. 16. begin
  17. 17. rst = 1'b0; //异步复位信号
  18. 18. #5 rst = 1'b1;
  19. 19. end
  20. 20.
  21. 21. initial
  22. 22. begin
  23. 23. data = 33'b11100010011_11100010001_11100010010;
  24. 24. threshold = 4'b1001; //阈值为9,分析见buc.v
  25. 25. end
  26. 26.
  27. 27. integer i;
  28. 28. always@(posedge clk or negedge rst)
  29. 29. if(!rst) //复位信号有效
  30. 30. begin
  31. 31. din = 1'b0; //输入清零
  32. 32. i = 32; //i 赋值为32
  33. 33. end
  34. 34. else
  35. 35. begin
  36. 36. if(i == 0) //i == 0的意思是数据到最后一位,输入完成。
  37. 37. begin
  38. 38. din = data[i];
  39. 39. i = 32;
  40. 40. end
  41. 41. else
  42. 42. begin
  43. 43. din = data[i]; //输入正在进行中,每个时钟上升沿到达时,移入1位数据
  44. 44. i = i - 1;
  45. 45. end
  46. 46. end
  47. 47. //巴克码相关器的例化
  48. 48. buc v1(.clk(clk), .rst(rst), .din(din), .valid(valid), .threshold(threshold));
  49. 49.
  50. 50.
  51. 51. endmodule

Modelsim中仿真得到的波形图为:

 


 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/80410951

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。