1 Fonction :
Sachez que la LED clignote 10 fois puis s'éteint
2 Modalités de mise en œuvre
Sur la base du compteur de temporisation d'origine, un compteur pour enregistrer les impulsions de temporisation est ajouté et chaque impulsion de temporisation est incrémentée de 1. Par conséquent, le compteur d'impulsions de temporisation compte deux fois, la LED clignote une fois. Si la LED doit clignoter 20 fois, le compteur des impulsions de synchronisation doit compter 20 fois (0~19). Ajoutez le bit d'arrêt stopFlag, lorsque le compteur de l'impulsion de synchronisation est plein, il sera mis à 1, et la sortie LED restera inchangée après cela.Ce programme consiste à éteindre la LED, et vous pouvez également allumer la LED .
3 Procédures de mise en œuvre
module ledon_10times
#(
parameter COUNTER_MAX = 25'd24_999_999,
parameter LEDON_COUNTER = 5'd19
)
(
input wire sys_clk,
input wire sys_rst_n,
output reg led_out
);
reg [24:0] counter;
reg [4:0] ledOnCounter;
reg stopFlag = 1'b0;
reg counter_flag;
// 设置counter
always @(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n == 1'b0)
counter <= 25'd0;
else if(counter == COUNTER_MAX)
counter <= 25'd0;
else
counter <= counter + 25'd1;
end
// 设置counter_flag
always @(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n == 1'b0)
counter_flag <= 1'b0;
else if(counter == COUNTER_MAX - 25'd1)
counter_flag <= 1'b1;
else if(ledOnCounter == LEDON_COUNTER)
counter_flag <= 1'b0;
else
counter_flag <= 1'b0;
end
// 设置ledout,前10s灯闪烁,10次后熄灭
// 不能在不同always块中对同一个信号进行赋值
always @(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n == 1'b0)
led_out <= 1'b0;
else if(counter_flag == 1'b1 && stopFlag == 1'b0)
led_out <= ~ led_out;
else if(stopFlag == 1'b1) // 10次后让灯熄灭
led_out <= 1'b1;
else
led_out <= led_out;
end
// 设置ledOnCounter
always @(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n == 1'b0)
ledOnCounter <= 5'b0;
else if(ledOnCounter == LEDON_COUNTER && counter_flag == 1'b1)
ledOnCounter <= 5'b0;
else if( counter_flag == 1'b1)
ledOnCounter <= ledOnCounter + 5'b1;
else
ledOnCounter <= ledOnCounter;
end
// 置位标志位
always @(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n == 1'b0)
stopFlag <= 1'b0;
else if(ledOnCounter == LEDON_COUNTER-1 && counter_flag == 1'b1)
stopFlag <= 1'b1;
else
stopFlag <= stopFlag;
end
endmodule
- Oscillateur à cristal FPGA 50 MHz intégré, donc un cycle d'horloge est de 20 ns
- Pour réaliser un retournement de LED en 0,5 s, il doit compter 25 x 10 ^ 6 fois (c'est-à-dire : 0 ~ 24_999_999)
3 Programme de simulation
`timescale 1 ns/ 1 ps
module tb_ledon_10times();
// test vector input registers
reg sys_clk;
reg sys_rst_n;
// wires
wire led_out;
initial begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
#20
sys_rst_n = 1'b1;
end
always #20 sys_clk = ~sys_clk;
// assign statements (if any)
ledon_10times
#(
.COUNTER_MAX (25'd24),
.LEDON_COUNTER (5'd19)
)
ledon_10times_init1
(
// port map - connection between master ports and signals/registers
.led_out(led_out),
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n)
);
endmodule
Forme d'onde de simulation
La forme d'onde est conforme au design, et la simulation est réussie !