天哪,查理·布朗,我有点累了。我也感到有点困惑,因为我现在有这么多的文章相互链接,这让我头晕目眩。

为了简单地总结当前的游戏状态,我正在撰写一系列Arduino训练营实用的电子产品(PE)是英国首屈一指的电子和计算爱好者杂志。

由于那部杰出巨著的编辑指示我专注于实际操作的东西,我正在撰写辅助文章,以捕捉和分享大量超级有趣的上下文材料。

例如,在我的Cool Beans博客上,我们目前有什么是电压、电流和电阻?而且Arduinos和无焊面包板

使用两个4位二进制加法器实现1位BCD 8421加法器(点击图片查看大图)

与此同时,在EE杂志,我最近发布了ag亚博网站 ,这本书相当深入地探讨了一些真正有趣的东西,这些东西人们可能不太会谈论,但他们应该谈论。

我刚为EE Journal写完另一个专栏古代的奥秘:二进制编码十进制(BCD).必须承认,这是一个巨大的(36页的Word在我的电脑)。这花了我好几天的时间,尤其是创建了我需要的30多个图表来帮助解释事情(这里显示了其中的两个图表,让您对即将发生的事情有一个诱人的体验)。

我并没有打算写这么多,但“我必须提到这个”和“我不知道他们是否知道”之类的新想法不断出现在我的脑海里。

使用BCD表示定点和浮点数(点击图片查看大图)

例如,在我的BCD专栏中,我想介绍美国人和英国人在小数减法时执行借位操作的不同方式。由于那篇文章的篇幅越来越大,我决定把这些讨论发表在既不借债也不放债这里是Cool Beans博客。

有趣的是,许多科学家和专业工程师认为BCD是一个遥远时代的遗迹,只有像你谦卑的叙述者那样的极客和书呆子才感兴趣(我为自己的谦逊感到自豪)。在现实中,这种编码形式的使用远比你想象的要多。例如,在写我的BCD专栏时,我停下来和我的朋友聊天乔尼什么他是巴西GridVortex Systems公司的创始人兼首席执行官。

当我告诉乔尼我在做什么时,他回答说:“太巧了!我刚刚花了10个小时将我的单时钟周期二进制到bcd逻辑移植到完整的串行处理逻辑实现,作为我的FPGA嵌入式框架的一部分。”

我让Jonny告诉我更多,他给了我一篇很棒的文章。不幸的是,这个时候我的BCD专栏太大了,没有办法挤进去,所以我决定把它作为一个酷豆子博客发布在这里。以下是Jonny发给我的。享受吧!

_________________________________

在GridVortex,我们为安全关键型和任务关键型系统提供深度嵌入式工程设计和咨询服务。当我说安全和关键任务时,我指的是那种系统,如果它们失败了,人们就会死亡,这意味着我们需要它们不要失败。

在过去的20年里,我们设计的系统在现场持续运行,累计运行时间超过200万小时。这些仪器和测量系统每天都在全自动的工业工厂、实验室和企业中运行。我们被一些人称为"防故障裸金属乐队"

由于来自电路设计界,我们的固件总是受到RTL逻辑设计的很大影响,您可以从我们的C代码和VHDL之间的相似性中看到我们如何在逻辑分区和面向方面的方法中思考。

作为嵌入式设计人员,我最喜欢做的事情之一就是编写样板代码。逻辑基础设施。也叫“计算机机械”。除了在C语言中嵌入固件外,我们还进行了RTL逻辑设计和建模以及FPGA电路设计。我们在实验室里有相当多的FPGA测试板,其中有非常强大的芯片,但我想有一个平台,可以直接在FPGA逻辑中设计和实现嵌入式系统。我想要一些不涉及软处理器的东西,而是使用FPGA中的逻辑资源来实现支持作为顶层模块编写的嵌入式系统逻辑的通用样板计算机机械。

在COVID大流行期间,我开始创建这个框架,主要针对大型fpga,但也适用于小型和低成本技术。我购买了一些ICE40UP5K芯片和电路板,并开始在VHDL中实现我们的嵌入式系统核心。

