基于上已篇文章基础上增加LED闪烁的功能
《gowin GW1N4 OSC IP 使用》 gowin GW1N4 OSC IP 使用-CSDN博客 https://blog.csdn.net/wzy15965343032/article/details/136172184?spm=1001.2014.3001.5502
代码:
module osc_test(
input rst_n,
output test_clk,
output reg led,
output led2
);
parameter BLINK_PERIOD = 12_500_000; // LED 翻转周期
//parameter BLINK_PERIOD = 0.5 / (1 / 50,000,000) = 25,000,000
//parameter BLINK_PERIOD = 0.5 / (1 / 25,000,000) = 12,500,000
reg [31:0] counter; // 32 bits counter for BLINK_PERIOD cycles
wire clkin;
Gowin_OSC my_osc (
.oscout(clkin)
);
assign test_clk = clkin;
assign led2 = led;
always @(posedge clkin or negedge rst_n) begin
if (~rst_n) begin // Reset counter and LED on negative edge of rst_n
counter <= 0;
led <= 0;
end
else
begin
if (counter == BLINK_PERIOD) begin // Toggle LED every BLINK_PERIOD cycles
led <= ~led;
counter <= 0; // Reset counter
end else begin
counter <= counter + 1; // Increment counter
end
end
end
endmodule
这段代码定义了一个名为 osc_test 的模块,其中包含了一个时钟信号 clkin,一个复位信号 rst_n,以及两个输出信号 led 和 led2。
parameter BLINK_PERIOD = 12_500_000;定义了 LED 翻转的周期,即 LED 每隔BLINK_PERIOD个时钟周期翻转一次。reg [31:0] counter;定义了一个 32 位的寄存器counter,用于计数时钟周期。wire clkin;定义了一个时钟信号输入端口clkin。Gowin_OSC my_osc (.oscout(clkin));实例化了一个名为my_osc的Gowin_OSC模块,将其输出端口oscout连接到clkin。assign test_clk = clkin;将clkin赋值给test_clk,用于输出测试时钟信号。assign led2 = led;将led的状态赋值给led2,使得led2与led同步。
接下来是一个 always 块,用于控制 LED 的翻转。在时钟信号 clkin 的上升沿或复位信号 rst_n 的下降沿触发时执行。如果复位信号 rst_n 为低电平,则将 counter 和 led 复位为 0;否则,当 counter 达到 BLINK_PERIOD 时,翻转 led 并将 counter 复位为 0,否则递增 counter。
最后,注释部分是被注释掉的之前的代码,可能是之前版本的 LED 翻转实现。

被折叠的 条评论
为什么被折叠?



