例说LED史无前例Verilog HDL结构体模块设计
0赞
发表于 2/26/2013 9:03:57 PM
阅读(6239)
我知道很多人肯定会说我闲的没事干。。。。
相反我是从很多工程中慢慢积累出来的模块,每一个代码精挑细琢,为了完美的结构,便于任何一个工程的移植。
虽然一个小小的LED一点也不起眼,不过重点不在这,重点是Verilog的结构体模块设计,便于任何项目的移植。
一个人做了多少努力,这些都不重要,重要的是积累了多少。一个热的成就很大程度上可以看他的资本,而不是他的经历(失败者也有经历)。再次通过LED灯的多种显示功能,希望能够激发你固定结构的可移植模块的Verilog HDL电路设计。
(1)自加LED显示代码
本模块用于检测或者验证LED的电路,以及性能,一般人都会用到。
//`timescale 1ns/1ns module led_addr_display
#(
parameter LED_WIDTH = 8
)
( //global clock input clk,
input rst_n, //user led output output reg [LED_WIDTH-1:0] led_data
); //----------------------------------- localparam DELAY_TOP = 24'hff_ffff;
reg [23:0] delay_cnt;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
delay_cnt <= 0;
else if(delay_cnt < DELAY_TOP)
delay_cnt <= delay_cnt + 1'b1; else delay_cnt <= 0;
end
wire delay_done = (delay_cnt == DELAY_TOP) ? 1'b1 : 1'b0; //----------------------------------- always@(posedge clk or negedge rst_n)
begin if(!rst_n)
led_data <= 0; else if(delay_done)
led_data <= led_data + 1'b1; else led_data <= led_data;
end
endmodule
(2)LED外部输入显示
本模块用于外部数据/信号的数据,便于直观的显示结果,方便校验。
`timescale 1ns/1ns
module led_input_display
#(
parameter LED_WIDTH = 8
)
( //global clock input clk,
input rst_n, //user interface for led input led_en,
input [LED_WIDTH-1:0] led_value,
output reg [LED_WIDTH-1:0] led_data
); //-------------------------------------- always@(posedge clk or negedge rst_n)
begin if(!rst_n)
led_data <= {LED_WIDTH{1'b0}}; else if(led_en)
led_data <= led_value; else led_data <= led_data;
end
endmodule
(3)LED移位流水灯显示
本模块只是一个花样的功能,当然写好一个流水的,也许有很多很多的方法,比如状态机,Case, if else语句,到底哪种方法好与不好,其实事到如今,你应该思考:如何设计电路才是最完美的!例如:
`timescale 1ns/1ns
module led_water_display
#(
parameter LED_WIDTH = 8
)
( //global clock input clk,
input rst_n, //user led output output reg [LED_WIDTH-1:0] led_data
); //----------------------------------- localparam DELAY_TOP = 24'hff_ffff;
//localparam DELAY_TOP = 24'hf;
reg [23:0] delay_cnt;
always@(posedge clk or negedge rst_n)
begin if(!rst_n)
delay_cnt <= 0; else if(delay_cnt < DELAY_TOP)
delay_cnt <= delay_cnt + 1'b1;
else
delay_cnt <= 0;
end
wire delay_done = (delay_cnt == DELAY_TOP) ? 1'b1 : 1'b0;
//-----------------------------------
reg [2:0] led_cnt; //led count
reg left_done, right_done; //led water done edge
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
led_data <= 1;
led_cnt <= 0;
{left_done, right_done} <= 2'b10;
end else if(delay_done)
begin
led_cnt <= (led_cnt < LED_WIDTH - 2'd2) ? led_cnt + 1'b1 : 3'd0;
//water edge exchange
if(led_cnt == LED_WIDTH - 2'd2)
{left_done, right_done} <= ~{left_done, right_done}; else {left_done, right_done} <= {left_done, right_done}; //water led exchange case({left_done, right_done})
2'b10: led_data <= (led_data << 1);
2'b01: led_data <= (led_data >> 1); default:;
endcase
end else begin
led_data <= led_data;
led_cnt <= led_cnt;
{left_done, right_done} <= {left_done, right_done};
end
end
最后申明一下,这不是为了说LED的驱动,而是一种结构体!!!