我们的系统是一个面向流的系统。想想Unix机器,所有东西都是流。您有stdin()、stdout()、文件和物理设备。所有内容都是流,因此您可以为串行端口编写一个串行终端命令行接口(CMI),并将其封装在管道中重用。或者从一个文件获取输入,并在另一个文件中生成JSON帧。或者连续地向用户界面发送图形命令。

由于操作系统的计算机机制,所有这些在Unix系统中都是可能的。它以这样一种方式编写,即从每个进程的角度来看,系统简单地“拥有”所有这些逻辑层,以供该进程使用。实际上,软件是计算机机器的虚拟抽象,由一个叫做中央处理器的神奇组件串行运行。我们所做的就是将处理器从系统中移除。

使用纯逻辑和分布式计算机机械来接近嵌入式系统的优点是,通过消除CPU的单点故障,我们可以得到一个更健壮的系统。但我们也获得了更节能的系统,因为我们可以在10 MHz或更少的时钟下运行,并获得与200+ MHz 32位处理器相同的性能、延迟和实时响应。唯一的缺点是我们需要更多的逻辑。

编写一个嵌入式系统就绪的FPGA框架就是这样,实现嵌入式逻辑在面向流的环境中运行所需的计算机机制。这也意味着所有你认为理所当然的东西都是凭空造出来的。

现有的每个计算机系统的核心就是这样一个东西——负责将数字信息从二进制转换为人类可读的文本的基础设施。printf()函数族是有史以来最古老也是最重要的样板逻辑之一。想想看。为了真正能够将我的系统称为“嵌入式框架”,我需要在逻辑上实现printf()功能。

printf()数字转换函数的核心是BCD。数字转换和ASCII表示的核心在printf()机制中是必不可少的。我的第一个PRINTF()实现针对的是高性能的单时钟周期流,能够生成Gbps的文本流。BCD函数是能够并行处理32位和64位数字的大型单时钟函数。然而,当涉及到在每个查找表(LUT)都很重要的超微fpga中实现这一功能时,需要改变BCD转换算法。在这种情况下,我需要一个完全串行的算法。

一种非常流行的BCD转换算法被称为“双涉猎”。这涉及到一个简单的小数移位寄存器,它接受二进制位的串行流,并将这些位应用到bcd编码的移位寄存器。该算法最流行的形式被称为“shift_and_add_3”,其中移位位并对大于4的每个数字应用更正,因此该数字将生成“小数结转”。“add 3”算法的问题在于,它不能很好地扩展任意二进制宽度,但我们需要完全通用的逻辑。

因此,我们实现了一个略有不同的算法,它在乘法之前对二进制移位之前的所有数字应用预偏置。该算法简单,在高速版BCD核心中实现为单时钟层。

全串行版本需要节省lut,因此预偏置电路被减少到一个数字。现在我们有了4位输入和4位输出查找表,可以很好地映射到4个lut4,而对于32位二进制到bcd转换,则需要40个lut4。然而,为了保持我们的储蓄,我们需要避免更多的lut。这意味着我们需要某种方法使我们的个位数LUT处理每个十进制数字而不使用索引(变量索引生成多路复用器以及大量的LUT)。相反,我实现了一个组织为环形寄存器的桶移位器。桶移位器由纯电线制成,不涉及逻辑lut(映射器仍然可以使用lut作为路由)。

在每个时钟上,环形寄存器从最低有效的BCD数字向上移动4位到最高有效的BCD数字,因此如果应用10个时钟,就有10个数字循环。最后一个数字(最重要的BCD数字)通过我们的个位数预偏LUT循环回第一个数字(最不重要),因此预偏所有10个数字需要10个时钟。当然,这意味着我们不能再处理Gbps的文本流,但是我们的嵌入式系统可以处理3.5Mbps的文本流。

这使得BCD核心相当小。例如,PRINTF_BIN2ASC块包含前导空格、小数固定数字点和减号/加号,其容量小于140 lut。这使得文本生成框架的其余部分能够动态地处理二进制到人类可读的数据,从上游字符串FIFO流到下游FIFO流,如UART_TX流。

通过在每个流接口和内部总线上使用fifo,我们可以拥有动态文本生成、字符串缓冲区和运行时可选择流。

如果你有兴趣领导更多关于这方面的内容,或者关于我们在GridVortex创建的系统,请随时联系我乔尼什么在LinkedIn。