好悲伤,查理布朗,我感觉有点疲劳。我也感觉有点困惑,因为我现在有很多文章链接彼此来回,它让我很头痛。

简要总结的当前状态在脆简而言之,我在写一系列的过程Arduino训练营实用的电子产品(PE)是英国首屈一指的电子和计算机爱好者杂志。

编辑以来杰出的指示我已经关注细节实践的东西,我写辅助文章获取并分享很多超有趣的背景材料。

在我的酷豆博客,例如,我们目前拥有的什么是电压、电流和电阻吗?arduino和无焊料的电路试验板

8421年实现1-digit BCD加法器使用两个4比特二进制小蝰蛇(点击图片查看大图——来源:Max Maxfield)

与此同时,在EE杂志,我最近发布的Arduino 0和1,低和高,虚假和真实的,和其他的东西,一个相当深入地了解一些真正有趣的东西,人们不谈论也许他们应该。

我只是完成了EE杂志写一篇文章古人的奥秘:二进制编码的十进制(BCD)。必须承认,这是一个弥天大谎(36页的单词在我的电脑)。这花了我几天的努力,不仅创造了30 +图我需要帮助解释事情(两图所示的给你一个诱人的品酒师来)。

我并没有开始写这么多,但新思想的“我必须提到这个”和“我想如果他们知道“继续进入我的脑海里。

用BCD代表定点和浮点数(点击图片查看大图——来源:Max Maxfield)

例如,当我BCD列的一部分,我想不同的人执行借操作在美国和英国在执行小数减法。因为这纸是增长如此之大,我决定这些讨论借款人和贷款人在酷豆的博客。

很有趣有多少科学家和专业工程师认为BCD从遥远时代遗迹感兴趣的电脑迷和电脑虫喜欢你卑微的旁白(我在谦逊骄傲自己)。在现实中,这种形式的编码继续使用远远超过你可能的事情。例如,在写我的BCD专栏中,我想休息和我的朋友聊天乔尼什么的创始人兼首席执行官GridVortex系统在巴西。

当我告诉约翰我做什么,他回答说:“真巧啊!我只是通过了最后10个小时在移植single-clock-cycle binary-to-BCD逻辑完整的串行处理逻辑实现为我FPGA嵌入式框架的一部分。”

我问约翰告诉我,他给我一个伟大的帐面价值。不幸的是,这个时候我的BCD列太大,没有办法挤在,所以我决定在这里作为一个酷豆的博客。以下是约翰尼·发给我。享受吧!

_________________________________

在GridVortex,我们提供深度嵌入的工程设计和咨询服务安全性至关重要和关键任务系统。当我说安全关键任务,我指的是系统,如果他们失败了,人们可以死,这意味着我们不需要他们失败。

在过去的二十年里,我们设计了系统持续运行在该领域,积累了超过二百万小时的操作时间。这些仪器和测量系统在完全自动化的工厂每天跑步,实验室和企业。我们是由一些被称为“万无一失的裸机的家伙。”

来自电路设计的世界里,我们的固件一直非常受RTL逻辑设计,你可以看到我们的C代码和硬件描述语言(VHDL)之间的相似性在logic-partitioning我们如何思考和面向方面的方法。

我喜欢的一件事作为嵌入式设计师写样板代码。逻辑基础设施。也被称为“计算机机械。“除了嵌入式固件在C语言中,我们也做RTL逻辑设计和建模和FPGA电路设计。我们有相当多的FPGA测试板与真正强大的芯片实验室,但是我想要一个平台,直接在FPGA逻辑设计和实现嵌入式系统。我想要的东西没有涉及到软处理器,而是利用FPGA逻辑资源实现泛型样板电脑机械支持嵌入式系统逻辑写成的顶层模块。

COVID大流行期间我开始创建这个框架主要针对大型fpga,而且小和低成本技术。我买了几个ICE40UP5K芯片和董事会,开始实现我们在硬件描述语言(VHDL)的嵌入式系统的核心。

