hspydf 发表于 2020-11-16 08:03:47

pwm子模块占用资源过大,求优化方法

module pwm_controller
(
    input         CLK,
    input         nRST,
        input FRE,
        inputDUTY,
        output   reg      PWM

);

reg counter1;
always @(posedge CLK or negedge nRST) begin
    if (!nRST)
      counter1 <= 24'd0;
    else if (counter1 < 100000000/FRE)      
      counter1 <= counter1 + 1;
    else
      counter1 <= 24'd0;
end

always @(posedge CLK or negedge nRST) begin
    if (!nRST)
      PWM <= 1'b0;
    else if (counter1 < 100000000/FRE/100*DUTY)      
      PWM<= 1'b1;
    else
      PWM <= 1'b0;

end

endmodule


主模块给pwm模块 传递频率和 占空比参数.可能是因为有乘除法的原因, 单个pwm就占用1k资源,求优化方法

wye11083 发表于 2020-11-16 08:46:29

把乘法去掉。

yuyu87 发表于 2020-11-16 08:57:17

你自己也猜出原因了啊?不用除法或将除法改成这样,能节省一点点 (100000000/100)/FRE*DUTY

aboutzhao 发表于 2020-11-16 16:46:56

用重装载值和总计数值替代频率和占空比,这样就没有物理上对应的乘和除。然后数学上自己再转换出来频率和占空比。

qinxg 发表于 2020-11-17 08:37:02

100000000/FRE/100*DUTY: 这个太离谱了呀.
做一个0--FRE的计数器给clk分频, 得到counter1的递增使能信号.
counter1递增到99就回到0,和DUTY比较输出PWM.

chenchaoting 发表于 2020-11-17 08:43:35

估计楼主要做动态可调的,那就外面加处理器

whatcanitbe 发表于 2020-11-17 11:05:04

按照单片机里面的定时器实现去做

一个计数寄存器
一个比较寄存器
一个周期寄存器

脉冲电平初始为低
当计数寄存器=比较寄存器,脉冲电平置高
当计数寄存器=周期寄存器,脉冲电平置低,计数器置零

abutter 发表于 2020-11-18 18:08:00

没有必要这样做,因为你的频率在设计的时候基本确定的,然后其实就是个计数器而已。
页: [1]
查看完整版本: pwm子模块占用资源过大,求优化方法