【從零開始走進FPGA】美好開始——我流啊流啊流
(2)clk_design.v模塊設計
本文引用地址:http://www.ex-cimer.com/article/268641.htm由于系統(tǒng)輸入時鐘是50Mhz,若以50MHz的速度變換LED等,人眼壓根分辨不出來。因此利用分頻原理,來對50MHz進行分頻,而適應人眼。本模塊將50MHz分頻至10Hz,人眼分辨的極限是25Hz,因此10Hz能感覺得到(可以隨機修改)。Led_en的頻率計算公式:clk_led_en = 50_000000/(49_000000+1) = 10Hz,具體代碼如下:
module clk_design
(
input clk,
input rst_n,
output led_en
);
reg [22:0] cnt; //49_99999,100ms
parameter LED_CNT = 49_999999;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt <= 23'd0;
else if(cnt < LED_CNT)
cnt <= cnt + 1'b1;
else
cnt <= 23'd0;
end
assign led_en = (cnt == 23'd49_99999) ? 1'b1 : 1'b0;
endmodule
模塊沒有分頻產(chǎn)生10Hz的頻率,而是生成了10Hz的使能時鐘,目的是防止時鐘滿天飛,使得FPGA 內(nèi)部布局布線紊亂,影響全局功能。雖然如此簡單的工程可以不用考慮,但是“習慣了嚴謹便成為了一種風范”,因此使用使能時鐘,來對具體的時序進行操作。具體使能時鐘、門控時鐘的異同、優(yōu)劣將會在后續(xù)章節(jié)中解說。
(3)led_display.v模塊設計
根據(jù)輸入的led_en使能信號,來操作led燈的效果,此處采用最簡單的算法——遞增進位。代碼如下所示:
module led_display
(
input clk,
input rst_n,
input led_en,
output reg [5:0] led_data
);
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
led_data <= 6'b0;
else if(led_en)
led_data <= led_data + 1'b1;
else
led_data <= led_data;
end
endmodule
(4)從新修改water_led_design頂層文件,添加相關例化模塊。最后結果如下:
module water_led_design
(
input clk, //global clock 50MHz
input rst_n, //global clock reset
output [5:0] led_data //user led interface
);
//-------------------------
//generater clock 10Hz
wire led_en;
clk_design clk_design_inst
(
.clk (clk),
.rst_n (rst_n),
.led_en (led_en)
);
//-------------------------
//set the display of led
led_display led_display_inst
(
.clk (clk),
.rst_n (rst_n),
.led_en (led_en),
.led_data (led_data)
);
endmodule
fpga相關文章:fpga是什么
c++相關文章:c++教程
評論