首页 > 其他分享 >Verilog实现序列产生器(状态转移形,移位形,计数形)

Verilog实现序列产生器(状态转移形,移位形,计数形)

时间:2023-02-03 15:23:32浏览次数:53  
标签:count end seq clk state Verilog rst 移位 产生器

Verilog实现序列产生器是Verilog基础学习甚至求职面试时的一个常见问题,它用到计数器、状态机、移位寄存器等一系列知识。因此有必要进行学习与仿真:

一、思路

    状态转移形(利用状态机转移,逐个输出序列值);
    移位寄存器形(输入整个序列,在时钟驱动下不断按顺序循环输出序列中的某一位,从而实现序列的循环输出);
    计数形(计数与组合逻辑相结合,通过卡诺图化简得到计数值与输出的关系);

仿真:简单起见,假定实现1011序列

二、状态转移形式

采用思路一,设计状态机,实现几个状态循环转移的过程,每一个状态输出对应序列值,实现序列输出;

状态设置:

设置为四个状态,s0=2'b0、s1=2'b1、s2=2'b10、s3=2'b11(常见编码方式有二进制编码、格雷码、独热码,此处选为二进制码)

状态机设置:

三段式描述方式(时序逻辑描述状态转移、组合逻辑描述状态转移条件、时序逻辑描述输出)

Verilog代码如下:

  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer: guoliang CLL
  5. //
  6. // Create Date: 2020/02/21 00:20:42
  7. // Design Name:
  8. // Module Name: seq_gen_fsm
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module seq_gen_fsm(
  22. input clk,
  23. input rst_n,
  24. output reg seq
  25. );
  26. // state declaration
  27. parameter s0 = 2'b0,s1 = 2'b1,s2 = 2'b10,s3 = 2'b11;
  28. reg [1:0]c_state,n_state;
  29. // 状态转移
  30. always@(posedge clk or negedge rst_n)
  31. begin
  32. if(!rst_n)
  33. begin
  34. c_state <= s0;
  35. end
  36. else
  37. begin
  38. c_state <= n_state;
  39. end
  40. end
  41. // 状态转移条件
  42. always@(c_state or rst_n)
  43. begin
  44. if(!rst_n)
  45. begin
  46. n_state = s0;
  47. end
  48. else
  49. begin
  50. case(c_state)
  51. s0:n_state = s1;
  52. s1:n_state = s2;
  53. s2:n_state = s3;
  54. s3:n_state = s0;
  55. default:n_state = s0;
  56. endcase
  57. end
  58. end
  59. // 输出
  60. always@(posedge clk or negedge rst_n)
  61. begin
  62. if(!rst_n)
  63. begin
  64. seq <= 1'b0;
  65. end
  66. else
  67. begin
  68. case(n_state)
  69. s0:seq <= 1'b1;
  70. s1:seq <= 1'b0;
  71. s2:seq <= 1'b1;
  72. s3:seq <= 1'b1;
  73. default:seq <= 1'b0;
  74. endcase
  75. end
  76. end
  77. endmodule

测试代码如下:

  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. // Create Date: 2020/02/21 00:35:17
  6. // Design Name:
  7. // Module Name: seq_gen_tsb
  8. // Project Name:
  9. // Target Devices:
  10. // Tool Versions:
  11. // Description:
  12. // Dependencies:
  13. // Revision:
  14. // Revision 0.01 - File Created
  15. // Additional Comments:
  16. module seq_gen_tsb(
  17. );
  18. // port
  19. reg clk;
  20. reg rst_n;
  21. wire seq;
  22. // clk
  23. initial
  24. begin
  25. clk = 1'b1;
  26. forever #10 clk = ~clk;
  27. end
  28. initial
  29. begin
  30. rst_n = 1'b1;
  31. #20 rst_n = 1'b0;
  32. #50 rst_n = 1'b1;
  33. end
  34. // instantation
  35. seq_gen_fsm inst(
  36. .clk(clk),
  37. .rst_n(rst_n),
  38. .seq(seq)
  39. );
  40. endmodule

输出波形如下:

RTL电路如下:

三、循环移位形式:

利用循环移位寄存器,每个时钟移位一次,也可以很简单的实现序列产生

