• Verilog 代码题练手(1)




    引言

    本专栏主要针对往年IC笔试的真题进行编程练习。题解思路不唯一,希望可以交流。我的代码只是能说是按照我对题目的理解进行编写。有出入的地方可以留言交流。

    每道题目会给出设计代码、TESTBENCH、仿真结果。

    每篇博客 题目数为 1 ,不止是代码,也有思路分析。

    本专栏有时间就会继续更新,欢迎订阅关注~


    序列检测

    (乐鑫某年笔试题目)模块持续每拍并行输入2bit数,请实现对(1011001)的序列检测功能,输入数据的顺序为高位2bit先输入,当检测到该序列时,输出一拍高电平脉冲信号。请用Verilog完整描述该模块。

    思路:

    这里简单说明我的思路:

    此题输入为双比特输入,同时给进两位数,但是待检测的序列长度为7(奇数);所以常规的单比特输入序列检测不再适用。下面给出一种移位寄存器的解决方法:

    1、复位信号拉低,模块复位,寄存器、计数器清零;

    2、复位撤离,输入有效信号拉高,开始左移寄存,并计数;

    3、计数器计数到4后,若有效信号不拉低则一直保持4,否则清零;

    4、计数器计数到4后,判断移位寄存器内的高7位,或者低7位和目标序列比对,如果匹配则表明检测到目标序列;

    下面对 4 中的表述进行解释:

     高7位匹配:如蓝色序列形式,即序列匹配的第一个bit在输入信号中的高位;

     低7位匹配:如红色序列形式,即序列匹配的第一个bit在输入信号中的低位;

    设计文件:

    1. `timescale 1ns / 1ps
    2. // 序列检测:
    3. // 说明:
    4. // -1- 模块持续每拍并行输入2bit数;
    5. // -2- 请实现对(1011001)的序列检测功能,输入数据的顺序为高位2bit先输入;
    6. // -3- 当检测到该序列时,输出一拍高电平脉冲信号。
    7. // By:在路上,正出发
    8. module Sque_Detect(
    9. input I_CLK,
    10. input I_RSTN,
    11. input [1:0] I_SEQUE,
    12. input I_VAL,
    13. output O_DETECT
    14. );
    15. reg [7:0] R_SEQUE_8;
    16. reg [2:0] R_COUNT_4;
    17. always @ (posedge I_CLK)
    18. begin
    19. if(~I_RSTN)
    20. begin
    21. R_SEQUE_8 <= 8'd0;
    22. R_COUNT_4 <= 3'd0;
    23. end
    24. else
    25. begin
    26. if(I_VAL)
    27. begin
    28. R_SEQUE_8 <= {R_SEQUE_8[11:0],I_SEQUE};
    29. if(R_COUNT_4 == 3'd4)
    30. begin
    31. R_COUNT_4 <= 3'd4;
    32. end
    33. else
    34. begin
    35. R_COUNT_4 <= R_COUNT_4 + 1;
    36. end
    37. end
    38. else // 数据输入无效 此时认为不需要进行序列检测
    39. begin // 将寄存器 计数器清零 为下一次检测做准备
    40. R_SEQUE_8 <= 8'd0;
    41. R_COUNT_4 <= 3'd0;
    42. end
    43. end
    44. end
    45. reg R_DETECT;
    46. always @ (posedge I_CLK)
    47. begin
    48. if(~I_RSTN)
    49. begin
    50. R_DETECT <= 0;
    51. end
    52. else
    53. begin
    54. case(R_COUNT_4)
    55. 4:
    56. begin
    57. if((R_SEQUE_8[7:1] == 7'b1011001) || (R_SEQUE_8[6:0] == 7'b1011001))
    58. begin
    59. R_DETECT <= 1'b1;
    60. end
    61. else
    62. begin
    63. R_DETECT <= 1'b0;
    64. end
    65. end
    66. default:
    67. begin
    68. R_DETECT <= 1'b0;
    69. end
    70. endcase
    71. end
    72. end
    73. assign O_DETECT = R_DETECT;
    74. endmodule

    TEST_BENCH:

    1. `timescale 1ns / 1ps
    2. // By:在路上,正出发
    3. module TB_SEQUE_DETECT();
    4. reg I_CLK;
    5. reg I_RSTN;
    6. reg [1:0] I_SEQUE;
    7. reg I_VAL;
    8. wire O_DETECT;
    9. // 时钟
    10. initial I_CLK = 1'b0;
    11. always # 10 I_CLK = ~I_CLK;
    12. initial
    13. begin
    14. I_RSTN = 0;
    15. I_VAL = 0;
    16. I_SEQUE = 2'b00;
    17. #100;
    18. I_RSTN = 1'b1;
    19. #80;
    20. repeat(100)
    21. begin
    22. @(posedge I_CLK);
    23. I_VAL = 1'b1;
    24. I_SEQUE = 2'b11;
    25. #20;
    26. I_VAL = 1'b1;
    27. I_SEQUE = 2'b10;
    28. #20;
    29. I_VAL = 1'b1;
    30. I_SEQUE = 2'b11;
    31. #20;
    32. I_VAL = 1'b1;
    33. I_SEQUE = 2'b00;
    34. #20;
    35. I_VAL = 1'b1;
    36. I_SEQUE = 2'b11;
    37. #20;
    38. I_VAL = 1'b1;
    39. I_SEQUE = 2'b01;
    40. #20;
    41. I_VAL = 1'b1;
    42. I_SEQUE = 2'b10;
    43. #20;
    44. I_VAL = 1'b1;
    45. I_SEQUE = 2'b01;
    46. #20;
    47. I_VAL = 1'b1;
    48. I_SEQUE = 2'b10;
    49. #20;
    50. I_VAL = 1'b1;
    51. I_SEQUE = 2'b11;
    52. #20;
    53. I_VAL = 1'b1;
    54. I_SEQUE = 2'b00;
    55. #20;
    56. I_VAL = 1'b1;
    57. I_SEQUE = 2'b10;
    58. end
    59. #100;
    60. I_VAL = 0;
    61. I_SEQUE = 2'b11;
    62. #(20*1000);
    63. repeat(100)
    64. begin
    65. @(posedge I_CLK);
    66. I_VAL = 1'b1;
    67. I_SEQUE = 2'b11;
    68. #20;
    69. I_VAL = 1'b1;
    70. I_SEQUE = 2'b10;
    71. #20;
    72. I_VAL = 1'b1;
    73. I_SEQUE = 2'b11;
    74. #20;
    75. I_VAL = 1'b1;
    76. I_SEQUE = 2'b00;
    77. #20;
    78. I_VAL = 1'b1;
    79. I_SEQUE = 2'b11;
    80. #20;
    81. I_VAL = 1'b1;
    82. I_SEQUE = 2'b01;
    83. #20;
    84. I_VAL = 1'b1;
    85. I_SEQUE = 2'b10;
    86. #20;
    87. I_VAL = 1'b1;
    88. I_SEQUE = 2'b01;
    89. #20;
    90. I_VAL = 1'b1;
    91. I_SEQUE = 2'b10;
    92. #20;
    93. I_VAL = 1'b1;
    94. I_SEQUE = 2'b11;
    95. #20;
    96. I_VAL = 1'b1;
    97. I_SEQUE = 2'b00;
    98. #20;
    99. I_VAL = 1'b1;
    100. I_SEQUE = 2'b10;
    101. end
    102. end
    103. Sque_Detect inst_Sque_Detect
    104. (
    105. .I_CLK (I_CLK),
    106. .I_RSTN (I_RSTN),
    107. .I_SEQUE (I_SEQUE),
    108. .I_VAL (I_VAL),
    109. .O_DETECT (O_DETECT)
    110. );
    111. endmodule

    仿真结果:

     细节:




     

  • 相关阅读:
    语义分割算法及在无人驾驶的应用
    获取windows硬件、软件信息的方法
    C#线程入门
    3.4背景图片位置
    torch.mv
    Java0基础入门,看完这篇就够了
    在阿里云 linux 服务器上查看当前服务器的Nginx配置信息
    KD02策略丨涨跌幅统计+短线离场构建交易模型
    第11章 数据库的设计规范【2.索引及调优篇】【MySQL高级】
    代码随想录算法训练营第五十九天| 503.下一个更大元素II,42. 接雨水
  • 原文地址:https://blog.csdn.net/qq_43045275/article/details/126675519