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资源,求优化方法 把乘法去掉。 你自己也猜出原因了啊?不用除法或将除法改成这样,能节省一点点 (100000000/100)/FRE*DUTY 用重装载值和总计数值替代频率和占空比,这样就没有物理上对应的乘和除。然后数学上自己再转换出来频率和占空比。 100000000/FRE/100*DUTY: 这个太离谱了呀.
做一个0--FRE的计数器给clk分频, 得到counter1的递增使能信号.
counter1递增到99就回到0,和DUTY比较输出PWM. 估计楼主要做动态可调的,那就外面加处理器 按照单片机里面的定时器实现去做
一个计数寄存器
一个比较寄存器
一个周期寄存器
脉冲电平初始为低
当计数寄存器=比较寄存器,脉冲电平置高
当计数寄存器=周期寄存器,脉冲电平置低,计数器置零
没有必要这样做,因为你的频率在设计的时候基本确定的,然后其实就是个计数器而已。
页:
[1]