利用利用FPGA输出占空比可调的方波输出占空比可调的方波
一开始我不太认同通过测试文件的输入值改变占空比的做法符合要求,总感觉这等同于多次不同的测试放到了一起。后来感觉手动调占空比也符合要求,可以对应开发板上一个按
键,来改变占空比。
手动调的方案
module PWM(clk,rst_n,duty,PWM_wave);
input clk;
input [6:0] duty;
input rst_n;
output reg PWM_wave;
reg [7:0] count;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
PWM_wave<=0;
count=8'd100)
count<=8'd0;
if(count<8'd100)
count<=count+8'd1;
if(count<duty)
PWM_wave=duty)
PWM_wave<=0;
end
end
endmodule
测试文件
`timescale 10ns/1ns
module test();
reg clk;
reg rst_n;
reg [6:0] duty;
wire PWM_wave;
PWM u1(.clk(clk),.rst_n(rst_n),.duty(duty),.PWM_wave(PWM_wave));
initial
begin
clk<=0;
rst_n=0;
duty=7'd10;
#10 rst_n=1;
#100 duty=7'd30;
#100 duty=7'd50;
#100 duty=7'd70;
end
always #10 clk<=~clk;
endmodule
自动改变占空比的程序可对应呼吸灯实例,代码如下
顶层文件
module top_pwm(CLK_50M,RST_N,pwm_out);
input CLK_50M;
input RST_N;
output pwm_out;
wire CLK_1M;
fenpin i1(.CLK_50M(CLK_50M),.RST_N(RST_N),.CLK_1M(CLK_1M));
PWM i2(.CLK_1M(CLK_1M),.RST_N(RST_N),.pwm_out(pwm_out));
endmodule
PWM程序
module PWM(CLK_1M,RST_N,pwm_out);
input CLK_1M;
input RST_N;
output pwm_out;
reg [6:0] time_cnt;
reg [6:0] turn_reg;
reg pwm_reg;
reg flag;
//---------------------------------------------
parameter period=7'd50;
parameter turn=7'd30;
//---------------------------------------------------
always @ (posedge CLK_1M or negedge RST_N)
begin
if(!RST_N)
begin
time_cnt <= 7'd0;
pwm_reg<= 1'b0;
turn_reg<=turn;
end
else
begin
评论0