FPGA réalise des clignotements de LED 10 fois, et le temps de clignotement et les temps de clignotement peuvent être modifiés par des paramètres

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 !

Acho que você gosta

Origin blog.csdn.net/jac_chao/article/details/124209425
Recomendado
Clasificación