VHDL 中的行为模型程序和数据流模型程序之间的混淆

2023-12-20

我正在使用 Douglas L Perry 所著的教科书“VHDL:示例编程”,第四版。他在第 4 页给出了 Dataflow 编程模型的示例:

Code I:

ENTITY mux IS
PORT ( a, b, c, d : IN BIT;
s0, s1 : IN BIT;
x, : OUT BIT);
END mux;
ARCHITECTURE dataflow OF mux IS
SIGNAL select : INTEGER;
BEGIN
select <= 0 WHEN s0 = ‘0’ AND s1 = ‘0’ ELSE
          1 WHEN s0 = ‘1’ AND s1 = ‘0’ ELSE
          2 WHEN s0 = ‘0’ AND s1 = ‘1’ ELSE
          3;
x <= a AFTER 0.5 NS WHEN select = 0 ELSE
     b AFTER 0.5 NS WHEN select = 1 ELSE
     c AFTER 0.5 NS WHEN select = 2 ELSE
     d AFTER 0.5 NS;
END dataflow;

现在在第 17 页,Code II

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY mux4 IS
PORT ( i0, i1, i2, i3, a, b : IN std_logic;
PORT ( i0, i1, i2, i3, a, q : OUT std_logic);
END mux4;
ARCHITECTURE mux4 OF mux4 IS
SIGNAL sel: INTEGER;
BEGIN
WITH sel SELECT
q <= i0 AFTER 10 ns WHEN 0,
q <= i1 AFTER 10 ns WHEN 1,
q <= i2 AFTER 10 ns WHEN 2,
q <= i3 AFTER 10 ns WHEN 3,
q <= ‘X’ AFTER 10 ns WHEN OTHERS;
sel <= 0 WHEN a = ‘0’ AND b = ‘0’ ELSE
       1 WHEN a = ‘1’ AND b = ‘0’ ELSE
       2 WHEN a = ‘0’ AND b = ‘1’ ELSE
       3 WHEN a = ‘1’ AND b = ‘1’ ELSE
       4;
END mux4;

这应该是一个行为模型,按照同一教科书。除了变量名称的差异之外,我在这里看到的唯一主要区别是有一个额外的语句

WITH sel SELECT

在第二种情况下,语法差异很小。此代码 II 是并发的。但从互联网上的其他来源(如下所列),我发现行为模型应该是连续的。我应该相信哪一个?

现在从互联网的其他一些来源来看,这些模型的定义如下:

行为 - 电路被描述为 I/O 关系,使用顺序的a 内的语句process.

数据流 - 使用以下方式描述电路同时声明

-圣何塞州立大学

行为 – 描述如何使用结构化从输入导出输出 声明。

数据流——描述数据如何流动。

-阿克伦大学工程学院

这里我不明白结构化语句是什么意思。

在行为级别中,存在 process 关键字

在数据流级别,存在并发语句(


这是在一个在线论坛上看到的。

行为模型的流程声明是强制性的吗?

代码 I 和 II 之间的实际区别是什么?据作者称,他们有不同的模型、数据流和行为。我不明白这怎么可能。我应该相信什么?

最后,Perry D L,第 45、46 页:

LIBRARY IEEE;
USE IEEE.std_logic_1164ALL;
ENTITY mux IS
PORT (i0, i1, i2, i3, a, b : IN std_logic;
PORT (q : OUT std_logic);
END mux;
ARCHITECTURE better OF mux IS
BEGIN
PROCESS ( i0, i1, i2, i3, a, b )
VARIABLE muxval : INTEGER;
BEGIN
muxval := 0;
IF (a = ‘1’) THEN
muxval := muxval + 1;
END IF;
IF (b = ‘1’) THEN
muxval := muxval + 2;
END IF;
CASE muxval IS
WHEN 0 =>
q <= I0 AFTER 10 ns;
WHEN 1 =>
q <= I1 AFTER 10 ns;
WHEN 2 =>
q <= I2 AFTER 10 ns;
WHEN 3 =>
q <= I3 AFTER 10 ns;
WHEN OTHERS =>
NULL;
END CASE;
END PROCESS;
END better;

这是 MUX 的顺序版本。根据其他定义,这应该是行为,但作者没有这么说。您能解答我对这些模型的困惑吗?


不要寻找这些术语的数学上严格的描述;它们比这要模糊得多,松散的分类可能会重叠。

我认为“数据流”在这里相当清楚;它确实描述了数据流,并且用并发语句来描述它。但我想补充一点,每个并发语句都会被其输入的变化唤醒并提供其输出;因此(重要的是:)事情发生的顺序和源代码中元素的顺序之间没有对应关系。在这方面,它与函数式编程有很多共同点。前两个模型都是数据流模型; (I) 中的元素按逻辑顺序排列,而 (II) 则不是。

“行为”也应该相当清楚——它只是根据电路的行为来描述电路。

但事实并非如此一般来说与数据流相反 - 尽管你的圣何塞报价有些正确 - 行为描述是commonly顺序只是因为顺序范例(在 VHDL 进程内)对于程序员来说是常见且熟悉的。即便如此,几个这样的进程相互交互的行为是……数据流。

行为的那么不正确地反对dataflow。更正确的是反对RTL(注册传输级别)和结构性的其含义相当明确。

结构描述由许多构建块(门、多路复用器、整个 CPU)以及将它们互连的信号组成:文本框图(可能是从图形框图自动生成的)。因此,它可以是最低级别(请参阅此处有关在门外制作加法器的常见问题!)或最高级别(将 CPU 连接到内存、外设等)。

RTL 描述是相当低级的;它描述了存储元素(寄存器)之间的数据传输和操作,并且在进程内是通用的;它很像(行为)C 程序的汇编语言列表。

最后 - 太多的描述和太多无关的细节会妨碍正确的设计工作。查看手头的任务,提取其本质,然后实施它。

多路复用器根据所需元素的索引选择输入元素集合之一。最自然的索引形式通常是整数类型,很少包括负索引,而 VHDL 中最自然的集合形式是……数组。

那么为什么不写

ENTITY mux IS
  PORT ( a, b, c, d : in BIT;
         sel        : in natural range 0 to 3;
         x          : out BIT);
END mux;
ARCHITECTURE simple OF mux IS
SIGNAL values : array (0 to 3) of BIT;
BEGIN
   values <= a & b & c & d;
   x      <= values(sel);   -- after 0.5 ns; if you need to model timing!
END simple;

或者更好,将“值”作为输入端口......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VHDL 中的行为模型程序和数据流模型程序之间的混淆 的相关文章

  • 是否可以让任何数据流块类型发送多个中间结果作为单个输入的结果?

    是否可以得到TransformManyBlocks 在创建中间结果时将其发送到下一步 而不是等待整个结果IEnumerable
  • VHDL:IEEE std_logic 库中的真值表

    我研究了 IEEE 如何定义其库 当我打开的时候标准逻辑库 我看到了一些被定义为常数的真值表 我不知道真值表是如何运作的 请解释如何使用真值表返回结果 这是我找到的 AND 门 TYPE stdlogic table IS ARRAY st
  • 是否需要初始化?

    在VHDL中 创建信号或向量时是否需要初始化 如果忘记初始化信号或整数值会发生什么 In 模拟 如果你这样做not设置一个初始值 向量的每个元素都会得到default值 这是由 VHDL 语言规范定义的 对于枚举类型 这是枚举类型中定义的第
  • 使用 VHDL 实例化 FPGA 中的 RAM

    我试图按照中的指导实现双端口 RAM这篇优秀的博文 http danstrother com 2010 09 11 inferring rams in fpgas 然而 ModelSim 在编译时给出以下警告 Warning fifo ra
  • VHDL 类型转换 - 找到 4 种可能的定义

    我正在尝试将两个 std logic 位转换为整数 如下所示 LIBRARY IEEE USE IEEE std logic 1164 ALL USE IEEE numeric std ALL ENTITY TEST IS PORT sw1
  • Eclipse 上使用 Dataflow Runner 的 Apache Beam MinimalWordcount 示例

    我正在尝试在 Windows 上使用 Eclipse 中的 DataFlowRunner 运行 MinimalWordCount 示例 使用 MinimalWordCount gt 在 Eclipse 中运行作为 Java 应用程序 它与使
  • 模拟器和合成器之间初始化状态机的差异

    我的问题是关于合成状态机中使用的第一个状态 我正在使用莱迪思 iCE40 FPGA 用于仿真的 EDA Playground 和用于综合的莱迪思 Diamond Programmer 在下面的示例中 我生成一系列信号 该示例仅显示引用状态机
  • 如何在 VHDL 中将整数作为十六进制写入标准输出?

    我可以打印一个integer作为十进制到标准输出 library std use std textio all entity min is end min architecture behav of min is begin process
  • TPL 数据流与普通信号量

    我需要制定一个可扩展的流程 该进程主要有 I O 操作和一些次要的 CPU 操作 主要是反序列化字符串 该流程在数据库中查询 url 列表 然后从这些 url 中获取数据 将下载的数据反序列化为对象 然后将部分数据保存到 crm 动态以及另
  • 将库添加到 Vivado 2014.4

    我对 Vivado 和 VHDL 还很陌生 我想要一些关于基本问题的指导 我猜我可以创建自己的库并在我的项目中使用它们 就像使用默认库和基本库一样 eg library IEEE use IEEE std logic 1164 ALL us
  • VHDL - iSIM 输出未初始化,不改变状态

    您好 我是一位 Xilinx 新用户 在如何在测试台中编写激励 模拟方面遇到了麻烦 我的输出 Kd 没有给我任何合理的值 并在移动并始终保持在 1 之前的前几个时钟周期给出 u 不确定我是否写了正确的刺激 但希望有人能帮助我 我的VHDL代
  • 如何在平面文件连接管理器上重新配置列信息?

    我有一个正在从平面文件读取数据的平面文件源 我们最近在此平面文件中添加了一个新列 平面文件数据被插入到数据库表中 为了适应目标组件中的新字段 我使用了ALTER TABLE语句将新列添加到表中 这是我所做的唯一改变 平面文件和目标组件之间的
  • 赋值语句中的“others=>'0'”是什么意思?

    cmd register process rst n clk begin if rst n 0 then cmd r lt others gt 0 elsif clk event and clk 1 then cmd r lt end if
  • 无法通过在 Apache Beam 中创建模板来按所需顺序运行多个管道

    我有两个独立的管道 分别为 P1 和 P2 根据我的要求 我只需要在 P1 完全完成执行后才运行 P2 我需要通过一个模板完成整个操作 基本上 模板在找到 run 方式 即 p1 run 时就被创建 所以我可以看到 我需要使用两个不同的模板
  • 在VHDL中将8位二进制数转换为BCD

    该算法众所周知 您进行 8 次左移 并在每次移位后检查个位 数十位或数百位 每个 4 位 如果它们超过 4 个 则将 3 个添加到该组中 依此类推 这是一个基于流程的解决方案 但不起作用 它会编译 但输出不是我想要的 有什么想法可能是什么问
  • VHDL 中的进程是可重入的吗?

    一个进程是否可以连续运行两次或多次VHDL 如果在进程的顺序执行未完成的情况下发生另一个事件 在敏感信号列表上 会发生什么 有可能还是我的VHDL流程中的模型完全错误 进程运行时不会发生任何事件 当进程被事件唤醒时 它会运行到完成 结束进程
  • 数据流编程和响应式编程有什么区别?

    我实在看不出他们之间有什么区别 它们都与指令中的数据流动和输入数据变化的传播有关 我读了这本书 作者 马特 卡尔基 https deepfriedcode com books darps 它清楚地表明它们都是相同的 另一方面 维基百科 ht
  • VHDL 计数器错误 (vcom-1576)

    伙计们 我试图用 VHDL 编写一个简单的计数器 但我总是收到此错误 Error C Users usrname dir1 dir2 dir3 counter vhd 22 near rising edge vcom 1576 expect
  • 在单周期数据路径中加载半字和加载字节

    有人询问如何在单周期数据路径中实现加载字节而无需更改数据存储器 解决方案如下 替代文本 http img214 imageshack us img214 7107 99897101 jpg http img214 imageshack us
  • VHDL 中的 #define 等价物是什么

    VHDL 中的 define ifdef 和 ifndef 相当于什么 我想使用泛型作为 define 并根据它们更改设计 举一个简单的例子 定义一个字符串泛型并用它来确定时钟是单时钟还是差分时钟 generic something boo

随机推荐