利用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'd0;
				end
			else
				begin
				if(count>=8'd100)
					count<=8'd0;
				if(count<8'd100)
					count<=count+8'd1;
					
				if(count<duty)
					PWM_wave<=1;
				if(count>=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
				time_cnt<=time_cnt+7'd1;
				
				if(turn_reg==turn)
					flag=1'b0;
				if(turn_reg==7'd1)
					flag=1'b1;
					
				if ( time_cnt <= turn_reg-1) 
					pwm_reg <= 1'b0;
				if (( time_cnt > turn_reg-1) && (time_cnt<period-1))
					pwm_reg <= 1'b1;
					
				if(time_cnt==period-1)
					begin
					time_cnt <= 7'd0;
					if(flag==1'b1)//改变占空比
						turn_reg<=turn_reg+7'd1;	
					if(flag==1'b0)
						turn_reg<=turn_reg-7'd1;
					end
				end
		end
 
   assign  pwm_out= pwm_reg;
	
 endmodule

分频产生1MHz时钟

module fenpin(CLK_50M,RST_N,CLK_1M);

	input CLK_50M ;
	input RST_N;
	output CLK_1M;
	
	reg [6:0] time_cnt;
	reg  CLK_1M;
	parameter period=7'd25;
	
	always@(posedge CLK_50M or negedge RST_N)
		begin
			if(!RST_N)
				begin
				time_cnt<=7'd0;
				CLK_1M<=1'b0;
				end
			else
				begin
				time_cnt<=time_cnt+7'd1;
				if(time_cnt==period-1)
					begin
					CLK_1M<=~CLK_1M;
					time_cnt<=7'd0;
					end
				end
		end
endmodule
	

测试文件

`timescale 1ns/1ns

module pwm_test();
	
	reg CLK_50M;
	reg RST_N;
	wire pwm_out;
	
	top_pwm  u1 (.CLK_50M(CLK_50M),.RST_N(RST_N),.pwm_out(pwm_out));
	
	initial 
		begin
		
		RST_N=0;
		CLK_50M=0;
		#10 RST_N=1;
		#10 RST_N=0;
		#10 RST_N=1;
		
		end
		
	always  #10 CLK_50M=~CLK_50M;
	
endmodule

仿真波形
在这里插入图片描述

  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
FPGA(现场可编程逻辑门阵列)是一种集成电路芯片,具有灵活可编程逻辑资源,可用于实现各种数字电路功能。固定占空比方波是一种特殊形式的方波信号,其占空比(即高电平时间与周期时间的比值)是固定的。 要实现固定占空比方波,首先需要将FPGA的输入/输出端口配置成可输出电平的通用IO口。然后,通过编程方式配置FPGA内部逻辑电路,生成固定占空比方波信号。 具体步骤如下: 1. 选择一个适当的时钟源作为FPGA的时钟输入。时钟源的频率应根据期望的方波的频率来选择。 2. 使用FPGA的时钟信号为基准,通过计数器控制方波的周期。计数器的初始值、重载值和计数器递增方式可以根据方波的周期来设置。 3. 在计数器达到特定阈值时(例如计数器值达到一半时),将输出信号翻转,得到正负电平变化的方波。 4. 根据期望的占空比,通过设置翻转时机来实现。例如,如果期望的占空比是50%,则在计数器计数到一半时,翻转输出,使得高电平时间和低电平时间相等。 5. 将FPGA编程完成后,将方波信号输出到所需的外部装置或电路中,实现固定占空比方波输出。 总之,通过适当配置FPGA内部逻辑电路,利用计数器和时钟信号生成固定占空比方波信号。这种方法具有灵活性和可编程性,可以根据需求对占空比进行调节,并实现各种方波信号的输出

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值