我们的系统是一个streams-oriented系统。考虑一个Unix机器,一切都是流。你有stdin (), stdout(),文件和物理设备。一切都是流,所以你可以有一个串行终端命令行接口(CMI)编写的串口和重用它封装在一个管。或输入从一个文件并生成JSON框架到另一个文件中。或图形命令发送到用户界面,连续。

这都是有可能的,在Unix系统中由于机械操作系统的电脑。写在这样一种方式,从每一个过程的角度来看,该系统简单”“所有这些逻辑层使用现有的流程。在现实中,软件是一个虚拟的抽象计算机机械运行连续通过一个神奇的组件称为中央处理器。我们所做的就是处理器的系统。

方法嵌入式系统使用纯逻辑的优点和分布式计算机机械是我们得到一个更健壮的系统CPU通过消除单点故障。但我们也获得更多的节能系统,因为我们可以运行10 MHz时钟和获得同样的性能,延迟和实时响应作为200 + MHz 32位处理器。唯一的缺点是,我们采取更多的逻辑。

就是编写一个embedded-systems-ready FPGA框架,实现所需的电脑机械嵌入式逻辑streams-oriented环境中的行为。这也意味着所有你认为理所当然的事情必须由稀薄的空气。

这样的一个问题是每一个计算机系统的核心existence-an基础设施负责将数字信息来回从二进制转换为人类可读的文本。这是一个最古老和最重要的块样板的逻辑:printf()的函数。想想。真正能够调用我的系统“嵌入式框架,”我需要实现printf()功能逻辑。

printf()的核心是BCD数字转换功能。数字转换的核心和ASCII表示在printf()机械至关重要。我的第一个PRINTF()实现是针对高性能、single-clock-cycle流,能产生Gbps的文本流。BCD功能很大单个钟的功能能够并行处理32位和64位数字。然而,当它在超微fpga来实现这个功能,每一个查找表(附近地区)计数,BCD转换算法的改变是必需的。在这种情况下,我需要一个完全串行算法。

一个非常受欢迎的BCD转换算法有一个外号叫“”double-dabble。“这涉及到一个简单的decimal-shift-register需要串行二进制比特流和应用这些比特BCD-encoded移位寄存器。最受欢迎的形式的算法称为“shift_and_add_3”,你把比特和修正适用于每一个数字大于4,所以数字将生成一个“十进制延续。加3“的问题算法,它不能很好地扩展为任意二进制宽度,但我们需要完全通用的逻辑。

因此,我们实现了一个稍微不同的算法,之前pre-bias乘法适用于所有数字在一个二进制的转变。算法简单,实现为一个单个钟层在高版本的BCD核心。

全系列版本需要节省附近地区,所以pre-bias电路减少到一个数字。现在我们有4比特输入和4比特输出查找表,很好地映射到4 LUT4s,而不是40 LUT4s 32位binary-to-BCD转换。保持我们的积蓄,我们需要避免更多的附近地区。这意味着我们需要一些方式使我们的个位数附近地区过程每一个十进制数字不使用索引(变量索引生成多路复用器以及很多很多附近地区)。相反,我实现了一个桶移器组织为一个圆形环登记。桶换档器是由纯粹的电线没有逻辑附近地区涉及(映射器仍然可以使用附近地区作为路由)。

在每一个时钟,环寄存器转移4从最低有效位BCD位数最重要的BCD数字,如果你申请10钟,你有10位数流传。最后一个数字(最重要的BCD数字)循环回第一位数(最重要的),通过我们的个位数pre-bias附近地区,所以pre-biasing 10位数需要10钟。当然,这意味着我们可以不再Gbps文本流的过程,但是我们的嵌入式系统可以处理每流~ 3.5 mbps。

这使BCD核心相当小。例如,PRINTF_BIN2ASC块,主要空间,十进制数字点固定,适合在140附近地区- / +标志。,使其余的文本处理binary-to-human-readable数据动态生成框架,从上游字符串FIFO流到下游FIFO流,像UART_TX流。

利用fifo每流接口,内部的公交车,我们可以动态文本生成字符串缓冲区,和运行时可选择的流。

如果你主要感兴趣,或对系统我们在GridVortex创建,请随时联系我乔尼什么在LinkedIn。