搜索
bottom↓
回复: 29

CPLD就是快!

[复制链接]

出0入0汤圆

发表于 2010-12-21 21:28:21 | 显示全部楼层 |阅读模式
使用CPLD做RGB近似灰度值的计算,Y=0.3125R+0.5625G+0.125B,使用EPM1270T144C5进行模拟,转化运算时间为17.655nS。

对了有什么工具能把.bdf文件(原理图)转化为.v或.vhd文件的吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2010-12-21 22:03:50 | 显示全部楼层
找到方法了:“http://bbs.eetop.cn/thread-108914-1-1.html”

出0入0汤圆

发表于 2010-12-21 22:07:11 | 显示全部楼层
呵呵,转换只是例化文件。

出0入0汤圆

 楼主| 发表于 2010-12-21 22:17:39 | 显示全部楼层
奇怪的是我用转化后的verilog文件进行编译,LE由原来的58降到了55,时间由原来的17.655nS增加到了19.574nS

出0入0汤圆

发表于 2010-12-21 22:24:32 | 显示全部楼层
因为过了综合

出0入0汤圆

 楼主| 发表于 2010-12-21 23:51:38 | 显示全部楼层
我发现同一个verilog文件,语句的顺序对使用的LE数量及时间都有影响

出0入0汤圆

发表于 2010-12-22 00:19:22 | 显示全部楼层
0.3125=5/16=5>>4

0.5625=9/16=9>>4

0.125=1/8=1>>3=2>>4

都是2的倍数啊

出0入0汤圆

 楼主| 发表于 2010-12-22 00:30:10 | 显示全部楼层
回复【6楼】hsztc
0.3125=5/16=5>>4
0.5625=9/16=9>>4
0.125=1/8=1>>3=2>>4
都是2的倍数啊
-----------------------------------------------------------------------

原本是:“Y=0.299*R+0.587*G+0.114*B”
作点改动都是为了提高速度和节省LE阿,美其名曰“优化”吧,呵呵

出0入0汤圆

发表于 2010-12-22 00:49:00 | 显示全部楼层
回复【6楼】hsztc  
0.3125=5/16=5>>4
0.5625=9/16=9>>4
0.125=1/8=1>>3=2>>4
都是2的倍数啊
-----------------------------------------------------------------------

非常好,谢谢!!

出0入0汤圆

发表于 2010-12-22 00:58:27 | 显示全部楼层
y=(unsigned char)(((unsigned int)((r*80u)+(g*144u)+(b*32u)))>>8);

优化的确实不错,用在单片机上也很快,在AVR上试只需要18个周期。





