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

[复制链接]
 楼主| jlgcumt 发表于 2012-11-26 09:36 | 显示全部楼层 |阅读模式
本帖最后由 jlgcumt 于 2012-11-26 09:38 编辑

用了150个逻辑宏,怎么让程序小一点?
  1. //////////////////////////////////////////////////////////////////////////////////
  2. // /////////////////////////PWM 采样程序///////////////////////////////////////////
  3. // 采样周期数大于设定值N时,采样值为零////////////////////////////////////////////////
  4. // pwm_sample_p_dutycycle 高电平采样结果///////////////////////////////////////////
  5. // pwm_sample_n_dutycycle 低电平采样结果///////////////////////////////////////////
  6. // 程序存在问题,设定值N,根据测试结果,实测值跟N会有误差。/////////////////////////////
  7. /////////////////////////////////////////////////////////////////////////////////


  8. module PWMSample(clk_in,pwm_signal_in,pwm_sample_h_dutycycle,pwm_sample_dutycycle,rst);
  9. input  clk_in;                                            // 系统时钟输入
  10. input  pwm_signal_in;                                                        // 外部信号输入
  11. output [23:0] pwm_sample_h_dutycycle;                // 采样结果(正脉冲周期个数)
  12. output [23:0] pwm_sample_dutycycle;                // 采样结果(附脉冲周期个数)
  13. input  rst;                                                                                        // 复位信号

  14. parameter N=24'd130 ;     //  周期大于N时不再计数,计数器清零

  15. reg [23:0] pwm_sample_h_dutycycle_current;
  16. reg [23:0] pwm_sample_h_dutycycle_cnt;

  17. reg [23:0] pwm_sample_dutycycle_current;
  18. reg [23:0] pwm_sample_dutycycle_cnt;

  19. reg pwm_signal_in_tmp;

  20. reg h_flag;  //外部输入信号高电平大于设定值N时,清零 pwm_sample_p_dutycycle_current[15:0]和pwm_sample_n_dutycycle_current[15:0]
  21. reg c_flag;  //外部输入信号周期大于设定值N时,清零 pwm_sample_p_dutycycle_current[15:0]和pwm_sample_n_dutycycle_current[15:0]

  22. wire signal_h;
  23. wire signal_l;

  24. assign signal_h = (~pwm_signal_in) & pwm_signal_in_tmp;  // 信号从高变低脉冲产生信号
  25. assign signal_l = pwm_signal_in & (~pwm_signal_in_tmp);  // 信号从低变高脉冲产生信号

  26. assign pwm_sample_h_dutycycle[23:0] = pwm_sample_h_dutycycle_current[23:0];
  27. assign pwm_sample_dutycycle[23:0] = pwm_sample_dutycycle_current[23:0];

  28. always @(posedge clk_in or negedge rst)
  29. begin
  30.         if(!rst)
  31.                 pwm_signal_in_tmp <= 0;
  32.         else               
  33.                 pwm_signal_in_tmp <= pwm_signal_in;                // 用于产生边沿脉冲信号
  34. end

  35. // 周期计数
  36. always @(posedge clk_in or negedge rst)
  37. begin
  38.         if(!rst)
  39.                 begin                               
  40.                         pwm_sample_dutycycle_cnt[23:0] <= 24'h000000;
  41.                         c_flag <= 1'b0;
  42.                 end
  43.         else
  44.                 begin
  45.                         if(signal_l == 1'b1)                                                 //边沿脉冲信号
  46.                                 pwm_sample_dutycycle_cnt[23:0] <= 24'h000000;
  47.                         else
  48.                                 begin
  49.                                         if(pwm_sample_dutycycle_cnt[23:0] > N)
  50.                                                 c_flag <= 1'b1;
  51.                                         else
  52.                                                 begin
  53.                                                         c_flag <= 1'b0;
  54.                                                         pwm_sample_dutycycle_cnt[23:0] <= pwm_sample_dutycycle_cnt[23:0]+1;                                                       
  55.                                                 end                               
  56.                                 end
  57.                 end
  58. end

  59. // 周期计数赋值
  60. always @(posedge clk_in or negedge rst)
  61. begin
  62.         if(!rst)
  63.                 pwm_sample_dutycycle_current[23:0] <= 24'h000000;
  64.         else if(signal_l == 1'b1)
  65.                 pwm_sample_dutycycle_current[23:0] <= pwm_sample_dutycycle_cnt[23:0];
  66.         else if( (c_flag == 1) || (h_flag == 1) )
  67.                 begin
  68.                         pwm_sample_dutycycle_current[23:0] <= 24'h000000;
  69.                 end
  70. end

  71. // 高电平计数
  72. always @(posedge clk_in or negedge rst)
  73. begin
  74.         if(!rst)
  75.                 begin                               
  76.                         pwm_sample_h_dutycycle_cnt[23:0] <= 24'h000000;
  77.                         h_flag <= 1'b0;
  78.                 end
  79.         else
  80.                 begin                                                       
  81.                         if(signal_h == 1'b1)                                                    //边沿脉冲信号
  82.                                 begin                               
  83.                                         pwm_sample_h_dutycycle_cnt[23:0] <= 0;       
  84.                                 end
  85.                         else if(pwm_signal_in == 1'b1)
  86.                                 begin
  87.                                         if(pwm_sample_h_dutycycle_cnt[23:0]>N)
  88.                                                 begin
  89.                                                         h_flag <= 1'b1;                                       
  90.                                                 end
  91.                                         else
  92.                                                 begin
  93.                                                         pwm_sample_h_dutycycle_cnt[23:0] <= pwm_sample_h_dutycycle_cnt[23:0] + 1;
  94.                                                         h_flag <= 1'b0;
  95.                                                 end                                       
  96.                                 end                       
  97.                 end
  98. end

  99. // 高电平计数赋值
  100. always @(posedge clk_in or negedge rst)
  101. begin
  102.         if(!rst)
  103.                 begin
  104.                         pwm_sample_h_dutycycle_current[23:0] <= 24'h000000;       
  105.                 end
  106.         else if(signal_h == 1'b1)
  107.                 begin
  108.                         pwm_sample_h_dutycycle_current[23:0] <= pwm_sample_h_dutycycle_cnt[23:0];
  109.                 end
  110.         else if( (c_flag == 1) || (h_flag == 1) )         // 大于设定周期
  111.                 begin
  112.                         pwm_sample_h_dutycycle_current[23:0] <= 24'h000000;
  113.                 end
  114. end

  115. 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里面写的,资源不够!
tongfu 发表于 2012-11-27 10:53 | 显示全部楼层
GoldSunMonkey 发表于 2012-11-27 18:06 | 显示全部楼层
2# GoldSunMonkey
120个宏,关键是我在CPLD里面写的,资源不够!
jlgcumt 发表于 2012-11-27 09:49
避开乘除,如果不行,只能增加CPLD的资源。
不是什么都一定能放在小的CPLD里面的。
wzf105 发表于 2012-12-10 17:07 | 显示全部楼层
弱弱的问一下,用状态机会不会小些
GoldSunMonkey 发表于 2012-12-10 21:42 | 显示全部楼层
wzf105 发表于 2012-12-10 17:07
弱弱的问一下,用状态机会不会小些

不知道,问他的想法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

183

主题

733

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部