白丁 发表于 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);
计数值初值和计数过程都是错的
module CPLD5(CLK_150M,CS,RD,XA,XD,Aup,Adown,Bup,Bdown,Cup,Cdown,UD_counter,O1,O2,O3,o4,CLK1M,Cx);/*synthesis noprune*/
parameter cntini = 511;
input CLK_150M,CS,RD;
input[4:0] XA;
input[15:0] XD;
output[7:0] Aup,Adown,Bup,Bdown,Cup,Cdown;
output[10:0] UD_counter,Cx;
wire[10:0] CC;
output O1,O2,O3,o4;
output CLK1M;
UD_Cnt #(257) UDxx(CLK_150M,CC);
CPS_PWM CP1(CLK_150M,UD_counter);
endmodule
module CPS_PWM(CLK,Cx);/*synthesis noprune*/
input CLK;
output[10:0] Cx;
wire[10:0] C1,C2,C3;/*synthesis noprune*/
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);
endmodule
module UD_Cnt(CLK,UD_counter);/*synthesis noprune*/
parameter CNT_ini = 167,Dir_ini = 0;
input CLK;
output reg[10:0] UD_counter;
reg Dir;
initial
begin
UD_counter = CNT_ini;
Dir = Dir_ini;
end
always@ (posedge CLK)
begin
if(Dir == 0)
UD_counter = UD_counter + 1;
else
UD_counter = UD_counter - 1;
end
always@ (posedge CLK)
begin
if((UD_counter == 500)&(Dir == 0))
Dir = 1;
else if((UD_counter == 1)&(Dir == 1))
Dir = 0;
end
endmodule 复制代码