想找个每秒完成5M次三组10位数据比较的简单方案
如题,每秒要完成5M次三组数据比较,STM32F407时钟168MHz,只能完成1M次每秒,想找个简单切便宜的方案,CPLD能写个简单的程序,但是要CPLD+CPU,多一个芯片,年纪大了,也学不了太多的东西了,FPGA没接触过,好像比较贵,大伙给个简单的方案 看看你的代码,看是否可以优化一下. 说说用途吧,没准有节省的方案 可能你的代码有问题。 168MHZ/1M SPS /3= 56 (Instruction ).一般比较操作仅需6条指令,双操作数指针操作算12条,分支指令算2条。还有富裕 本帖最后由 xch 于 2023-5-17 11:48 编辑如果要实现5M SPS*3 数据比较,用 168mhz MCU平均每个数据比较用11条指令可能累死MCU。
我实测M4代码,打开编译速度优化选项,检查MCU实际运行代码,发现一次比较操作含分支用 6条指令。
1、优化程序,或者用汇编。
2、用硬件比较器,相当于 CPLD 。
3、深入研究应用场景,变通一下,降低 5M 这个指标。
读, 读, 取10bit, 取10bit, 比较, 写回. 一组至少6条指令. 三组算20条, *5M, 那就是100Mhz,你可以选f7之类更高频的单片机 现在已经是2023年了,用不着谈FPGA就变色了。
去年年底,我做了一个FPGA项目,以前从来没有用过CPLD和FPGA,刚开始买了一本VHDL的书,和一个开发板,用了一个星期肯完书,感觉挺简单就开始干了,又用了两个星期,项目就做完了,感觉还是挺简单的。
项目是通讯相关的,多个SERDES,涉及到随路时钟恢复,8B10B编解码,CRC校验,数据缓存,不同时钟域,UART通讯等。
涉及到的算法倒是不多,也没有FFT啥的。
当时FPGA选型本来想从 Altera 和 xilinx , lattice, actel, 里面选,CPLD和FPGA的开发板都买好了,每个都大几千。后来发现,太复杂,用不上。(到现在那几个开发板的包装都没拆呢)
后来发现了国产的FPGA也不错,从论坛上看见有介绍 高云(GoWin) 的FPGA的,那个小蜜蜂系列,
内部资源不多,但是简单应用足够了,另外,内置 FlashROM,不需要外部配置芯片了,简单。
像我们用的 GW1N-LV4QN48 芯片,
内部有4608个LUT和2个PLL,支持硬件LVDS输入输出,做一般的通讯应用也够用了。
芯片也挺便宜,零售价30几块,批量价格20几块钱。
实际上,花钱的大头是他的那个下载器,要200多块钱,网上有卖兼容的下载器的,50多块,但是似乎有些芯片的功能不支持,比如似乎不支持下载到内部FlashROM里。
经过这个项目,我感觉,这个FPGA开发的难度,其实基本上和单片机开发也就差不多了。
高云的开发软件,里面自带了很多例程和IP核,可以拿来直接用,
但是很多IP核他是加密的,看不见源码,想修改点东西也改不了,
气不过,索性自己做,所以项目里连UART这些都是自己做的。
当然,也可能我是有一定的基础所以才比较快,
就比如说这个UART,虽然从来没用FPGA实现过,但是我自己用数字电路搭过,也算有一定的经验了吧。 本帖最后由 rzxhjd 于 2023-5-17 19:18 编辑
xch 发表于 2023-5-17 11:43
如果要实现5M SPS*3 数据比较,用 168mhz MCU平均每个数据比较用11条指令可能累死MCU。
我实测M4代码,打 ...
兄弟,我50了,不想学新东西了,能简单一些简单一些。
是这样,我原计划每秒中断5M次,降低一些,甚至一半也行。
麻烦你估算一下,最高中断响应频率,我再研究研究
C与汇编混合编程,AVR和51用过,STM32没用过,如果可行我看研究一下,不过大脑迟钝了,如果太难的话要不行了。
每次中断,数据A(10位数据)+1,超最大值归零,用switch 分 6段,每一段程序差不多,每一段程序就是分别取三个端口的10位数据与三个表格的对应的序号为上面数据A的三个10位数据比较大小,根据比较结果对端口位操作,完成中断
麻烦你估算一下,每次相应中断,汇编的话需要多少时钟?
STM32汇编,每个指令需要多少时钟我没查,麻烦你粗略估算一下,
最开始用的AVR+CPLD,水平有限,没调试通过,换了407,结果速度有些慢,看看用汇编或许行
谢谢啊
icecut 发表于 2023-5-17 11:58
读, 读, 取10bit, 取10bit, 比较, 写回. 一组至少6条指令. 三组算20条, *5M, 那就是100Mhz,你可以选f7之 ...
兄弟,照你这么说,每秒5M次还有68MHz空闲,那行啊,其他事情占用时间很少,汇编能实现这么快? rzxhjd 发表于 2023-5-17 18:52
兄弟,照你这么说,每秒5M次还有68MHz空闲,那行啊,其他事情占用时间很少,汇编能实现这么快? ...
你完全可以嵌入汇编试一下啊. 你如果用循环的话, 要考虑循环展开. 否则循环也有时间损耗, 计数器就好几条指令.68M也不一定够用啊. rzxhjd 发表于 2023-5-17 18:35
兄弟,我50了,不想学新东西了,能简单一些简单一些。
是这样,我原计划每秒中断5M次,降低一些,甚至一半 ...
如果是中断服务·就拉倒吧。只能靠DMA请求处理数据。 rzxhjd 发表于 2023-5-17 18:35
兄弟,我50了,不想学新东西了,能简单一些简单一些。
是这样,我原计划每秒中断5M次,降低一些,甚至一半 ...
看你的介绍,这5M信号应当用计数器6分频,然后中断。 本帖最后由 rzxhjd 于 2023-5-17 21:20 编辑
xch 发表于 2023-5-17 21:03
看你的介绍,这5M信号应当用计数器6分频,然后中断。
就是计数器时钟84MHz,16分频,产生中断,搭车问一下,中断响应和返回用几个时钟?不行就算了,我已经把它暂时搁置一边了,除非简单,花时间少,否则先暂时放一下,
计数器21分频,中断频率4M也行
rzxhjd 发表于 2023-5-17 21:12
就是计数器时钟84MHz,16分频,产生中断,搭车问一下,中断响应和返回用几个时钟?不行就算了,我已经把它 ...
void TIM1_CC_IRQHandler(void)
{
volatile static uint32_t s=0;
/* USER CODE BEGIN TIM1_CC_IRQn 0 */
TIM1->SR =0;;
s = TIM1->CNT;
if(gDelay10us)
{
gDelay10us--;
}
asm("nop");
/* USER CODE END TIM1_CC_IRQn 0 */
//HAL_TIM_IRQHandler(&htim1);
/* USER CODE BEGIN TIM1_CC_IRQn 1 */
/* USER CODE END TIM1_CC_IRQn 1 */
}
实测这样一个中断服务程序花了46个机器周期。168MHZ/46 =3.6MHZ.5MHZ 没戏。MCU 估计得找个200MHZ的才能响应5MHZ 中断。 xch 发表于 2023-5-17 21:41
void TIM1_CC_IRQHandler(void)
{
volatile static uint32_t s=0;
谢谢老弟,那我放放吧,等我有功夫用AVR和CPLD吧,AVR比32熟 中断,涉及到了入栈出栈等,至少20个周期以上。这种可以想办法把数据放到DMA中去读取吗?CPU只做比较处理。 其实有几个地方不太清楚,这1秒内是单纯只是比较的时间,还是包括了数据的读取、保存以及if之类的逻辑判断,还有就是数据类型是整形还是浮点
如果单纯只是比较的时间,可以尝试手动展开循环,比如原来程序里是一个5M次的for循环,内部就做了一次比较,改成内部连续做4次比较,循环次数改为5M/4,for循环的条件部分是非常消耗时间的,或者改成while循环再展开也行,同时整个工程开最高等级优化
如果是包含了读取保存和各种逻辑判断,那么可能要考虑优化下这部分的整体代码逻辑了,比如用环形缓冲区一边读一边做比较,还得考虑数据的读取速度是否达标,毕竟读取速度不行的话处理逻辑再怎么优化也没啥用 这个问题引起我的一个观点,就是国内的电子工程师基本上都是瘸子,他们的拐杖就是单片机?楼主的问题是一般大学生都会的电路设计就可以解决的问题。 原始需求不涉密不妨拿出来讨论一下,总觉得这么搞不是很合常规逻辑。
页:
[1]
2