[转]产生任意Duty的PWM波形验证

用MedicalRadiate 3M主板上的FPGA产生500Hz可调PWM;3M板FPGA_CLK由STM32提供的72MHz frequence.

2.pwm.v

复制代码
 1 `timescale 1ns / 1ps
 2 module pwm(
 3 input clk_72m,
 4 input rst_n,
 5 output reg clk_50k,        
 6 output reg pwm_wave        //generator 500Hz pwm
 7     );
 8 reg rst_n1,rst_n2;
 9 
10 
11 parameter       PERIOD = 1440,
12                     PULSEWIDTH = 720,
13                     SIZE =11;    //1440=10110100000,共11位
14 reg[SIZE-1:0] counter_div; 
15 
16 
17 parameter        DUTY = 40;    //40%
18 
19 reg [6:0] pwm_counter;
20 
21 //reg X;
22 //reg duty;
23 //    
24 //异步复位,同步释放
25 always@(posedge clk_72m or negedge rst_n)
26     if(!rst_n)
27         rst_n1<=1'b0;
28     else
29         rst_n1<=1'b1;
30         
31 always@(posedge clk_72m or negedge rst_n)
32     if(!rst_n)
33         rst_n2<=1'b0;
34     else
35         rst_n2<=rst_n1;
36 //
37 //generator 50KHz clock;
38 always@(posedge clk_72m or negedge rst_n2)
39     if(!rst_n2)
40         counter_div<=0;    
41     else if(counter_div<PERIOD-1)
42       counter_div<=counter_div+1'b1;
43     else
44       counter_div<=1'b0;
45        
46 always@(posedge clk_72m or negedge rst_n2)
47     if(!rst_n2)     
48         clk_50k<=1'b0;
49     else if(counter_div<PULSEWIDTH)
50         clk_50k<=1'b1;
51     else
52         clk_50k<=1'b0;
53 //Modelsim verify ok!
54 //
55 
56 always@(posedge clk_50k or negedge rst_n2)
57     begin
58         if(!rst_n2)
59             pwm_counter<=1'b0;
60         else if(pwm_counter==99)
61             pwm_counter<=1'b0;
62         else
63             pwm_counter<=pwm_counter+1'b1;
64     end
65     
66 always@(posedge clk_50k or negedge rst_n2)
67     begin
68         if(!rst_n2)
69             pwm_wave <= 1'b0;
70         else if(pwm_counter==0)
71             pwm_wave <= 1'b1;
72         else if(pwm_counter<DUTY)
73             pwm_wave <= 1'b1;
74         else 
75             pwm_wave <= 1'b0;
76     end
77 //Modelsim verify ok!    
78 endmodule
复制代码

2.pwm_tb.v

复制代码
 1 `timescale 1ns / 1ps
 2 
 3 module pwm_tb;
 4 
 5     // Inputs
 6     reg clk_72m;
 7     reg rst_n;
 8 
 9     // Outputs
10     wire pwm_wave;
11 
12     // Instantiate the Unit Under Test (UUT)
13     pwm pwm_tb (
14         .clk_72m(clk_72m), 
15         .rst_n(rst_n), 
16         .clk_50k(clk_50k),
17         .pwm_wave(pwm_wave)
18     );
19 
20     parameter PERIOD = 14;
21     initial begin
22         // Initialize Inputs
23         clk_72m = 0;
24         forever 
25             #(PERIOD/2)    clk_72m=~clk_72m;
26     end
27 
28     initial begin
29         rst_n = 0;
30             #100 rst_n=1;
31       end
32 
33         
34 endmodule
复制代码

4.pwm_ucf.ucf

复制代码
 1 NET "clk_72m"                LOC = "L22";    
 2 NET "rst_n"                    LOC = "G21";    
 3 NET "clk_50k"                LOC = "C22";        
 4 NET "pwm_wave"         LOC = "C21";
 5 #Created by Constraints Editor (xc3s400-fg456-4) - 2013/05/16
 6 NET "clk_72m" TNM_NET = clk_72m;
 7 TIMESPEC TS_clk_72m = PERIOD "clk_72m" 14 ns HIGH 50%;
 8 
 9 
10  NET "clk_72m" CLOCK_DEDICATED_ROUTE = FALSE; 
11 
12 //由于FPGA_CLK没有接专用GCLK上面所以加上述说明语句

转载于:https://www.cnblogs.com/djerly/p/3365905.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在STM32上显示PWM波形,你可以使用定时器和输出比较功能。 以下是一些简单的步骤来实现此功能: 1. 配置定时器:选择一个适当的定时器,并根据需要配置它。设置定时器的时钟源、预分频因子和计数器模式等。通常,可选择TIM2、TIM3或TIM4等定时器。 2. 配置输出比较通道:选择一个输出比较通道,并将其与定时器相关联。选择一个适当的GPIO引脚作为PWM输出,然后将其与相应的输出比较通道相关联。 3. 配置PWM参数:设置PWM的周期和占空比。根据需要选择适当的周期和占空比值。 4. 启动定时器:启动定时器以开始计数,并开始生成PWM波形。 下面是一个简单的代码示例,用于在STM32上显示PWM波形(以TIM2为例): ```c #include "stm32f4xx.h" #define PWM_PERIOD 1000 // PWM周期 #define PWM_DUTY_CYCLE 500 // PWM占空比 void TIM2_PWM_Init(void) { // 使能TIM2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 设置预分频因子为84,定时器时钟为84MHz/84=1MHz TIM_TimeBaseStructure.TIM_Prescaler = 84 - 1; // 设置周期为PWM_PERIOD,频率为1MHz/PWM_PERIOD=1kHz TIM_TimeBaseStructure.TIM_Period = PWM_PERIOD - 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 配置输出比较通道1 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = PWM_DUTY_CYCLE; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); // 使能定时器2 TIM_Cmd(TIM2, ENABLE); } int main(void) { // 初始化系统 SystemInit(); // 初始化PWM TIM2_PWM_Init(); while (1) { // 主循环中可以添加其他代码 } } ``` 这是一个简单的示例,使用了TIM2定时器和通道1作为PWM输出。你可以根据需要进行修改,并根据具体的芯片型号和引脚配置进行适当的调整。确保正确添加所需的头文件和初始化系统时钟。 希望这对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值