适用于 Pmod SSD 的 VHDL 双 7 段显示控制器 – 轻松 FPGA 集成
在本文中,我将介绍一个可以在 Pmod SSD 上显示两位数的 VHDL 模块:来自 Digilent 的七段显示器。双 7 段显示器与 Pmod 接口兼容,这意味着您无需任何焊接即可使用它。它适合 Pmod 连接器,这是许多 FPGA 开发板的标准配置。
为了测试 VHDL 实现,我使用了 Lattice iCEstick,这是一款带有 Pmod 连接器的低成本 FPGA 开发板。除了 iCEstick 之外,您还需要一根 2×6 针转双 6 针 Pmod 分路器电缆,将 iCEstick 上的并行 Pmod 连接器转换为 7 段显示器所需的串联版本插头。最后,我建议使用 USB Type-A 延长线,因为将 iCEstick 直接插入计算机上的 USB 端口是不切实际的。
7 段显示器的工作原理
市场上有许多不同的 7 段显示器。它们之间的位数不同,物理接口和引脚排列也不同。涵盖您可能遇到的所有可能的 7 段显示器的通用解决方案可能不太用户友好。但是,您可以使用本文中提供的代码作为基础并对其进行修改以满足您的需求。
上图来自 Digilent Pmod 模块的数据表。它显示了 7 段显示器如何连接到 Pmod 引脚。这些引脚可直接访问 iCEstick 上的 FPGA。
其中七个引脚分别控制显示屏上的一个段。通过在此类引脚上驱动逻辑高值,相应的段将在显示屏上点亮。但这个显示屏上有两位数字,我们当时只能控制一位。 J2 连接器上的 P4/C 引脚选择一个或另一个数字。当该引脚上的逻辑电压为'0'时 ,如果是 '1',右侧数字会亮起 ,左边的数字被激活。
“DP”小数点未连接,无法访问。
实体
下面的代码显示了我们的 seg7 VHDL 模块的实体。该实体有一个通用端口,其常量名为 clk_cnt_bits 。它定义了控制显示器刷新率、左右数字交替频率的内部计数器的长度。
确切的频率并不重要。选择 50 到几百赫兹范围内的计数器长度。确定刷新率的公式为refresh_hz =2clk_cnt_bits / clk_hz .
<前>07前>
除了时钟和复位之外,该实体还有一个输入信号:要在 7 段显示器上显示的值。 value signal 是一个限制在 0 到 99 范围内的整数类型,因为这些是唯一可以仅使用两位数显示的数值。
输出信号是作为矢量的七段和用于选择左侧或右侧数字进行点亮的数字选择器信号。
表示二进制编码的十进制
为了表示显示屏上显示的数字,我们将使用称为二进制编码十进制 (BCD) 的格式。虽然二进制表示是存储十进制数的最有效方法,但当我们尝试将其拆分为左右数字以在显示屏上显示时,我们会遇到问题。我们不能仅通过对用于存储数字的向量进行切片来区分十进制数字。
<前>16前>
如上面的代码所示,我们声明了0到9范围内的整数的子类型,用于描述可以用一位十进制数字表示的值。然后,我们声明一个新的数组类型,它可以保存两个这样的 BCD 值。 digit 信号保存当前显示在显示屏左侧或右侧的数字。另一方面,digits 信号包含两个数字的单独十进制字符,就像观看屏幕的人看到的那样。
将十进制转换为 BCD
该模块的输入,value ,是 0 到 99 范围内的整数,数字的二进制表示形式。我们需要将这个单个整数转换为 0 到 9 范围内的两个整数,即 BCD。
标准算法是 Double Dabble,也称为 shift-and-add-3 算法。虽然这很好用,但在我们的例子中我会选择更短的解决方案,因为我们只有两个数字需要分隔。
<前>24前>
通过使用上面代码所示的整数除法,我们可以分离出最高有效的十进制数字并将其分配给 digits(1) 信号。要获取最低有效数字,我们可以从 value 中减去最高有效数字 信号,只剩下分配给 digits(0) 的号码 信号。
计算时钟周期
FPGA 中的延迟时间只是计算时钟周期的问题。时钟周期是您在 VHDL 代码中可以依赖的唯一可预测的时间间隔。下面的代码显示了 clk_count 信号,我们用它来计算时钟周期。 clk_cnt_bits generic 确定为此无符号信号保留多少位。
显示器的确切刷新率并不那么重要,这就是我在这里选择无符号类型的原因。它允许我们利用无符号信号的自包装行为。我们所要做的就是在时钟的每个上升沿增加计数器。下面的代码显示了处理此问题的重置同步过程。
<前>46前>数字之间交替
现在我们已经有了自由运行的计数器,我们可以使用无符号计数器信号的最高有效位 (MSB) 在两个数字之间切换。 MSB 在 '0' 之间交替 和'1' 占空比为 50%。下面代码的第一行设置 digit_sel 基于 MSB 值的信号。第二行实现了一个多路复用器,其中 MSB 用作选择器。它将转发 digits 中有效数字的值 数组到 digit 信号。
BCD转7段编码器
seg7模块的最后一步是翻译存储在digit中的BCD 将信号发送到 7 段显示器上的视觉表示。下面的代码显示了通过使用 case 语句实现此目的的过程。
每个位文字在向量中的位置对应于显示器上的一个段。索引 0 等于段 A,索引 1 等于 B,依此类推,一直到索引 6,索引 6 控制段 G。段到矢量索引的映射源自 Digilent 7 段显示器的数据表。
<前>67前>输出
seg7 VHDL 模块将在显示器上呈现您分配给 value 的任何内容 输入信号。在测试台中,我们增加 value 每秒发出一次信号。然后,我们模拟 100 多秒,以便我们可以观察 value 的包裹点 计数器。
上面的波形来自ModelSim。它显示了模拟的第一部分,其中值从 0 计数到 15。我们可以看到 digits 中的数字 数组也在计数。那些 (0) 每次 value 都在计数 信号发生变化,而十位(1) 每十个数字增加一次。
您可以使用下面的表格下载 ModelSim 项目,包括测试平台。
如果将 seg7 模块实现为 FPGA 上的顶层模块,显示屏很可能会显示稳定的“00”。那是因为 '0' 是 FPGA 中未初始化信号最常见的默认值。当 value 信号设置为全零,显示屏将显示这一点。
为了循环遍历所有可能的输入数字,我创建了一个包装 VHDL 模块,该模块递增 value 每秒发出十次信号。然后,在 Lattice iCEstick 上实现设计之前,我在包装器中实例化了 seg7 模块。下面的循环 Gif 视频显示了实现的设计在 7 段显示屏上的外观。
购买 Pmod SSD:七段显示器
本博文中使用的 7 段显示器来自 Digilent。您可以从 Digilent 网上商店购买 Pmod 模块,也可以从众多经销商之一处获取。在下面的列表中,我链接到了产品页面,以便在一些销售该产品的在线电子商店中展示。
- 数字化
- Digi-Key
- 贸泽
- RS Electronics(英国)
(转至 RS Electronics 主页选择适合您所在国家/地区的站点) - 派睿电子(英国)
(转至 Farnell 主页选择适合您所在国家/地区的站点)
请注意,如果您想将 Digilent 7 段显示器与 Lattice iCEstick 一起使用 或任何其他具有 6×2 针 Pmod 连接器的 FPGA 开发板,您还需要一根分路器电缆。该电缆可从 Digilent 获取 , 电子钥匙 , 贸泽 ,和RS电子 .
此外,所有组件均可从 Amazon 和 eBay 上的各个卖家处购买。
使用 Digilent 7 段显示器的 VHDL 课程
我为绝对初学者推出了新的 VHDL 和 FPGA 课程。在课程中,我使用 Digilent 的 7 段显示器和 Lattice iCEstick FPGA 开发板来教授 VHDL。点击下面的链接阅读有关课程的更多信息!
FPGA 和 VHDL 快速通道:
绝对初学者的实践
您熟悉编程但对 VHDL 不熟悉吗?
您需要对这个不熟悉的主题进行简短介绍吗?
你的日程安排得满满的,没有时间学习吗?
在几个晚上了解使用 VHDL 进行 FPGA 开发的基础知识!本课程适合需要快速了解该主题的 IT 专业人员和学生。通过本课程和低成本莱迪思 iCEstick 开发板,您将在数小时内开发真正的硬件。
点击此处阅读更多信息并注册:
FPGA 和 VHDL 快速入门:绝对初学者的实践
VHDL