赞
踩
本段代码是为Verilog初学者提供的一个名为led_blink简单实例Verilog模块,其功能是控制6个LED灯同步闪烁,每秒钟闪烁一次。
与02_led_blink_v1版本相比新增内容:
增加一组dip控制引脚,用于控制LED闪烁的速度;
使用模块级parameter关键词定义一些常量,模块级参数可以在例化模块的时候给出具体值,参数化模块使得代码更具灵活,提高可复用性
在模块接口的output接口使用reg型变量,因此代码中不再需要assign led = led_q
这样的代码,代码更简洁。
使用唯一的三目运算符( ? :)处理组合逻辑的多路分支。
知识点:
module led_blink #(
parameter ONE_MSECOND = 50*1000, //clock periods of one millsecond
parameter ALL_LED_ON = 6'b000000 //led active low
)(
input clk,
input rst_n,
input wire [5:0] dip_u5,
output reg [5:0] led
);
localparam ALL_LED_OFF = ~ALL_LED_ON;
reg [31:0] count;
wire [1:0] speed = dip_u5[5:4];
wire [31:0] count_max =
(speed == 2'b00) ? ONE_MSECOND*1000 :
(speed == 2'b01) ? ONE_MSECOND*500 :
(speed == 2'b10) ? ONE_MSECOND*250 : ONE_MSECOND*125;
always @(posedge clk) begin
if(~rst_n) count <= 0;
else if(count == count_max-1) count <= 0;
else count <= count + 1;
end
always @(posedge clk) begin
if(~rst_n) led <= ALL_LED_ON;
else if(count == count_max-1) begin
if(led == ALL_LED_ON) led <= ALL_LED_OFF;
else led <= ALL_LED_ON;
end
//else led <= led;
end
endmodule
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。