基于上已篇文章基础上增加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 翻转实现。