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 中的行为模型程序和数据流模型程序之间的混淆 的相关文章

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

    我正在使用 Douglas L Perry 所著的教科书 VHDL 示例编程 第四版 他在第 4 页给出了 Dataflow 编程模型的示例 Code I ENTITY mux IS PORT a b c d IN BIT s0 s1 IN
  • 使用 VHDL 实例化 FPGA 中的 RAM

    我试图按照中的指导实现双端口 RAM这篇优秀的博文 http danstrother com 2010 09 11 inferring rams in fpgas 然而 ModelSim 在编译时给出以下警告 Warning fifo ra
  • VHDL:进程块内的多个上升沿检测

    我对 VHDL 以及一般的数字电路 还很陌生 我正在尝试使用 BCD 样式块实现两位数的计数器 该电路的外部有一些按钮 按下这些按钮时 会将感兴趣的数字加一 很像闹钟 这是一个异步操作 会在某种形式的编辑模式下发生 外部强制 我编写的代码在
  • 在非时钟信号上使用上升沿是不好的做法吗?还有其他选择吗?

    我正在研究 VHDL 设计并且它可以工作 但是代码非常丑陋 而且我似乎正在尝试围绕语言的设计来实现我的目标 这一事实让我觉得有些事情是错误的 我对 VHDL 还很陌生 但我已经研究该项目的较小部分近一个月了 所以我有了总体想法 然而 这部分
  • VHDL - PhysDesignRules:367

    当我尝试从 VHDL 代码合成 实现和生成程序文件时 我收到警告 当我尝试合成时出现此错误 WARNING Xst 647 Input
  • VHDL 上的反转位顺序

    我在做类似的事情时遇到困难 b 0 to 7 lt a 7 downto 0 当我用ghdl编译它时 出现顺序错误 我发现使我的电路工作的唯一方法如下 library ieee use ieee std logic 1164 all ent
  • 错误(10028):无法解析网络的多个常量驱动程序... VHDL 错误

    我正在尝试编写一个代码来检测 din 信号的上升沿 并在发生后将 doout 提高 5 个时钟周期 我在编译时不断收到不同的错误 但我不确定它们的含义 我认为我对 VHDL 中的一些概念缺乏基本的了解 但遗憾的是在网上查找并没有给我带来太大
  • 将整数转换为 std_logic

    假设你有一个循环 for i in 1 downto 0 loop for j in 1 downto 0 loop tS0 lt i 但我需要将整数 这是自然的 转换为 std logic tS0被声明为 std logic 我只做了一位
  • Lex VHDL '(勾号)令牌

    在 VHDL 中 字符可用于封装字符标记ie 或者它可以作为属性分隔符 类似于 CPP 的 token ie string hello 解析包含字符的属性名称时出现问题ie string a b c 在这种情况下 天真的词法分析器将错误地标
  • Quartus初始化RAM

    我制作了一个实体 其中 quartus 成功识别 RAM 并为其实例化 RAM 宏功能 如果我可以从文件初始化 RAM 那就太好了 我找到了制作此类文件 mif 文件 的教程 现在我已经创建了该文件 我不知道如何让 quartus 初始化该
  • 如何在 VHDL 中将整数作为十六进制写入标准输出?

    我可以打印一个integer作为十进制到标准输出 library std use std textio all entity min is end min architecture behav of min is begin process
  • 将库添加到 Vivado 2014.4

    我对 Vivado 和 VHDL 还很陌生 我想要一些关于基本问题的指导 我猜我可以创建自己的库并在我的项目中使用它们 就像使用默认库和基本库一样 eg library IEEE use IEEE std logic 1164 ALL us
  • 数据流进入 Beam Pipeline 时的附加参数

    我正在研究 Dataflow 我已经通过 Python SDK 构建了自定义管道 我想将数据流 UI 上的参数添加到我的自定义管道中 使用附加参数 参考者https cloud google com dataflow docs guides
  • 如何在平面文件连接管理器上重新配置列信息?

    我有一个正在从平面文件读取数据的平面文件源 我们最近在此平面文件中添加了一个新列 平面文件数据被插入到数据库表中 为了适应目标组件中的新字段 我使用了ALTER TABLE语句将新列添加到表中 这是我所做的唯一改变 平面文件和目标组件之间的
  • VHDL 中的进程是可重入的吗?

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

    对于vhdl中的process语句 据说process语句内部的执行顺序是连续的 我的问题是 请先看下面的代码 a b和c信号在进程语句中的if语句中是同时还是顺序分配给它们的新值 process clk is begin if risin
  • 用几个 1 位 ALU 制作一个 4 位 ALU

    我正在尝试将几个 1 位 ALU 组合成一个 4 位 ALU 我对如何在 VHDL 中实际执行此操作感到困惑 这是我正在使用的 1 位 ALU 的代码 component alu1 define the 1 bit alu componen
  • 设计用于初始化的VHDL状态机

    如何最明智地设计用于初始化芯片的 VHDL 状态机 我当前的设计是 伪代码 案例状态 当 s0 gt VHDL CODE FOR WRITING VALUE TO REGISTER状态 s1 当 s1 gt VHDL CODE FOR WR
  • 如何跳过 SSIS 数据流中的最后一行

    我在用FlatFile Source Manager gt Script COmponent as Trans gt OLEDB destination在我的数据流中 源从平面文件读取所有行 我想跳过更新数据库的最后一行 预告片记录 由于它
  • 使用 if 语句更改进程内的信号 - VHDL

    我有这个 VHDL 代码 我想要的是在 sw event 时首先上升 然后 首先自行下降 但当我模拟这个时 首先永远不会跌倒 process rst clk sw begin if clk EVENT and clk 1 then if r

随机推荐