赞
踩
目录
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亮一次.
设计文件共两个,先设计一个led灯的功能LED_Flicker;在另外一个设计文件led_flicker_8中例化8次LED_Flicker模块
LED_Flicker模块:
- module LED_Flicker(
- input Clk,
- input Reset_n,
- output reg Led
- );
-
- reg [30:0]counter;//注意位数
-
- parameter MCNT = 25_000_000-1;
-
- always@(posedge Clk or negedge Reset_n)
- if(!Reset_n)
- counter <= 0;
- else if(counter == MCNT)
- counter <= 0;
- else
- counter <= counter + 1'd1;
- always@(posedge Clk or negedge Reset_n)
- if(!Reset_n)
- Led <= 0;
- else if(counter == MCNT)
- Led <= !Led;
- else
- Led <= Led;
- endmodule
led_flicker_8模块:
- module led_flicker_8(
- input Clk,
- input Reset_n,
- output [7:0]led
- );
-
- LED_Flicker
- #(
- .MCNT(2500_000-1)//0.05s
- )
- LED_Flicker_inst0(
- .Clk(Clk),
- .Reset_n(Reset_n),
- .Led(led[0])
- );
-
- LED_Flicker
- #(
- .MCNT(5000_000-1)//0.1s
- )
- LED_Flicker_inst1(
- .Clk(Clk),
- .Reset_n(Reset_n),
- .Led(led[1])
- );
-
- LED_Flicker
- #(
- .MCNT(6250_000-1)//0.125s
- )
- LED_Flicker_inst2(
- .Clk(Clk),
- .Reset_n(Reset_n),
- .Led(led[2])
- );
-
- LED_Flicker
- #(
- .MCNT(12500_000-1)//0.25s
- )
- LED_Flicker_inst3(
- .Clk(Clk),
- .Reset_n(Reset_n),
- .Led(led[3])
- );
-
- LED_Flicker
- #(
- .MCNT(25_000_000-1)//0.5s
- )
- LED_Flicker_inst4(
- .Clk(Clk),
- .Reset_n(Reset_n),
- .Led(led[4])
- );
-
- LED_Flicker
- #(
- .MCNT(50_000_000-1)//1s
- )
- LED_Flicker_inst5(
- .Clk(Clk),
- .Reset_n(Reset_n),
- .Led(led[5])
- );
-
- LED_Flicker
- #(
- .MCNT(62500_000-1)//1.25s
- )
- LED_Flicker_inst6(
- .Clk(Clk),
- .Reset_n(Reset_n),
- .Led(led[6])
- );
-
- LED_Flicker LED_Flicker_inst7(
- .Clk(Clk),
- .Reset_n(Reset_n),
- .Led(led[7])
- );
-
- defparam LED_Flicker_inst7.MCNT = 100_000_000-1; //将MCNT重定义
-
- endmodule
- `timescale 1ns / 1ns
-
- module led_flicker_4_tb();
-
- reg Clk;
- reg Reset_n;
- wire [7:0]Led;
-
- led_flicker_8 led_flicker_8_inst0(
- .Clk(Clk),
- .Reset_n(Reset_n),
- .led(Led)
- );
- //产生20ns为周期的方波激励时钟信号
- initial Clk = 1;//初始信号为高电平
- always #10 Clk = ~Clk;//延时10ns以后初始信号取反,这句话是总是执行的。
- //产生激励复位信号
- initial begin
- Reset_n = 0;//开始复位信号为0,有效复位
- #201 Reset_n = 1;//201ns以后复位信号变为高电平,无效电平。开始仿真
- #2_000_000_000;//仿真2s
- #2_000_000_000;//仿真2s
- $stop;//停止仿真
- end
- endmodule
横坐标一个大刻度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分别进行闪烁频率配置;并且要注意每一次调用子模块的函数名应当不同,要有唯一性;
- LED_Flicker
- #(
- .MCNT(2500_000-1)//0.05s
- )
-
- 或者
-
- defparam LED_Flicker_inst7.MCNT = 100_000_000-1; //将MCNT重定义
2.由于在主模块将led的闪烁频率设置的较慢,counter对于原来的25位数据溢出,导致程序出错,因此需要注意参数的数据位数;
- reg [30:0]counter;
-
- //注意led的闪烁频率设置的较慢,要防止数据溢出,导致程序出错,无法仿真出溢出的LED灯闪烁频率
- //led灯最长时间2s一次,计数器计数100000000次,d100000000=b0101 1111 0101 1110 0001 0000 0000;
- //需要宽度至少28位;此处30位,可以正常使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。