本帖最后由 jlgcumt 于 2012-11-26 09:38 编辑
用了150个逻辑宏,怎么让程序小一点?//////////////////////////////////////////////////////////////////////////////////
// /////////////////////////PWM 采样程序///////////////////////////////////////////
// 采样周期数大于设定值N时,采样值为零////////////////////////////////////////////////
// pwm_sample_p_dutycycle 高电平采样结果///////////////////////////////////////////
// pwm_sample_n_dutycycle 低电平采样结果///////////////////////////////////////////
// 程序存在问题,设定值N,根据测试结果,实测值跟N会有误差。/////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
module PWMSample(clk_in,pwm_signal_in,pwm_sample_h_dutycycle,pwm_sample_dutycycle,rst);
input clk_in; // 系统时钟输入
input pwm_signal_in; // 外部信号输入
output [23:0] pwm_sample_h_dutycycle; // 采样结果(正脉冲周期个数)
output [23:0] pwm_sample_dutycycle; // 采样结果(附脉冲周期个数)
input rst; // 复位信号
parameter N=24'd130 ; // 周期大于N时不再计数,计数器清零
reg [23:0] pwm_sample_h_dutycycle_current;
reg [23:0] pwm_sample_h_dutycycle_cnt;
reg [23:0] pwm_sample_dutycycle_current;
reg [23:0] pwm_sample_dutycycle_cnt;
reg pwm_signal_in_tmp;
reg h_flag; //外部输入信号高电平大于设定值N时,清零 pwm_sample_p_dutycycle_current[15:0]和pwm_sample_n_dutycycle_current[15:0]
reg c_flag; //外部输入信号周期大于设定值N时,清零 pwm_sample_p_dutycycle_current[15:0]和pwm_sample_n_dutycycle_current[15:0]
wire signal_h;
wire signal_l;
assign signal_h = (~pwm_signal_in) & pwm_signal_in_tmp; // 信号从高变低脉冲产生信号
assign signal_l = pwm_signal_in & (~pwm_signal_in_tmp); // 信号从低变高脉冲产生信号
assign pwm_sample_h_dutycycle[23:0] = pwm_sample_h_dutycycle_current[23:0];
assign pwm_sample_dutycycle[23:0] = pwm_sample_dutycycle_current[23:0];
always @(posedge clk_in or negedge rst)
begin
if(!rst)
pwm_signal_in_tmp <= 0;
else
pwm_signal_in_tmp <= pwm_signal_in; // 用于产生边沿脉冲信号
end
// 周期计数
always @(posedge clk_in or negedge rst)
begin
if(!rst)
begin
pwm_sample_dutycycle_cnt[23:0] <= 24'h000000;
c_flag <= 1'b0;
end
else
begin
if(signal_l == 1'b1) //边沿脉冲信号
pwm_sample_dutycycle_cnt[23:0] <= 24'h000000;
else
begin
if(pwm_sample_dutycycle_cnt[23:0] > N)
c_flag <= 1'b1;
else
begin
c_flag <= 1'b0;
pwm_sample_dutycycle_cnt[23:0] <= pwm_sample_dutycycle_cnt[23:0]+1;
end
end
end
end
// 周期计数赋值
always @(posedge clk_in or negedge rst)
begin
if(!rst)
pwm_sample_dutycycle_current[23:0] <= 24'h000000;
else if(signal_l == 1'b1)
pwm_sample_dutycycle_current[23:0] <= pwm_sample_dutycycle_cnt[23:0];
else if( (c_flag == 1) || (h_flag == 1) )
begin
pwm_sample_dutycycle_current[23:0] <= 24'h000000;
end
end
// 高电平计数
always @(posedge clk_in or negedge rst)
begin
if(!rst)
begin
pwm_sample_h_dutycycle_cnt[23:0] <= 24'h000000;
h_flag <= 1'b0;
end
else
begin
if(signal_h == 1'b1) //边沿脉冲信号
begin
pwm_sample_h_dutycycle_cnt[23:0] <= 0;
end
else if(pwm_signal_in == 1'b1)
begin
if(pwm_sample_h_dutycycle_cnt[23:0]>N)
begin
h_flag <= 1'b1;
end
else
begin
pwm_sample_h_dutycycle_cnt[23:0] <= pwm_sample_h_dutycycle_cnt[23:0] + 1;
h_flag <= 1'b0;
end
end
end
end
// 高电平计数赋值
always @(posedge clk_in or negedge rst)
begin
if(!rst)
begin
pwm_sample_h_dutycycle_current[23:0] <= 24'h000000;
end
else if(signal_h == 1'b1)
begin
pwm_sample_h_dutycycle_current[23:0] <= pwm_sample_h_dutycycle_cnt[23:0];
end
else if( (c_flag == 1) || (h_flag == 1) ) // 大于设定周期
begin
pwm_sample_h_dutycycle_current[23:0] <= 24'h000000;
end
end
endmodule
|