////////////////////////////////////////////////////////////////////////////////// // /////////////////////////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
举报
2# GoldSunMonkey 120个宏,关键是我在CPLD里面写的,资源不够! jlgcumt 发表于 2012-11-27 09:49
wzf105 发表于 2012-12-10 17:07 弱弱的问一下,用状态机会不会小些
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
等级类勋章
发帖类勋章
时间类勋章
人才类勋章
183
733
4
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号