打印
[MCU]

想找个每秒完成5M次三组10位数据比较的简单方案

[复制链接]
1045|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rzxhjd|  楼主 | 2023-5-16 23:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,每秒要完成5M次三组数据比较,STM32F407时钟168MHz,只能完成1M次每秒,想找个简单切便宜的方案,CPLD能写个简单的程序,但是要CPLD+CPU,多一个芯片,年纪大了,也学不了太多的东西了,FPGA没接触过,好像比较贵,大伙给个简单的方案

使用特权

评论回复
评论
xch 2023-5-17 15:38 回复TA
完成1M次每秒 的代码贴出来吧 
沙发
LcwSwust| | 2023-5-17 08:15 | 只看该作者
看看你的代码,看是否可以优化一下.

使用特权

评论回复
板凳
wangshujun| | 2023-5-17 10:03 | 只看该作者
说说用途吧,没准有节省的方案

使用特权

评论回复
地板
xch| | 2023-5-17 11:40 | 只看该作者
可能你的代码有问题。 168MHZ/1M SPS /3= 56 (Instruction ).一般比较操作仅需6条指令,双操作数指针操作算12条,分支指令算2条。还有富裕

使用特权

评论回复
5
xch| | 2023-5-17 11:43 | 只看该作者
本帖最后由 xch 于 2023-5-17 11:48 编辑

如果要实现5M SPS*3 数据比较,用 168mhz MCU平均每个数据比较用11条指令可能累死MCU。

我实测M4代码,打开编译速度优化选项,检查MCU实际运行代码,发现一次比较操作含分支用 6条指令。

使用特权

评论回复
评论
xch 2023-5-17 12:27 回复TA
@玄德 :搬运数据交给DMA 这样MCU 仅对比两个固定地址的数据,操作指令更少。 
玄德 2023-5-17 11:55 回复TA
可能还要考虑数据搬运的时间。 
6
玄德| | 2023-5-17 11:49 | 只看该作者

1、优化程序,或者用汇编。

2、用硬件比较器,相当于 CPLD 。

3、深入研究应用场景,变通一下,降低 5M 这个指标。

使用特权

评论回复
7
icecut| | 2023-5-17 11:58 | 只看该作者
读, 读, 取10bit, 取10bit, 比较, 写回. 一组至少6条指令. 三组算20条, *5M, 那就是100Mhz,  你可以选f7之类更高频的单片机

使用特权

评论回复
8
QuakeGod| | 2023-5-17 12:34 | 只看该作者
现在已经是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实现过,但是我自己用数字电路搭过,也算有一定的经验了吧。

使用特权

评论回复
9
rzxhjd|  楼主 | 2023-5-17 18:35 | 只看该作者
本帖最后由 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,结果速度有些慢,看看用汇编或许行
谢谢啊



使用特权

评论回复
评论
kjrdfg 2023-5-18 09:34 回复TA
这样看的话,感觉像是数据读取速度不够,而不是判断速度不够,可以问下数据的读取方式是怎样的吗?是从哪里进到stm32的? 
xch 2023-5-17 21:47 回复TA
switch (A)? 
10
rzxhjd|  楼主 | 2023-5-17 18:52 | 只看该作者
icecut 发表于 2023-5-17 11:58
读, 读, 取10bit, 取10bit, 比较, 写回. 一组至少6条指令. 三组算20条, *5M, 那就是100Mhz,  你可以选f7之 ...

兄弟,照你这么说,每秒5M次还有68MHz空闲,那行啊,其他事情占用时间很少,汇编能实现这么快?

使用特权

评论回复
11
icecut| | 2023-5-17 20:14 | 只看该作者
rzxhjd 发表于 2023-5-17 18:52
兄弟,照你这么说,每秒5M次还有68MHz空闲,那行啊,其他事情占用时间很少,汇编能实现这么快? ...

你完全可以嵌入汇编试一下啊. 你如果用循环的话, 要考虑循环展开. 否则循环也有时间损耗, 计数器就好几条指令.  68M也不一定够用啊.

使用特权

评论回复
12
xch| | 2023-5-17 20:50 | 只看该作者
rzxhjd 发表于 2023-5-17 18:35
兄弟,我50了,不想学新东西了,能简单一些简单一些。
是这样,我原计划每秒中断5M次,降低一些,甚至一半 ...

如果是中断服务·就拉倒吧。只能靠DMA请求处理数据。

使用特权

评论回复
13
xch| | 2023-5-17 21:03 | 只看该作者
rzxhjd 发表于 2023-5-17 18:35
兄弟,我50了,不想学新东西了,能简单一些简单一些。
是这样,我原计划每秒中断5M次,降低一些,甚至一半 ...

看你的介绍,这5M信号应当用计数器6分频,然后中断。

使用特权

评论回复
14
rzxhjd|  楼主 | 2023-5-17 21:12 | 只看该作者
本帖最后由 rzxhjd 于 2023-5-17 21:20 编辑
xch 发表于 2023-5-17 21:03
看你的介绍,这5M信号应当用计数器6分频,然后中断。

就是计数器时钟84MHz,16分频,产生中断,搭车问一下,中断响应和返回用几个时钟?不行就算了,我已经把它暂时搁置一边了,除非简单,花时间少,否则先暂时放一下,
计数器21分频,中断频率4M也行

使用特权

评论回复
15
xch| | 2023-5-17 21:41 | 只看该作者
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 中断。

使用特权

评论回复
16
rzxhjd|  楼主 | 2023-5-17 21:58 | 只看该作者
xch 发表于 2023-5-17 21:41
void TIM1_CC_IRQHandler(void)
{
  volatile static uint32_t s=0;

谢谢老弟,那我放放吧,等我有功夫用AVR和CPLD吧,AVR比32熟

使用特权

评论回复
17
hjl2832| | 2023-5-18 08:17 | 只看该作者
中断,涉及到了入栈出栈等,至少20个周期以上。这种可以想办法把数据放到DMA中去读取吗?CPU只做比较处理。

使用特权

评论回复
18
kjrdfg| | 2023-5-18 09:32 | 只看该作者
其实有几个地方不太清楚,这1秒内是单纯只是比较的时间,还是包括了数据的读取、保存以及if之类的逻辑判断,还有就是数据类型是整形还是浮点

如果单纯只是比较的时间,可以尝试手动展开循环,比如原来程序里是一个5M次的for循环,内部就做了一次比较,改成内部连续做4次比较,循环次数改为5M/4,for循环的条件部分是非常消耗时间的,或者改成while循环再展开也行,同时整个工程开最高等级优化

如果是包含了读取保存和各种逻辑判断,那么可能要考虑优化下这部分的整体代码逻辑了,比如用环形缓冲区一边读一边做比较,还得考虑数据的读取速度是否达标,毕竟读取速度不行的话处理逻辑再怎么优化也没啥用

使用特权

评论回复
19
ASHYLAI| | 2023-5-18 09:35 | 只看该作者
这个问题引起我的一个观点,就是国内的电子工程师基本上都是瘸子,他们的拐杖就是单片机?楼主的问题是一般大学生都会的电路设计就可以解决的问题。

使用特权

评论回复
评论
zlf1208 2023-5-18 14:49 回复TA
也有可能是改行做电工的,知识不全面是很难免的 
20
oufuqiang| | 2023-5-18 09:48 | 只看该作者
原始需求不涉密不妨拿出来讨论一下,总觉得这么搞不是很合常规逻辑。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

13

帖子

0

粉丝