Verilog上机实验题目2 : 11位巴克码序列峰值检测器

转载自https://blog.csdn.net/Reborn_Lee/article/details/80410951
相关文章:
Verilog上机实验题目1:8位数字显示的简易频率计
Verilog上机实验题目2:11位巴克码序列峰值检测器
Verilog上机实验题目3:FIR滤波器
Verilog上机实验题目4:哈夫曼编码器

巴克码相关器

 

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

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

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

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

 

 

其verilog HDL设计代码如下:

 

  
  • 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) //逐位检测待检测序列,若与标准巴克码一致,则 sum1,否则减 1
  • 59. sum = sum + 1;
  • 60. else
  • 61. sum = sum - 1; //待检测数据 11位,若有 1位与标准巴克码不一样,则 sum等于 92位不一样,则 sum等于 7,全部
  • 62. end //一致, sum等于 11
  • 63.
  • 64. always@( sum or threshold) // sumthreshold成为敏感信号
  • 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中仿真得到的波形图为:

     


     

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值