abstractaccelerator/fpga/xc7z010/led.v

85 lines
1.9 KiB
Coq
Raw Normal View History

2025-04-13 23:34:26 +08:00
module led(
input wire clk, // 输入时钟
output reg led // led 输出(高电平有效)
);
2025-04-20 21:31:53 +08:00
localparam MAX_DELAY_CNT = 50000000,
2025-04-13 23:34:26 +08:00
CYCLE_NUMBER = 100; //占空比分为0~100个级别
reg myclk;
2025-04-20 21:31:53 +08:00
reg [31:0] delay_cnt;
2025-04-13 23:34:26 +08:00
reg [7:0] current_cycle;
reg flag;
reg [7:0] cycle;
//--------------------------------------------------------
// myclk分频
always@(posedge clk) begin
if(delay_cnt < MAX_DELAY_CNT)
delay_cnt <= delay_cnt + 1'b1;
else begin
2025-04-20 21:31:53 +08:00
delay_cnt <= 32'd1;
myclk <= ~myclk; // 100Mhz
2025-04-13 23:34:26 +08:00
end
end
//--------------------------------------------------------
// 0的时候占空比最小这个时候直接完全输出高电平led灯最亮
// 100的时候占空比最大这个时候直接完全输出低电平led等熄灭
always@(posedge myclk) begin
if(flag == 0) begin // 占空比递增
2025-04-19 17:36:26 +08:00
if(current_cycle < (CYCLE_NUMBER/10))
2025-04-13 23:34:26 +08:00
current_cycle <= current_cycle + 1'b1;
else
flag <= ~flag;
end
else begin // 占空比递减
if(current_cycle > 0)
current_cycle <= current_cycle - 1'b1;
else
flag <= ~flag;
end
end
//--------------------------------------------------------
// 轮询 0~100个级别的占空比
always@(posedge clk)
if(cycle < CYCLE_NUMBER)
cycle <= cycle + 1'b1;
else
cycle <= 1'b1;
//--------------------------------------------------------
// cycle小于current_cycle的时候是低电平
// cycle大于current_cycle并且小于CYCLE_NUMBER的时候是高电平
2025-04-20 21:31:53 +08:00
// always@(posedge clk)
// if((cycle == CYCLE_NUMBER) && (current_cycle != 0))
// led <= 1'b1;
// else if(cycle < current_cycle)
// led <= 1'b1;
// else
// led <= 1'b0;
2025-04-13 23:34:26 +08:00
always@(posedge clk)
2025-04-20 21:31:53 +08:00
if((delay_cnt[20:14] ==0) && myclk)
2025-04-13 23:34:26 +08:00
led <= 1'b1;
else
led <= 1'b0;
2025-04-20 20:07:37 +08:00
reg [17:0] a;
reg [17:0] b;
wire [17:0] p;
mult_gen_0 mul(
.CLK(clk),
.A(a),
.B(b),
.P(p)
);
2025-04-13 23:34:26 +08:00
endmodule