Confusión entre los programas del modelo de comportamiento y flujo de datos en VHDL

Estoy usando el libro de texto "VHDL: Programming By Example" de Douglas L Perry, Cuarta Edición. Dio un ejemplo del modelo de programación de flujo de datos en la página 4:

Código 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;

Ahora en la página 17,Código 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;

Esto se supone que es unmodelo de comportamiento, según el mismo libro de texto. Aparte de las diferencias en el nombre de la variable, la única diferencia importante que veo aquí es que hay una declaración adicional

WITH sel SELECT

En el segundo caso, y pequeñas diferencias de sintaxis.Este Código II es concurrente. Pero a partir de otras fuentes en Internet (que se enumeran a continuación), he visto que se supone que un modelo de comportamiento es secuencial. ¿Cuál debo creer?

Ahora de otras fuentes de internet, la definición de estos modelos es la siguiente:

Comportamiento: el circuito se describe como una relación de E / S usandosecuencial declaraciones dentro de unproceso.

Flujo de datos - El circuito se describe usandoconcurrente declaraciones

Universidad de San Jose

Comportamiento: describe cómo la salida se deriva de las entradas usando declaraciones estructuradas.

Flujo de datos: describe cómo fluyen los datos.

-Universidad de Akron College of Engineering

Aquí no entiendo lo que significan las declaraciones estructuradas.

en el nivel de comportamiento, la palabra clave del proceso está presente

en el nivel de flujo de datos, la declaración concurrente (<=) está presente

Esto fue visto en un foro en línea.

¿Es obligatorio el enunciado del proceso para el modelo de comportamiento?

¿Cuál es la diferencia real entre los códigos I y II? Según el autor, tienen diferentes modelos, flujo de datos y comportamiento. No puedo ver cómo esto es posible. ¿Qué debo creer?

Por último, en Perry D L, página 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;

Esta es una versión secuencial de MUX. Según las otras definiciones, se supone que esto es de comportamiento, pero el autor no lo afirma. ¿Podrías aclarar mi confusión con respecto a estos modelos?

Respuestas a la pregunta(3)

Su respuesta a la pregunta