实现代码如下:

  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2020/02/21 00:58:25
  7. // Design Name:
  8. // Module Name: seq_gen_shift
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module seq_gen_shift(
  22. input clk,
  23. input rst_n,
  24. output seq
  25. );
  26. // sequence declaration
  27. reg [3:0]SEQ = 4'b1011;
  28. //
  29. always@(posedge clk or negedge rst_n)
  30. begin
  31. if(!rst_n)
  32. SEQ <= 4'b1011;
  33. else
  34. SEQ <= {SEQ[2:0],SEQ[3]};
  35. end
  36. assign seq = SEQ[3];
  37. endmodule

测试文件不变

输出如下:

RTL电路如下:

四、计数器译码形式

设计4值的循环计数器,在此基础上对计数进行译码(可以case选择,也可以与或非描述),不同计数值时输出不同序列值,即可实现序列产生;

实现代码如下:

  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2020/02/21 01:19:15
  7. // Design Name:
  8. // Module Name: seq_gen_count
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module seq_gen_count(
  22. input clk,
  23. input rst_n,
  24. output seq
  25. );
  26. reg [1:0]count;
  27. always@(posedge clk or negedge rst_n)
  28. begin
  29. if(!rst_n)
  30. count <= 2'b0;
  31. else if(count == 2'b11)
  32. count <= 2'b0;
  33. else
  34. count <= count+2'b1;
  35. end
  36. // out
  37. assign seq = (count[1]&count[0]) | (!count[1]&!count[0]) | (count[1]&!count[0]);
  38. endmodule

测试代码不变

输出如下:

RTL电路如下:

五、参考文献:

有重叠与无重叠序列之序列检测与序列产生

序列信号产生器的verilog HDL 设计

标签:count,end,seq,clk,state,Verilog,rst,移位,产生器
From: https://www.cnblogs.com/amxiang/p/17089386.html

相关文章

  • AXI4_LITE总线vivado2019.1源码(verilog实现)
    1.AXI_SLAVE源码`timescale1ns/1ps modulemyip_v1_0_S00_AXI# ( //Userstoaddparametershere //Userparametersends //Donotmodifythepa......
  • verilog语法
    标识符与关键字标识符(identifier)可以是任意一组字母、数字、$ 符号和 _(下划线)符号的合,但标识符的第一个字符必须是字母或者下划线,不能以数字或者美元符开始。另外,标......
  • verilog 概念版
    一、MCU芯片的定义MCU芯片是指微控制单元(MicrocontrollerUnit;MCU),又称单片微型计算机或者单片机,是把中央处理器的频率与规格做适当缩减,并将内存、计数器、USB、A/D转换、......
  • Verilog HDL门级建模
    ⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合VerilogHDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。......
  • Verilog HDL数据流建模与运算符
    ⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合VerilogHDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。......
  • 【51单片机】【STC89C52(A2版)】3-4独立按键控制LED移位
    #include<STC89C5xRC.H>voidDelay(unsignedintxms);unsignedcharLEDNum;voidmain(){ P2=~0X01; while(1) { if(P31==0) {  Delay(20);  while(P3......
  • Verilog HDL基本语法规则
    ⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合VerilogHDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。......
  • Xmake v2.7.6 发布,新增 Verilog 和 C++ Modules 分发支持
    Xmake是一个基于Lua的轻量级跨平台构建工具。它非常的轻量,没有任何依赖,因为它内置了Lua运行时。它使用xmake.lua维护项目构建,相比makefile/CMakeLists.txt,配置语......
  • 力扣---848. 字母移位
    有一个由小写字母组成的字符串s,和一个长度相同的整数数组shifts。我们将字母表中的下一个字母称为原字母的移位shift()(由于字母表是环绕的,'z'将会变成'a')。   ......
  • 【FPGA】Verilog 编码实现:与非门 | 或非门 | 异或门 | NAND/NOR/XOR 行为验证
    写在前面:本章主要内容为了解和确认NAND/NOR/XOR门的行为,并使用Verilog实现,生成输入信号后通过模拟,验证每个门的操作,并使用FPGA来验证Verilog实现的电路的行为。本章目......