打印

我写了个采样的程序,但消耗资源过大,大伙帮忙看看

[复制链接]
1314|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jlgcumt|  楼主 | 2012-11-26 09:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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

相关帖子

沙发
GoldSunMonkey| | 2012-11-26 20:19 | 只看该作者
150个宏多么?

使用特权

评论回复
板凳
Backkom80| | 2012-11-27 08:06 | 只看该作者
1,150个单元确实不是很多,很小的一部分资源
2,24位的位宽是不是必需的,如不需要减小位宽

使用特权

评论回复
地板
jlgcumt|  楼主 | 2012-11-27 09:49 | 只看该作者
2# GoldSunMonkey
120个宏,关键是我在CPLD里面写的,资源不够!

使用特权

评论回复
5
tongfu| | 2012-11-27 10:53 | 只看该作者
:)

使用特权

评论回复
6
GoldSunMonkey| | 2012-11-27 18:06 | 只看该作者
2# GoldSunMonkey
120个宏,关键是我在CPLD里面写的,资源不够!
jlgcumt 发表于 2012-11-27 09:49
避开乘除,如果不行,只能增加CPLD的资源。
不是什么都一定能放在小的CPLD里面的。

使用特权

评论回复
7
wzf105| | 2012-12-10 17:07 | 只看该作者
弱弱的问一下,用状态机会不会小些

使用特权

评论回复
8
GoldSunMonkey| | 2012-12-10 21:42 | 只看该作者
wzf105 发表于 2012-12-10 17:07
弱弱的问一下,用状态机会不会小些

不知道,问他的想法。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:善攻者,动于九天之上,善守者,藏于九地之下!

183

主题

733

帖子

4

粉丝