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

举报
李锐博恩 发表于 2021/07/15 01:27:39 2021/07/15
【摘要】 一、状态转移型的序列信号产生器的verilog HDL 设计 用一个不断循环的状态机,循环产生序列信号001011。过程过于简单,我就不画状态图了。 直接给出verilog HDL设计代码: //有限状态机方式实现001011序列信号产生器 module sequence_signal_fsm(clk, rst_n, dout); input clk, rst_n; ...

一、状态转移型的序列信号产生器的verilog HDL 设计

用一个不断循环的状态机,循环产生序列信号001011。过程过于简单,我就不画状态图了。

直接给出verilog HDL设计代码:


  
  1. //有限状态机方式实现001011序列信号产生器
  2. module sequence_signal_fsm(clk, rst_n, dout);
  3. input clk, rst_n;
  4. output dout;
  5. reg dout;
  6. reg [2:0] pre_state, next_state;
  7. parameter s0 = 3'b000, s1 = 3'b001, s2 = 3'b010,
  8. s3 = 3'b011, s4 = 3'b100, s5 = 3'b101;
  9. always @(posedge clk or negedge rst_n)
  10. begin
  11. if(rst_n == 0)
  12. pre_state <= s0;
  13. else
  14. pre_state <= next_state;
  15. end
  16. always @(pre_state)
  17. begin
  18. case(pre_state)
  19. s0:
  20. begin
  21. dout = 1'b0;
  22. next_state <= s1;
  23. end
  24. s1:
  25. begin
  26. dout = 1'b0;
  27. next_state = s2;
  28. end
  29. s2:
  30. begin
  31. dout = 1'b1;
  32. next_state = s3;
  33. end
  34. s3:
  35. begin
  36. dout = 1'b0;
  37. next_state = s4;
  38. end
  39. s4:
  40. begin
  41. dout = 1'b1;
  42. next_state = s5;
  43. end
  44. s5:
  45. begin
  46. dout = 1'b1;
  47. next_state = s0;
  48. end
  49. default: next_state = s0;
  50. endcase
  51. end
  52. endmodule

测试文件为:


  
  1. `timescale 1ns/1ps
  2. module sequence_signal_fsm_tb;
  3. reg clk, rst_n;
  4. wire dout;
  5. always
  6. #10 clk = ~clk;
  7. initial
  8. begin
  9. clk = 1'b0;
  10. rst_n = 1'b1;
  11. #10 rst_n = 1'b0;
  12. #10 rst_n = 1'b1;
  13. end
  14. sequence_signal_fsm U1(.clk(clk), .rst_n(rst_n), .dout(dout));
  15. endmodule

在Modelsim中仿真所得波形图为:


二、移位寄存器型序列信号产生器

下面描述的是一个6位移位寄存器类型的序列信号产生器,在输入端输入任意序列,通过移位寄存器,使得输入信号的最高位移入最低位,其他各位依次向左移一位,在每个时钟上升沿到来时,将输入信号的最高位通过dout输出,从而循环产生序列信号。

下面直接给出verilog HDL设计代码:


  
  1. module signal_generator_shifter_reg(clk, rst, din, dout);
  2. input clk, rst;
  3. input [5:0] din;
  4. output dout;
  5. reg dout;
  6. reg [5:0] temp;
  7. always@(posedge clk)
  8. begin
  9. if(rst == 1'b1)
  10. temp <= din;
  11. else
  12. begin
  13. dout <= temp[5];
  14. temp <= {temp[4:0], temp[5]};
  15. end
  16. end
  17. endmodule

测试代码为:


  
  1. `timescale 1ns/1ps
  2. module signal_generator_shifter_reg_tb;
  3. reg clk, rst;
  4. reg [5:0] din;
  5. wire dout;
  6. always
  7. #10 clk = ~clk;
  8. initial
  9. begin
  10. clk = 1'b0;
  11. rst = 1'b0;
  12. #10 rst = 1'b1;
  13. din = 6'b001011;
  14. #20 rst = 1'b0;
  15. end
  16. signal_generator_shifter_reg U1(.clk(clk), .rst(rst), .din(din), .dout(dout));
  17. endmodule

在Modelsim中仿真所得波形图如下:



三、计数器加组合输出网络类型


计数型序列信号发生器的结构框图如上图示:它由计数器和组合输出网络两部分组成,序列信号从组合输出网络输出。这种类型的序列信号发生器一般分两步来设计,首先根据序列的长度M设计模M计数器,计数器的状态可以自定;然后按计数器的状态转移关系和序列码的要求设计组合输出网络。由于计数器的状态设置和输出网络没有直接的关系,因此这种结构对于输出序列的更改比较方便,而且还能同时产生多组序列码。

下面描述的为计数器加组合输出网络构成的序列信号发生器,产生001011序列信号,通过内部的3位计数器进行计数,由计数状态和输出序列的对应关系,得到其输出组合逻辑真值表,从表中可以看到,Q2Q1Q0从000开始计数并不断加1,每个状态对应一个输出Z。通过真值表可以得到卡诺图,化简后可以得到输出逻辑函数为: 

Q2

Q1

Q0

Z

0

0

0

0

0

0

1

0

0

1

0

1

0

1

1

0

1

0

0

1

1

0

1

1

输出组合逻辑真值表

下面直接给出verilog HDL 设计代码:


  
  1. module counter_sequence(clk, rst, dout);
  2. input clk, rst;
  3. output dout;
  4. reg [2:0] counter;
  5. always @(posedge clk)
  6. begin
  7. if(rst == 1'b1)
  8. counter <= 3'b000;
  9. else if(counter == 3'b101)
  10. counter <= 3'b000;
  11. else counter <= counter + 1'b1;
  12. end
  13. assign dout = ((~counter[0]) & counter[1]) | counter[2];
  14. endmodule

测试文件:


  
  1. module counter_sequence_tb;
  2. reg clk, rst;
  3. wire dout;
  4. always
  5. #10 clk = ~clk;
  6. initial
  7. begin
  8. clk = 1'b0;
  9. rst = 1'b0;
  10. #10 rst = 1'b1;
  11. #20 rst = 1'b0;
  12. end
  13. counter_sequence U1(.clk(clk), .rst(rst), .dout(dout));
  14. endmodule

在Modelsim中仿真所得仿真图:


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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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