analog中对ADC的剪裁 4 min read AG32入门文档 目前的analog 样例中,支持3 个ADC(每个16 路)和2 个DAC,1 个比较器CMP(2 路)。该analog 在cpld 中编译后,总大小大概1.4K 个逻辑单元。如果用户需要更多的cpld 空间,并且只用了adc 通道,可以对analog 进行剪裁。 实测下来,如果只用1 个ADC,且只用6 路,剪裁后大概只占500 个逻辑单元。(详细的测试数据,请参考文末附录) 举例:剪裁为只有1 个ADC,只有6 路。剪裁方法:1. 在analog_ip.v 修改adc 个数:修改parameter PER_CNT = 6 为:parameter PER_CNT = 1从代码中可以看出,PER_CNT 原先为6,就是3 个adc + 2 个dac + 1 个cmp。如果只需要1 路ADC,则该值改为1 即可。改为1 后,后续的for 循环实例化adc/dac/cmp 时,将只实例化一个ADC。【实例化循环:for (i = 0; i < PER_CNT; i = i + 1)】修改后,再次编译时,会出错。对出错点进行修改:把assign ext_dma_DMACBREQ = dma_req[3:0] | (dma_req[4] << 2) 修改为:assign ext_dma_DMACBREQ = dma_req[0]原因是,修改后只有1 路,而不再是5 路。此时,直接点【编译】按钮编译时,由于缓存没有清除,仍然会有报错。这时可以重跑一次【tool】->【Tcl Scripts…】->弹出框中选af_quartus.tcl 再点下边【Run】。跑完后编译成功。可以看到逻辑单元变成588 个。2. 在analog_ip.v 修改adc 的channal 数:修改parameter SEQ_MAX = 16 为parameter SEQ_MAX = 6在代码中,SEQ_MAX 表示ADC 的最大通路数。修改完后,重新编译。成功后看到逻辑单元变成501 个。注意,这样裁剪后,在mcu 中就只能使用1 个ADC 的前6 个channal 了。裁剪出DAC 或CMP:方式同上。 需要修改的点,就是for 循环实例化时,按自己的需求产生出来ADC/DAC/CMP 即可。(裁剪后,不需要的代码可以注掉,减少编程时的干扰) 附录:ADC/DAC/CMP 各种情况下使用的逻辑单元数:空模板工程:219 //注:空模板工程为支撑mcu 运行的最简cpld 工程开ADC0 1 路:438 //指在空模板工程上只开一个ADC 的1 路开ADC0 6 路:515开ADC0 11 路:544开ADC0 16 路:584开ADC0+ADC1 各16 路:890开ADC0+ADC1+ADC2 各16 路:1184开ADC0+ADC1+ADC2+1 个DAC: 1306开ADC0+ADC1+ADC2+2 个DAC: 1322开ADC0+ADC1+ADC2+2 个DAC+1 个CMP: 1362开ADC0+ADC1+ADC2+2 个DAC+1 个CMP(开DMA):1404开ADC0(16 路)+1 个CMP:617开ADC0(7 路)+1 个CMP:528开ADC0(7 路)+1 个CMP(开DMA):536由以上结果大致可推出:1. 空模板工程需要219 个LE;2. ADC 占用资源不是线性增加的(开第一路是占用的比较多,约220 个LE,后边新增一路占用不多,约8 个LE);3. DAC 占用资源也不是线性增加的(开第一个占用122 个LE,开第二个占用16 个LE)4. CMP 占用逻辑单元大概40 个;组合不同,可能会有一些出入,但数量级应该就是这个数量级。 PREVIOUS ← AG32下fpga/cpld的使用入门 NEXT STEP analog代码分析 →