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

VHDL中行为模型程序和数据流模型程序之间的混淆,vhdl,dataflow,Vhdl,Dataflow,我正在使用Douglas L Perry的第四版教材“VHDL:通过示例编程”。他在第4页给出了数据流编程模型的示例: 代码一: 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 = ‘

我正在使用Douglas L Perry的第四版教材“VHDL:通过示例编程”。他在第4页给出了数据流编程模型的示例:

代码一:

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;
在第二种情况下,语法差异很小此代码II是并行的。但从互联网上的其他来源(如下所列),我看到行为模型应该是连续的。我应该相信哪一个

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

行为-电路被描述为一个i/o关系,使用进程内的顺序语句

数据流–使用并发语句描述电路

-圣何塞州立大学

行为–描述如何使用结构化的 声明

数据流–描述数据如何流动

-阿克伦大学工程学院

在这里,我不理解结构化语句的含义。 在行为级别,存在流程关键字

在数据流级别,并发语句( Q Q Q Q 无效的 终例; 结束过程; 结局更好;
这是MUX的顺序版本。根据其他定义,这应该是行为的,但作者没有这样说。你能澄清我对这些模型的困惑吗?

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

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

“行为”也应该相当清楚——它只是简单地描述了电路的行为

但它一般不反对数据流——尽管你在圣何塞的引语有些正确——行为描述通常是顺序的,因为顺序范式(在VHDL进程内)是程序员常见和熟悉的。即便如此,几个这样的进程相互交互的行为是……数据流

那么行为层就不能正确地反对数据流,它更正确地反对意义相当明确的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;
实体mux是
端口(a、b、c、d):位;
sel:在0到3的自然范围内;
x:输出位);
端多路复用器;
mux的架构非常简单
信号值:位的数组(0到3);
开始

值行为实现和结构实现之间的区别在这本书中没有得到很好的解释。数据流可能是基于谁在试图传达什么而对硬件的一种应用不当的描述

我怀疑:(PDF,66KB,12页)是为了克服像你这样的读者的困惑而提供的:

在VHDL中,我们可以用三种不同的方式描述逻辑。 这三种不同的体系结构是:

  • 行为-描述如何使用结构化语句从输入中派生输出

  • 数据流–描述数据如何从输入流到输出,最常用的方法是使用NOT、AND和OR操作

  • 结构-描述闸门如何互连,类似于示意图方法

数据流可以暗示并发性,而行为或结构描述都不排除顺序或并发描述。所有并发描述都转换为顺序进程以进行VHDL模拟,依靠增量模拟周期来同步模拟并发性的信号分配

模拟器中有一个设计网络的概念,它反映了设计层次结构,就像可以用平面网络列表表示的原理图一样

这里有充分的理由使用所谓的数据流,因为用9级逻辑(MVL9,由软件包std_logic_1164使用)来描述逻辑行为会导致未知值('X's)和未初始化值('U's)的传播。它可以在行为模型和结构模型之间实现闭合,而无需在可见值周围挥手。除了异常之外,抽象级别之间无法协调。数据流行为描述和结构实现之间的刺激和预期结果是相同的

固相萃取
WITH sel SELECT
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;
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;
p <= a * b;