(0006) void main(void)
(0007) {
(0008)  unsigned char r,g,b;
(0009)  
(0010)  r=111; g=222; b=123;
_main:
  b                    --> R16
  g                    --> R20
  r                    --> R18
    0003C E62F      LDI        R18,0x6F
    0003D ED4E      LDI        R20,0xDE
    0003E E70B      LDI        R16,0x7B
(0011)  
(0012)  PORTB=(unsigned char)(((unsigned int)((r*80u)+(g*144u)+(b*32u)))>>8);
    0003F E980      LDI        R24,0x90
    00040 9F84      MUL        R24,R20
    00041 0110      MOVW        R2,R0
    00042 E580      LDI        R24,0x50
    00043 9F82      MUL        R24,R18
    00044 0120      MOVW        R4,R0
    00045 0C42      ADD        R4,R2
    00046 1C53      ADC        R5,R3
    00047 E280      LDI        R24,0x20
    00048 9F80      MUL        R24,R16
    00049 0C40      ADD        R4,R0
    0004A 1C51      ADC        R5,R1
    0004B 2C45      MOV        R4,R5
    0004C 2455      CLR        R5
    0004D B845      OUT        0x05,R4
(0013)
(0014)  while(1);
FILE: <library>
    0004E CFFF      RJMP        0x004E
    0004F 9508      RET

出0入0汤圆

发表于 2010-12-22 01:21:06 | 显示全部楼层
// PORTB=(unsigned char)(((unsigned int)((r*80u)+(g*144u)+(b*32u)))>>8);
// Y=     0.299*R+            0.587*G+         0.114*B
// 77/256=0.30078125  150/256=0.5859375 29/256=0.11328125
PORTB=(unsigned char)(((unsigned int)((r*77u)+(g*150u)+(b*29u)))>>8);  //18T


速度一样,但更准。

出0入0汤圆

发表于 2010-12-22 08:05:43 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-12-22 09:29:37 | 显示全部楼层
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1758968&bbs_page_no=163&bbs_id=1000 让你的程序飞起来,这里有类似这个的优化  r g b 值都在0-255之间 最后查表搞定

出0入0汤圆

 楼主| 发表于 2010-12-22 09:54:00 | 显示全部楼层
回复【12楼】chinaye1
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1758968&bbs_page_no=163&bbs_id=1000 让你的程序飞起来,这里有类似这个的优化  r g b 值都在0-255之间 最后查表搞定
-----------------------------------------------------------------------

“让你的程序飞起来”最快的速度:0.5S/640/480=1.628uS=1628nS,速度是CPLD的1/92,实在不能算得上快。

即使是hsztc的方法,在20MHz的AVR中也只用了0.05uS*18=0.9uS也比他的快,还省了256*3=768字节表的空间。

出50入0汤圆

发表于 2010-12-22 11:47:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-22 12:15:18 | 显示全部楼层
CPLD还有一个优势就是可以并行做,例如同时输入计算N个点的灰度。
当然带SIMD指令的CPU例如Blackfin DSP等也可以。

出0入0汤圆

发表于 2010-12-24 11:07:20 | 显示全部楼层
这就是CPLD的优势!要不然怎么会有人用呢!

出0入0汤圆

发表于 2010-12-24 12:12:48 | 显示全部楼层
.bdf 多有对应文件 verilog,VHDL 等
.bdf 对应到与门,非门,这些在quartus多例化过了,所以你你能转出来


你在原理图放个里面带的74系列的东西,可以转出来

出0入0汤圆

发表于 2010-12-24 12:38:32 | 显示全部楼层
MCU跑的是软件,CPLD编程好后相当于硬件,二者没有可比性

出0入0汤圆

发表于 2010-12-24 13:00:23 | 显示全部楼层
【18楼】 shqila

是的,MCU执行每个周期都有固定的时间,而CPLD的时间只是门的廷时...

出0入0汤圆

发表于 2010-12-25 12:18:55 | 显示全部楼层
回复【楼主位】qianhng
-----------------------------------------------------------------------

请教一下在CPLD中如何做小数的加法和乘法的,大概是怎么写的?

还有就是这个计算公式在CPLD内部的计算时间是从哪里看的?

出0入0汤圆

 楼主| 发表于 2010-12-25 14:04:22 | 显示全部楼层
回复【20楼】tom_2_2
回复【楼主位】qianhng  
-----------------------------------------------------------------------
请教一下在cpld中如何做小数的加法和乘法的,大概是怎么写的?
还有就是这个计算公式在cpld内部的计算时间是从哪里看的?

-----------------------------------------------------------------------
浮点小数我没在CPLD试过呢,估计应该先把小数的阶码、符号和尾数分开(补上个位的1成为小数),乘法符号异或得积的符号,小数和小数相乘作为积的小数,阶码相加作为积的阶码,若小数大于2要阶码+1、小数右移,去掉个位的1转化为尾数合并阶码补上符号位;加法要先把阶码小的那个化为跟大的那个同样后(小数同时右移),再对小数进行计算。
不建议使用CPLD来做浮点小数运算,CPLD资源有限,还是用FPGA吧,记得FPGA很多带乘法器的,速度更快。

用CPLD计算灰度因为考虑成本因素,速度要快,所以用降低精度的方法来计算近似的灰度,R*0.3125=R*5/16=(R<<2+R)>>4,所以快,呵呵

“在cpld内部的计算时间”在编译时可以看到信息里看到,如前面的是:
Info: Longest tpd from source pin "R[0]" to destination pin "Y[7]" is 17.110 ns
        Info: 1: + IC(0.000 ns) + CELL(1.132 ns) = 1.132 ns; Loc. = PIN_61; Fanout = 1; PIN Node = 'R[0]'
        Info: 2: + IC(2.095 ns) + CELL(0.914 ns) = 4.141 ns; Loc. = LC_X10_Y4_N3; Fanout = 3; COMB Node = 'Rc1~1'
        Info: 3: + IC(0.720 ns) + CELL(0.200 ns) = 5.061 ns; Loc. = LC_X10_Y4_N1; Fanout = 2; COMB Node = 'Rc2~60'
        Info: 4: + IC(0.305 ns) + CELL(0.200 ns) = 5.566 ns; Loc. = LC_X10_Y4_N2; Fanout = 3; COMB Node = 'YR_ALTERA_SYNTHESIZED~1'
        Info: 5: + IC(0.732 ns) + CELL(0.200 ns) = 6.498 ns; Loc. = LC_X10_Y4_N9; Fanout = 2; COMB Node = 'BRc1~1'
        Info: 6: + IC(0.730 ns) + CELL(0.200 ns) = 7.428 ns; Loc. = LC_X10_Y4_N6; Fanout = 2; COMB Node = 'BRc2~1'
        Info: 7: + IC(1.248 ns) + CELL(0.511 ns) = 9.187 ns; Loc. = LC_X9_Y4_N5; Fanout = 3; COMB Node = 'YBR_ALTERA_SYNTHESIZED~3'
        Info: 8: + IC(2.004 ns) + CELL(0.511 ns) = 11.702 ns; Loc. = LC_X8_Y4_N0; Fanout = 2; COMB Node = 'Yc3~1'
        Info: 9: + IC(0.305 ns) + CELL(0.200 ns) = 12.207 ns; Loc. = LC_X8_Y4_N1; Fanout = 2; COMB Node = 'Yc4~1'
        Info: 10: + IC(0.305 ns) + CELL(0.200 ns) = 12.712 ns; Loc. = LC_X8_Y4_N2; Fanout = 2; COMB Node = 'Yc5~1'
        Info: 11: + IC(0.765 ns) + CELL(0.200 ns) = 13.677 ns; Loc. = LC_X8_Y4_N6; Fanout = 1; COMB Node = 'Yc6~1'
        Info: 12: + IC(0.305 ns) + CELL(0.200 ns) = 14.182 ns; Loc. = LC_X8_Y4_N7; Fanout = 1; COMB Node = 'Y_ALTERA_SYNTHESIZED~7'
        Info: 13: + IC(0.606 ns) + CELL(2.322 ns) = 17.110 ns; Loc. = PIN_53; Fanout = 0; PIN Node = 'Y[7]'
        Info: Total cell delay = 6.990 ns ( 40.85 % )
        Info: Total interconnect delay = 10.120 ns ( 59.15 % )

出0入0汤圆

发表于 2010-12-25 16:22:51 | 显示全部楼层
受教了

出0入0汤圆

发表于 2010-12-25 16:35:34 | 显示全部楼层
受教了

出0入0汤圆

发表于 2011-1-3 14:12:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-4 01:02:36 | 显示全部楼层
学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 15:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表