请高手给点建议,想用在CPLD中做一路PWM输出(对速度没要求)。
我电路中PMW用完了,想用在CPLD(MAX7000)中做一路PWM输出(对速度没要求),想利用库中的锁储器、二位加法器和一些与门来搭一个,但了好多天。
想高手给点建议。 计数器 谢谢。
你是指用中断来做的吗?我也想过,开消太大了。
如果在CPLD中做我不知如何做一个可设定的计数器,求教? 用CPLD做PWM太耗费资源了,成本太高 我现在有的资源就是CPLD啊!在CPLD中做我不知如何做一个可设定的计数器,求教? MaxPlus里面有现成的啊,可预设初值的计数器 CPLD想做个PWM,最起码需要这些资源:
1、至少8个逻辑单元做计数器;
2、8个逻辑单元做比较寄存器;
3、8个逻辑单元做设置数据通道;
4、若干个逻辑单元做比较器
5、为了防止CPLD发生竞争冒险(亚稳态),还要使用同步逻辑。这些同步逻辑大约是上述逻辑单元的1.5-2倍(否则你的PWM输出肯定会有毛刺)
6、CPLD资源还不可能被全部利用,80%的利用率就不错了。
你想想,这样一个逻辑,要使用多大规模的CPLD?至少要MAX7128之类才可能实现。MAX7128比单片机贵多了。有这个代价,不如换一种单片机或者就用软件实现。你不是不在乎速度吗?软件实现起来便捷多了。 是吗? 谢谢。
我找一下。 谢谢 AA55!
请看4楼. 用程序编写
很简单的 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编辑过 谢谢ilan2003 小松工程 小松工程给出的例子是为了说明原理的,其实真正用在工程上,这代码要细化。
比如,计数器和比较器是通过时钟同时驱动的,就有可能因为延迟路径不同,有可能会在输出产生毛刺。应该在计数器处于稳定状态时候,再去比较,这就是同步逻辑的意思。
另外,没有输入数据锁存逻辑和写数据逻辑以及总线机制,在MAXPLUS上仿真无妨,但是真正下载到CPLD上,你如何与单片机接口?这还需要一大片逻辑单元来支持
所以我说,用CPLD来做PWM其实很不划算。 转一个
http://cache.amobbs.com/bbs_upload782111/files_4/armok0178386.jpg
频率为CLK/4096 唉。都没法说了
这个例子虽然有了4位同步逻辑,但是191和191之间还是异步的逻辑(但而且现上占用的逻辑单元一点儿也不少,只不过被封装了而已),但仍然没有输入锁存和总线控制逻辑(也没有他们和计数器、比较器之间的同步逻辑),并且存在CPLD设计上最忌讳的回馈逻辑。
难道大家真的就认为工程应用和做课堂实验一样简单?只要基本答案对了就不管它是不是严谨了? 请楼上的给出一个完整没有漏洞的例子
学习一下 学习一下?您是想学习吗?我看是不服气想犟两句吧。
我已经说过,上述两个方案都存在对行波计数进行比较译码时候的竞争冒险现象。这个基本问题都想不到,只能说明数字电子技术基础知识不够牢固。如果基础知识不牢固,就是我给你一个解决方案,能真正“学习”并领会吗?
还有,没有复位逻辑来确定初始状态,这个PWM怎么用?上电后自己先乱跑,一直等到单片机来设定吗?没有初始化的随机状态PWM如果用在工程上,要惹祸的。更何况方案根本没有单片机控制接口,从哪里下手控制?这些都是工程实际上要切实解决的,否则这个"PWM"根本就不能实用。 当然是学习了
我当时就说了,是“转一个”根本就不是我做的
只是很想学习一下 恩,我的代码确实属于原理的,仅仅说明还有一种解决方法的途径,那就是写verilog HDL代码,相对与图形输入方式实现起来要简单。
实际工程中应用要注意很多的细节的。在功能上,和可靠性上还需要不断的完善的,
具体看这里,在这里有很多资料的http://www.fpga.com.cn/ 多谢各位的热心,高手们能多多指教。
AA55 请教一下,在MaxPlus里现成的计数器下载到器件后会出现竞争吗? 现成的计数器要看选的哪一种。如果选用同步计数器还好一些,如果是异步计数器(也就是行波计数器),竞争冒险是难以避免的。
小松工程推荐的网站你最好去看看。那里反复提到如何避免亚稳态、竞争冒险的方法。另外,现在的PLD设计基本上都应该是同步的,异步设计很难避免上述问题。
用原理图方式搭建的PLD,比较容易出现上述问题。因为同步设计比较耗费资源(当然也能带来一堆好处),所以用原理图方式设计比较麻烦,为了简化设计,很多人就放弃了同步。 顶!好贴! 好贴! 好贴! 用MAX ii 一个累加器+比较器就行
分辨率可以做到2^32甚至更高
页:
[1]