⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.txt

📁 自己写的一个pwm模块
💻 TXT
字号:
module PWM(clk,addr,wr_n,wrdata,reset,pwm1,pwm2,pwm3,pwm4);
input clk,wr_n,reset; //wr_n ----- 写有效,在SOPC Builder中设为wr_n
                      //reset ----  全局复位信号,低电平有效,在SOPC中设为reset_n信号
input [1:0]addr; //addr ----- 写地址,在SOPC Builder中设为address
input [15:0]wrdata;  //wrdata ----- 写数据线,16位,在SOPC Builder中设为writedata
output pwm1,pwm2,pwm3,pwm4; //这四个信号为输出信号,与H桥的1~4号开关管一一对应,适用于驱动
                         //4个NMOS构成的H桥,如果H桥上臂为PMOS,则PWM1和PWM2极性需要经过
                        // 非门方向,

reg [15:0]duty; //占空比
reg [15:0]period; //周期
reg [15:0]counter; //计数器
reg start;
reg out;
reg direct;
reg pwm1,pwm2,pwm3,pwm4;



always @(posedge clk or negedge reset)
begin
    if (reset == 1'b0)
    begin
     			duty[15:0] <= 16'h7fff;
			{direct,start} <= 2'b00;
			period[15:0] <= 16'h0ffff;
    end 
    else
    begin  
       if (wr_n == 1'b0)
       begin
           
          if (addr[1:0] == 2'b00) 
		    begin
			   {direct,start} <= wrdata[1:0];
			   period[15:0] <= period[15:0];
			   duty[15:0] <= duty[15:0];
		    end

          else if (addr[1:0] == 2'b01) 
		    begin
			   start <= start;
			   direct <= direct;
			   period[15:0] <= wrdata[15:0];
			   duty[15:0] <= duty[15:0];
		    end
		    
          else if (addr[1:0] == 2'b10) 
		    begin
			   duty[15:0] <= wrdata[15:0];
			   start <= start;
			   direct <= direct;
			   period[15:0] <= period[15:0];
		    end
		    
		    else
		    begin
			   duty[15:0] <= duty[15:0];
			   start <= start;
			   direct <= direct;
			   period[15:0] <= period[15:0];
		    end	
    
       end
	    else
	    begin
		   duty[15:0] <= duty[15:0];
		   start <= start;
		   direct <= direct;
		   period[15:0] <= period[15:0];
	    end
   end   
end

always @(posedge clk)
begin
    
    if ((wr_n == 1'b0) && (addr[1:0] == 2'b11)) 
    begin
       counter[15:0] <= wrdata[15:0];
    end
    else if (start == 1'b1)
    begin
        if (counter[15:0] < period[15:0]) counter[15:0] <= counter[15:0] + 16'b1;
        else counter[15:0] <= 16'b0;
    end
    else counter[15:0] <= counter[15:0];
    
    if (start == 1'b1)
    begin
       if (counter[15:0] <= duty[15:0]) out <= 1'b1;
       else out <= 1'b0;
   end
   else out <= 1'b0;
end

always @(out or start or direct)
begin
    if (start == 1'b0)
    begin
        pwm1 = 1'b0;
        pwm2 = 1'b0;
        pwm3 = 1'b0;
        pwm4 = 1'b0;
    end
    else if (direct == 1'b0) 
    begin
        pwm1 = 1'b1;
        pwm2 = 1'b0;
        pwm3 = out;
        pwm4 = 1'b0;
    end
    else
    begin
        pwm1 = 1'b0;
        pwm2 = 1'b1;
        pwm3 = 1'b0;
        pwm4 = out;
    end
end



endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -