windows 发表于 2005-10-14 14:31:23

请高手给点建议,想用在CPLD中做一路PWM输出(对速度没要求)。

我电路中PMW用完了,想用在CPLD(MAX7000)中做一路PWM输出(对速度没要求),

想利用库中的锁储器、二位加法器和一些与门来搭一个,但了好多天。

想高手给点建议。

appleboy 发表于 2005-10-14 14:52:28

计数器

windows 发表于 2005-10-14 16:12:41

谢谢。

你是指用中断来做的吗?我也想过,开消太大了。

如果在CPLD中做我不知如何做一个可设定的计数器,求教?

AA55 发表于 2005-10-14 16:20:30

用CPLD做PWM太耗费资源了,成本太高

windows 发表于 2005-10-14 16:44:37

我现在有的资源就是CPLD啊!在CPLD中做我不知如何做一个可设定的计数器,求教?

lanmp 发表于 2005-10-14 16:52:32

MaxPlus里面有现成的啊,可预设初值的计数器

AA55 发表于 2005-10-14 17:09:41

CPLD想做个PWM,最起码需要这些资源:



1、至少8个逻辑单元做计数器;

2、8个逻辑单元做比较寄存器;

3、8个逻辑单元做设置数据通道;

4、若干个逻辑单元做比较器

5、为了防止CPLD发生竞争冒险(亚稳态),还要使用同步逻辑。这些同步逻辑大约是上述逻辑单元的1.5-2倍(否则你的PWM输出肯定会有毛刺)

6、CPLD资源还不可能被全部利用,80%的利用率就不错了。



你想想,这样一个逻辑,要使用多大规模的CPLD?至少要MAX7128之类才可能实现。MAX7128比单片机贵多了。有这个代价,不如换一种单片机或者就用软件实现。你不是不在乎速度吗?软件实现起来便捷多了。

windows 发表于 2005-10-14 17:10:36

是吗? 谢谢。

我找一下。

windows 发表于 2005-10-14 17:48:26

谢谢 AA55!



请看4楼.

ilan2003 发表于 2005-10-14 18:35:14

用程序编写

很简单的 verilog HDL代码



介绍:仅仅实现8bitPWM功能,没有别的功能,通过设置data数据可以设定占空比

频率是clk/255HZ;

pwmOut:是PWM输出引脚

cs:选通信号,低电平时把data的数据写到pwmreg寄存器中去

counter:相当于AVR中TCNT

pwmreg:相当于AVR中的OCR







从这里开始是代码:因为最近比较忙,代码写的很粗糙



module pwm(data,clk,pwmOut,cs);



input clk;                //主时钟信号;

input cs;

input data;



output pwmOut;

reg pwmOut;

reg pwmreg;

reg counter;



always @(posedge clk)

begin

if(!cs)

pwmreg=data;

end



always @(posedge clk)

begin

counter=counter+1;

if(counter>=pwmreg)

pwmOut=0;

else

pwmOut=1;       

end

endmodule   //代码结束





我用的是MAXPLUS 2,编译后的资源利用情况,显示使用了34个宏单元,显然,用这么的多积存器是

比较消耗CPLD资源的,如果在附加一些功能,比如设置分频数,多个PWM通道,选择位数更高的PWM

则需要更多的宏单元,说明一下EPM7128有128个宏单元,价格50元,非常耗电

如果PWM需要很多,到是可以选择EPM7064,因为多路PWM其实couter是公用的,data是公用的,



pwmreg的个数就是PWM的路数,估计7064能做5-6路PWM



** DEVICE SUMMARY **



Chip/                     Input   Output   Bidir         Shareable

POF       Device          Pins    Pins   Pins   LCsExpanders% Utilized



pwm       EPM7064SLC44-5   10       1      0      34      23          53 %



User Pins:               10       1      0



仿真结果:

http://cache.amobbs.com/bbs_upload782111/files_4/armok0178188.gif



http://cache.amobbs.com/bbs_upload782111/files_4/armok0178189.gif



http://cache.amobbs.com/bbs_upload782111/files_4/armok0178190.gif





-----此内容被ilan2003于2005-10-14,19:14:22编辑过


-----此内容被ilan2003于2005-10-14,19:19:55编辑过

