当前位置:   article > 正文

小梅哥Xilinx FPGA学习笔记6——参数化设计及模块重用设计不同频率的流水灯

小梅哥Xilinx FPGA学习笔记6——参数化设计及模块重用设计不同频率的流水灯

目录

一、功能介绍

1.功能描述

二、代码编写

1.设计文件

2.激励文件

3.仿真图

三、总结


一、功能介绍

1.功能描述

        8个Led灯分别以不同频率循环闪烁,led[0]0.05s亮一次;led[1]0.1s亮一次;led[2]0.125s亮一次;led[3]0.25s亮一次;led[4]0.5s亮一次;led[5]1s亮一次;led[6]1.25s亮一次;led[7]2s亮一次.

二、代码编写

1.设计文件

设计文件共两个,先设计一个led灯的功能LED_Flicker;在另外一个设计文件led_flicker_8中例化8次LED_Flicker模块

LED_Flicker模块:

  1. module LED_Flicker(
  2. input Clk,
  3. input Reset_n,
  4. output reg Led
  5. );
  6. reg [30:0]counter;//注意位数
  7. parameter MCNT = 25_000_000-1;
  8. always@(posedge Clk or negedge Reset_n)
  9. if(!Reset_n)
  10. counter <= 0;
  11. else if(counter == MCNT)
  12. counter <= 0;
  13. else
  14. counter <= counter + 1'd1;
  15. always@(posedge Clk or negedge Reset_n)
  16. if(!Reset_n)
  17. Led <= 0;
  18. else if(counter == MCNT)
  19. Led <= !Led;
  20. else
  21. Led <= Led;
  22. endmodule

led_flicker_8模块:

  1. module led_flicker_8(
  2. input Clk,
  3. input Reset_n,
  4. output [7:0]led
  5. );
  6. LED_Flicker
  7. #(
  8. .MCNT(2500_000-1)//0.05s
  9. )
  10. LED_Flicker_inst0(
  11. .Clk(Clk),
  12. .Reset_n(Reset_n),
  13. .Led(led[0])
  14. );
  15. LED_Flicker
  16. #(
  17. .MCNT(5000_000-1)//0.1s
  18. )
  19. LED_Flicker_inst1(
  20. .Clk(Clk),
  21. .Reset_n(Reset_n),
  22. .Led(led[1])
  23. );
  24. LED_Flicker
  25. #(
  26. .MCNT(6250_000-1)//0.125s
  27. )
  28. LED_Flicker_inst2(
  29. .Clk(Clk),
  30. .Reset_n(Reset_n),
  31. .Led(led[2])
  32. );
  33. LED_Flicker
  34. #(
  35. .MCNT(12500_000-1)//0.25s
  36. )
  37. LED_Flicker_inst3(
  38. .Clk(Clk),
  39. .Reset_n(Reset_n),
  40. .Led(led[3])
  41. );
  42. LED_Flicker
  43. #(
  44. .MCNT(25_000_000-1)//0.5s
  45. )
  46. LED_Flicker_inst4(
  47. .Clk(Clk),
  48. .Reset_n(Reset_n),
  49. .Led(led[4])
  50. );
  51. LED_Flicker
  52. #(
  53. .MCNT(50_000_000-1)//1s
  54. )
  55. LED_Flicker_inst5(
  56. .Clk(Clk),
  57. .Reset_n(Reset_n),
  58. .Led(led[5])
  59. );
  60. LED_Flicker
  61. #(
  62. .MCNT(62500_000-1)//1.25s
  63. )
  64. LED_Flicker_inst6(
  65. .Clk(Clk),
  66. .Reset_n(Reset_n),
  67. .Led(led[6])
  68. );
  69. LED_Flicker LED_Flicker_inst7(
  70. .Clk(Clk),
  71. .Reset_n(Reset_n),
  72. .Led(led[7])
  73. );
  74. defparam LED_Flicker_inst7.MCNT = 100_000_000-1; //将MCNT重定义
  75. endmodule

2.激励文件

  1. `timescale 1ns / 1ns
  2. module led_flicker_4_tb();
  3. reg Clk;
  4. reg Reset_n;
  5. wire [7:0]Led;
  6. led_flicker_8 led_flicker_8_inst0(
  7. .Clk(Clk),
  8. .Reset_n(Reset_n),
  9. .led(Led)
  10. );
  11. //产生20ns为周期的方波激励时钟信号
  12. initial Clk = 1;//初始信号为高电平
  13. always #10 Clk = ~Clk;//延时10ns以后初始信号取反,这句话是总是执行的。
  14. //产生激励复位信号
  15. initial begin
  16. Reset_n = 0;//开始复位信号为0,有效复位
  17. #201 Reset_n = 1;//201ns以后复位信号变为高电平,无效电平。开始仿真
  18. #2_000_000_000;//仿真2s
  19. #2_000_000_000;//仿真2s
  20. $stop;//停止仿真
  21. end
  22. endmodule

3.仿真图

横坐标一个大刻度200ms,led[0]0.05s亮一次;led[1]0.1s亮一次;led[2]0.125s亮一次;led[3]0.25s亮一次;led[4]0.5s亮一次;led[5]1s亮一次;led[6]1.25s亮一次;led[7]2s亮一次.

三、总结

1.在主模块led_flicker_8模块中,通过调用子模块单个led闪烁功能,用LED_Flicker_inst0.MCNT 对8个led分别进行闪烁频率配置;并且要注意每一次调用子模块的函数名应当不同,要有唯一性;

  1. LED_Flicker
  2. #(
  3. .MCNT(2500_000-1)//0.05s
  4. )
  5. 或者
  6. defparam LED_Flicker_inst7.MCNT = 100_000_000-1; //将MCNT重定义

2.由于在主模块将led的闪烁频率设置的较慢,counter对于原来的25位数据溢出,导致程序出错,因此需要注意参数的数据位数;

  1. reg [30:0]counter;
  2. //注意led的闪烁频率设置的较慢,要防止数据溢出,导致程序出错,无法仿真出溢出的LED灯闪烁频率
  3. //led灯最长时间2s一次,计数器计数100000000次,d100000000=b0101 1111 0101 1110 0001 0000 0000;
  4. //需要宽度至少28位;此处30位,可以正常使用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/402669
推荐阅读
相关标签
  

闽ICP备14008679号