3698|10

172

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

VERILOG 模块调用问题 [复制链接]

 定义了一个计数器模块module UD_Cnt(CLK,UD_counter);(第94行),里面有两个parameter用于计数初值和计数方向的初始化。
但是我发现在主模块CPLD4里面调用该模块(第16行),和在另外一个模块(CPS_PWM)里面用同样的指令(第53行)调用得到的结果不一样。在主模块中计数器的初值是对的,但是仿真结果里面在CPSPWM里面的初值不对,而且计数值也不对,如图所示



  1. module CPLD4(CLK_150M,CS,RD,XA,XD,Aup,Adown,Bup,Bdown,Cup,Cdown,UD_counter,O1,O2,O3,o4,CLK1M,Cx);/*synthesis noprune*/
  2.         parameter cntini = 511;
  3.         input CLK_150M,CS,RD;
  4.         input[4:0]  XA;
  5.         input[15:0] XD;
  6.         output[7:0] Aup,Adown,Bup,Bdown,Cup,Cdown;
  7.       
  8.         output[10:0] UD_counter,Cx;
  9.         output O1,O2,O3,o4;
  10.       
  11.         output CLK1M;
  12.       
  13.         CLK150_to_1 DIV1(CLK_150M,CLK1M,1);
  14.       
  15.         UD_Cnt #(cntini/2) UD1(CLK_150M,UD_counter);
  16.            UD_Cnt #(250  ) UDxx(CLK_150M,Cx);
  17.         CPS_PWM CP1(CLK_150M,100,300,500,Aup,Adown,Bup,Bdown,Cup,Cdown,1);
  18. endmodule

  19. module CLK150_to_1(CLK150M,CLK1M,RST);
  20.         input CLK150M,RST;
  21.         output CLK1M;
  22.         reg[7:0] div_cnt;
  23.       
  24.         initial
  25.                 div_cnt = 0;
  26.       
  27.         always@(posedge CLK150M)
  28.         begin
  29.                 if(div_cnt < 150)
  30.                         div_cnt = div_cnt+1;
  31.                 else
  32.                         div_cnt = 0;
  33.         end
  34.       
  35.         assign
  36.                 CLK1M = (div_cnt > 74)? 1:0;

  37. endmodule

  38. module CPS_PWM(CLK,UrefA,UrefB,UrefC,PWM_UoA,PWM_DoA,PWM_UoB,PWM_DoB,PWM_UoC,PWM_DoC,BLOCK);
  39.         parameter counter_limit = 500;
  40.       
  41.         input CLK,BLOCK;
  42.         input[10:0] UrefA,UrefB,UrefC;
  43.         output[7:0] PWM_UoA,PWM_DoA,PWM_UoB,PWM_DoB,PWM_UoC,PWM_DoC;
  44.       
  45.         wire[7:0] PWM_UA,PWM_DA,PWM_UB,PWM_DB,PWM_UC,PWM_DC;
  46.         wire[10:0] C0[7:0];
  47.         wire[10:0] Cx;
  48. /////////////////////////////////////////////////////////////
  49.    UD_Cnt #(250  ) UD1(CLK,C0[0]);
  50.            UD_Cnt #(250  ) UDx(CLK,Cx);
  51.    UD_Cnt #(0                  ,0) UD2(CLK,C0[1]);
  52.    UD_Cnt #((500/2)  ) UD3(CLK,C0[2]);
  53.    UD_Cnt #(500      ) UD4(CLK,C0[3]);
  54.    
  55.    UD_Cnt #((500/4)  ) UD5(CLK,C0[4]);
  56.    UD_Cnt #((500/4)  ) UD6(CLK,C0[5]);
  57.    UD_Cnt #((500*3/4)) UD7(CLK,C0[6]);
  58.    UD_Cnt #((500*3/4)) UD8(CLK,C0[7]);
  59. ////////////////////////////////////////////////////////////
  60.         genvar j;
  61.         generate
  62.                 for(j=0; j<4; j=j+1) begin:x
  63.                 assign
  64.                         PWM_UA[2*j] = (UrefA > C0[j]) ? 1'b1:1'b0,        PWM_UA[2*j+1] = !PWM_UA[2*j],
  65.                         PWM_DA[2*j] = (UrefA > C0[j+4]) ? 1'b1:1'b0,        PWM_DA[2*j+1] = !PWM_DA[2*j],
  66.                        
  67.                         PWM_UB[2*j] = (UrefB > C0[j]) ? 1'b1:1'b0,        PWM_UB[2*j+1] = !PWM_UB[2*j],
  68.                         PWM_DB[2*j] = (UrefB > C0[j+4]) ? 1'b1:1'b0,        PWM_DB[2*j+1] = !PWM_DB[2*j],
  69.                        
  70.                         PWM_UC[2*j] = (UrefC > C0[j]) ? 1'b1:1'b0,        PWM_UC[2*j+1] = !PWM_UC[2*j],
  71.                         PWM_DC[2*j] = (UrefC > C0[j+4]) ? 1'b1:1'b0,        PWM_DC[2*j+1] = !PWM_DC[2*j];
  72.                 end
  73.         endgenerate
  74. ///////////////////////////////////////////////////////////
  75.         genvar f;
  76.         generate
  77.                 for(f=0; f<8; f=f+1) begin:DT
  78.                         delay_DT DT_UA(PWM_UA[f],CLK,BLOCK,PWM_UoA[f]);
  79.                         delay_DT DT_DA(PWM_DA[f],CLK,BLOCK,PWM_DoA[f]);
  80.                        
  81.                         delay_DT DT_UB(PWM_UB[f],CLK,BLOCK,PWM_UoB[f]);
  82.                         delay_DT DT_DB(PWM_DB[f],CLK,BLOCK,PWM_DoB[f]);
  83.                        
  84.                         delay_DT DT_UC(PWM_UC[f],CLK,BLOCK,PWM_UoC[f]);
  85.                         delay_DT DT_DC(PWM_DC[f],CLK,BLOCK,PWM_DoC[f]);
  86.                 end
  87.         endgenerate

  88. endmodule

  89. module UD_Cnt(CLK,UD_counter);
  90. parameter CNT_ini = 167,Dir_ini = 0;
  91.         input CLK;
  92.         output reg[10:0] UD_counter;
  93.         reg Dir;
  94.       
  95.         initial
  96.         begin
  97.                 UD_counter = CNT_ini;
  98.                 Dir = Dir_ini;
  99.         end
  100.         always@ (posedge CLK)
  101.    begin
  102.                 if(Dir == 0)
  103.                         UD_counter = UD_counter + 1;
  104.                 else
  105.                         UD_counter = UD_counter - 1;
  106.    end
  107.       
  108.         always@ (posedge CLK)
  109.         begin
  110.                 if((UD_counter == 500)&(Dir == 0))
  111.                         Dir = 1;
  112.                 else if((UD_counter == 1)&(Dir == 1))
  113.                         Dir = 0;
  114.         end
  115. endmodule

  116. module delay_DT(pluse,CLK,Block,pluse_out);
  117. //1us delay(counter = 10) for posedge of pluse,Block=0(Block the IGBT)
  118.         parameter CMP = 10;

  119.         input CLK,pluse,Block;
  120.         output pluse_out;
  121.         reg[4:0] DT_counter;
  122.         wire DT;
  123.         initial
  124.                 DT_counter = 0;

  125.         always@ (posedge CLK)
  126.         begin
  127.                 if((pluse == 1) & (DT_counter < 5'd20))
  128.                         DT_counter = DT_counter + 1;
  129.                 else if(pluse == 0) //no operation on counter when pluse ==1 and counter=255
  130.                         DT_counter = 0;
  131.         end
  132.         assign
  133.                 DT = (DT_counter >= CMP) ? 1:0,
  134.                 pluse_out = pluse & DT & Block;
  135. endmodule
复制代码
此帖出自Altera SoC论坛

最新回复

你这不可综合啊?就是仿真用的啊  详情 回复 发表于 2017-6-26 21:31
点赞 关注
 
 

回复
举报

172

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
红色的初值和计数过程是对的,绿色的是错的,而且也没有规律

此帖出自Altera SoC论坛
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
别用initial,用RST赋初值
此帖出自Altera SoC论坛

点评

RST可以用parameter赋值吗  详情 回复 发表于 2017-6-26 16:02
 
 
 

回复

1173

帖子

3

TA的资源

五彩晶圆(初级)

4
 
不懂,帮挺
此帖出自Altera SoC论坛
 
 
 

回复

172

帖子

0

TA的资源

一粒金砂(中级)

5
 
cncqzxj 发表于 2017-6-26 13:39
别用initial,用RST赋初值

RST可以用parameter赋值吗
此帖出自Altera SoC论坛
 
 
 

回复

172

帖子

0

TA的资源

一粒金砂(中级)

6
 
 
 
 

回复

6423

帖子

17

TA的资源

版主

7
 
你这是写的啥代码,看起来这么费劲
此帖出自Altera SoC论坛

点评

我用modelsim仿真出来的结果是对的,是不是quartus里面有些地方需要设置?  详情 回复 发表于 2017-6-26 21:25
我把程序简化一下吧 UD_Cnt是一个计数器,采用增减计数的计数方式 CPS_PWM是一个多路PWM模块,里面含4路计数器,准备作为载波与PWM的调制波进行比较,但是这个模块最后我只要输出PWM就可以了,计数器的值不需要输  详情 回复 发表于 2017-6-26 20:42
个人签名training
 
 
 

回复

172

帖子

0

TA的资源

一粒金砂(中级)

8
 
白丁 发表于 2017-6-26 20:11
你这是写的啥代码,看起来这么费劲

我把程序简化一下吧
UD_Cnt是一个计数器,采用增减计数的计数方式
CPS_PWM是一个多路PWM模块,里面含4路计数器,准备作为载波与PWM的调制波进行比较,但是这个模块最后我只要输出PWM就可以了,计数器的值不需要输出

我发现,CPS_PWM中,UD_Cnt #(259) UDxx(CLK,Cx);这个计数器的技术值是对的,同时Cx是输出变量
而只与wire变量连接的
UD_Cnt #(259) UDxx(CLK,Cx);
UD_Cnt #(0,0) UD2(CLK,C1);
   UD_Cnt #((500/2),1) UD3(CLK,C2);
   UD_Cnt #(500,0) UD4(CLK,C3);
计数值初值和计数过程都是错的

  1. module CPLD5(CLK_150M,CS,RD,XA,XD,Aup,Adown,Bup,Bdown,Cup,Cdown,UD_counter,O1,O2,O3,o4,CLK1M,Cx);/*synthesis noprune*/
  2.         parameter cntini = 511;
  3.         input CLK_150M,CS,RD;
  4.         input[4:0]  XA;
  5.          input[15:0] XD;
  6.         output[7:0] Aup,Adown,Bup,Bdown,Cup,Cdown;
  7.         
  8.         output[10:0] UD_counter,Cx;
  9.         wire[10:0] CC;
  10.         output O1,O2,O3,o4;
  11.         output CLK1M;
  12.         
  13.         UD_Cnt #(257) UDxx(CLK_150M,CC);
  14.         CPS_PWM CP1(CLK_150M,UD_counter);
  15. endmodule

  16. module CPS_PWM(CLK,Cx);/*synthesis noprune*/
  17.         input CLK;
  18.         output[10:0] Cx;
  19.         wire[10:0] C1,C2,C3;/*synthesis noprune*/
  20.         
  21.         UD_Cnt #(259) UDxx(CLK,Cx);
  22.         
  23.         UD_Cnt #(0,0) UD2(CLK,C1);
  24.    UD_Cnt #((500/2),1) UD3(CLK,C2);
  25.    UD_Cnt #(500,0) UD4(CLK,C3);
  26.         
  27. endmodule

  28. module UD_Cnt(CLK,UD_counter);/*synthesis noprune*/
  29. parameter CNT_ini = 167,Dir_ini = 0;
  30.         input CLK;
  31.         output reg[10:0] UD_counter;
  32.         reg Dir;
  33.         
  34.         initial
  35.         begin
  36.                 UD_counter = CNT_ini;
  37.                 Dir = Dir_ini;
  38.         end
  39.         always@ (posedge CLK)
  40.    begin
  41.                 if(Dir == 0)
  42.                         UD_counter = UD_counter + 1;
  43.                 else
  44.                         UD_counter = UD_counter - 1;
  45.    end
  46.         
  47.         always@ (posedge CLK)
  48.         begin
  49.                 if((UD_counter == 500)&(Dir == 0))
  50.                         Dir = 1;
  51.                 else if((UD_counter == 1)&(Dir == 1))
  52.                         Dir = 0;
  53.         end
  54. endmodule
复制代码


此帖出自Altera SoC论坛
 
 
 

回复

172

帖子

0

TA的资源

一粒金砂(中级)

9
 
白丁 发表于 2017-6-26 20:11
你这是写的啥代码,看起来这么费劲

我用modelsim仿真出来的结果是对的,是不是quartus里面有些地方需要设置?
此帖出自Altera SoC论坛

点评

你这不可综合啊?就是仿真用的啊  详情 回复 发表于 2017-6-26 21:31
 
 
 

回复

6423

帖子

17

TA的资源

版主

10
 
jetlin1992 发表于 2017-6-26 21:25
我用modelsim仿真出来的结果是对的,是不是quartus里面有些地方需要设置?

你这不可综合啊?就是仿真用的啊
此帖出自Altera SoC论坛

点评

可以综合的,quartus编译综合都通过了。就是综合完了以后,用他集成的仿真结果,与modelsim对比不一样  详情 回复 发表于 2017-6-26 21:48
个人签名training
 
 
 

回复

172

帖子

0

TA的资源

一粒金砂(中级)

11
 
白丁 发表于 2017-6-26 21:31
你这不可综合啊?就是仿真用的啊

可以综合的,quartus编译综合都通过了。就是综合完了以后,用他集成的仿真结果,与modelsim对比不一样
此帖出自Altera SoC论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表