windows 发表于 2005-10-15 08:51:31

谢谢ilan2003 小松工程

AA55 发表于 2005-10-15 09:42:56

小松工程给出的例子是为了说明原理的,其实真正用在工程上,这代码要细化。



比如,计数器和比较器是通过时钟同时驱动的,就有可能因为延迟路径不同,有可能会在输出产生毛刺。应该在计数器处于稳定状态时候,再去比较,这就是同步逻辑的意思。



另外,没有输入数据锁存逻辑和写数据逻辑以及总线机制,在MAXPLUS上仿真无妨,但是真正下载到CPLD上,你如何与单片机接口?这还需要一大片逻辑单元来支持



所以我说,用CPLD来做PWM其实很不划算。

tiancai_ 发表于 2005-10-15 21:58:30

转一个

http://cache.amobbs.com/bbs_upload782111/files_4/armok0178386.jpg

频率为CLK/4096

AA55 发表于 2005-10-15 22:11:52

唉。都没法说了



这个例子虽然有了4位同步逻辑,但是191和191之间还是异步的逻辑(但而且现上占用的逻辑单元一点儿也不少,只不过被封装了而已),但仍然没有输入锁存和总线控制逻辑(也没有他们和计数器、比较器之间的同步逻辑),并且存在CPLD设计上最忌讳的回馈逻辑。



难道大家真的就认为工程应用和做课堂实验一样简单?只要基本答案对了就不管它是不是严谨了?

tiancai_ 发表于 2005-10-16 02:06:12

请楼上的给出一个完整没有漏洞的例子



学习一下

AA55 发表于 2005-10-16 20:19:23

学习一下?您是想学习吗?我看是不服气想犟两句吧。



我已经说过,上述两个方案都存在对行波计数进行比较译码时候的竞争冒险现象。这个基本问题都想不到,只能说明数字电子技术基础知识不够牢固。如果基础知识不牢固,就是我给你一个解决方案,能真正“学习”并领会吗?



还有,没有复位逻辑来确定初始状态,这个PWM怎么用?上电后自己先乱跑,一直等到单片机来设定吗?没有初始化的随机状态PWM如果用在工程上,要惹祸的。更何况方案根本没有单片机控制接口,从哪里下手控制?这些都是工程实际上要切实解决的,否则这个"PWM"根本就不能实用。

tiancai_ 发表于 2005-10-16 22:31:14

当然是学习了



我当时就说了,是“转一个”根本就不是我做的



只是很想学习一下

ilan2003 发表于 2005-10-17 08:33:24

恩,我的代码确实属于原理的,仅仅说明还有一种解决方法的途径,那就是写verilog HDL代码,相对与图形输入方式实现起来要简单。



实际工程中应用要注意很多的细节的。在功能上,和可靠性上还需要不断的完善的,

具体看这里,在这里有很多资料的http://www.fpga.com.cn/

windows 发表于 2005-10-17 23:42:47

多谢各位的热心,高手们能多多指教。

AA55 请教一下,在MaxPlus里现成的计数器下载到器件后会出现竞争吗?

AA55 发表于 2005-10-18 07:58:15

现成的计数器要看选的哪一种。如果选用同步计数器还好一些,如果是异步计数器(也就是行波计数器),竞争冒险是难以避免的。



小松工程推荐的网站你最好去看看。那里反复提到如何避免亚稳态、竞争冒险的方法。另外,现在的PLD设计基本上都应该是同步的,异步设计很难避免上述问题。



用原理图方式搭建的PLD,比较容易出现上述问题。因为同步设计比较耗费资源(当然也能带来一堆好处),所以用原理图方式设计比较麻烦,为了简化设计,很多人就放弃了同步。

liuzhijun 发表于 2008-2-15 10:22:41

顶!好贴!

Chenxg 发表于 2008-4-8 14:14:04

好贴!

wohao02 发表于 2010-8-30 09:55:26

好贴!

yuhang 发表于 2010-8-30 10:40:11

用MAX ii 一个累加器+比较器就行

分辨率可以做到2^32甚至更高
页: [1]
查看完整版本: 请高手给点建议,想用在CPLD中做一路PWM输出(对速度没要求)。