una tutorial que programacion programa operadores libreria ejemplos bibliotecas arquitectura vhdl

tutorial - vhdl programa



downto vs. to en VHDL (7)

Aunque no hay nada de malo en ninguna de las respuestas anteriores, siempre he creído que la provisión de ambas es apoyar dos paradigmas.

Primero está la representación numérica. Si escribo el número 7249, inmediatamente lo interpretas como 7 mil 2 ciento cuarenta y nueve. Los números se leen de izquierda a derecha donde el dígito más significativo está a la izquierda. Este es el caso ''downto''.

La segunda es la representación del tiempo donde siempre pensamos que el tiempo avanza de izquierda a derecha. En un reloj, los números aumentan con el tiempo y 2 siempre siguen 1. Aquí naturalmente escribo el orden de los bits de izquierda a derecha en orden ascendente de tiempo, independientemente de la representación de los bits. En RS232, por ejemplo, comenzamos con un bit de inicio seguido de 8 bits de datos (LSB primero) y luego un bit de parada. Aquí el MSB está a la derecha; el caso ''a''.

Como se dijo, lo más importante es no mezclarlos arbitrariamente. Al decodificar un flujo RS232, podemos terminar haciendo eso para convertir los bits recibidos en el orden del tiempo en bytes que son primero MSB, pero esta es una excepción en lugar de la regla.

No estoy seguro de entender la diferencia entre ''downto'' vs. ''to'' en vhdl.

He visto algunas explicaciones en línea, pero todavía no creo entender. ¿Alguien puede hacerlo por mí?


En tipos de vectores, el bit más a la izquierda es el más significativo. Por lo tanto, para un rango de 0 to n , el bit 0 es el msb, para un rango de n n downto 0 , el bit n es el msb.

¡Esto es útil cuando se combina IP que utiliza ordenamientos de bits big-endian y little-endian para mantener la cabeza despejada!

Por ejemplo, Microblaze es big-endian y usa 0 como su msb. Conecté uno a un dispositivo externo que era little-endian, así que utilicé 15 downto 0 en los pines externos y los reasigné a 16 to 31 en el extremo de microblaze en mi núcleo de interfaz.

VHDL te obliga a ser explícito al respecto, por lo que no puedes hacer le_vec <= be_vec; directamente.


Me enseñaron que una buena regla es usar "downto" para asuntos en los que es importante mantener el orden binario (por ejemplo, una señal de 8 bits que contiene un carácter) y "to" se usa cuando la señal no está necesariamente interconectada, por ejemplo, si cada bit en la señal representa un LED que está encendiendo y apagando.

conectando un "downto" de 4 bits y un "bit 4" a "parece algo así como

sig1 (3 abajo a 0) <= sig2 (0 a 3)

------- 3 -------------------- 0

------- 2 -------------------- 1

------- 1 -------------------- 2

------- 0 -------------------- 3

tomando parte de la señal en lugar de sig1 (2 abajo a 1) <= sig2 (0 a 1)

------- 2 -------------------- 0

------- 1 -------------------- 1


Principalmente, solo le impide mezclar el orden de los bits cuando crea una instancia de los componentes. No querría almacenar el LSB en X(0) y pasarlo a un componente que espera que X(0) contenga el MSB.

En términos prácticos, tiendo a usar DOWNTO para vectores de bits ( STD_LOGIC_VECTOR(7 DOWNTO 0) o UNSIGNED(31 DOWNTO 0) ) y TO para RAM ( TYPE data_ram IS ARRAY(RANGE NATURAL<>) OF UNSIGNED(15 DOWNTO 0); SIGNAL r : data_ram(0 TO 1023); ) y contadores integrales (contador SIGNAL counter : NATURAL RANGE 0 TO max_delay; ).

Para ampliar la respuesta de @ KerrekSB , considere un codificador de prioridad:

ENTITY prio PORT ( a : IN STD_LOGIC_VECTOR(7 DOWNTO 1); y : OUT STD_LOGIC_VECTOR(2 DOWNTO 0) ); END ENTITY; ARCHITECTURE seq OF prio IS BEGIN PROCESS (a) BEGIN y <= "000"; FOR i IN a''LOW TO a''HIGH LOOP IF a(i) = ''1'' THEN y <= STD_LOGIC_VECTOR(TO_UNSIGNED(i, y''LENGTH)); END IF; END LOOP; END PROCESS; END ENTITY;

La dirección del bucle ( TO o DOWNTO ) controla lo que sucede cuando se DOWNTO varias entradas (ejemplo: a := "0010100" ). Con TO , la entrada con el número más alto gana ( y <= "100" ). Con DOWNTO , la entrada con el número más bajo gana ( y <= "010" ). Esto se debe a que la última asignación en un proceso tiene prioridad. Pero también puede utilizar EXIT FOR para determinar la prioridad.


Si toma un procesador, para sistemas Little Endian podemos usar "downto" y para sistemas Bigendian usamos "to".

Por ejemplo,

signal t1 : std_logic_vector(7 downto 0); --7th bit is MSB and 0th bit is LSB here.

y,

signal t2 : std_logic_vector(0 to 7); --0th bit is MSB and 7th bit is LSB here.

Usted es libre de usar ambos tipos de representaciones, solo tiene que asegurarse de que otras partes del diseño estén escritas en consecuencia.

Esta post dice algo diferente:

"El término big endian (o little endian) designa el orden de bytes en procesadores orientados a bytes y no se ajusta a los vectores de bits VHDL. El término técnico es rango de matriz ascendente y descendente. Los tipos numéricos predefinidos como firmado y sin signo están restringidos a los rangos descendentes por convención."

Entonces, esta respuesta puede ser confusa ...


Una referencia en línea interesante que encontré está here , donde, entre otras, en la sección "Asignaciones de matrices", puede leer:

Se pueden asignar dos objetos de matriz entre sí, siempre y cuando sean del mismo tipo y tamaño. Es importante tener en cuenta que la asignación es por posición y no por número de índice. No hay concepto de un bit más significativo definido dentro del lenguaje. Lo interpreta el usuario que usa la matriz. Aquí hay ejemplos de asignaciones de matrices:

Con la siguiente declaración:

.... SIGNAL z_bus: BIT_VECTOR (3 DOWNTO 0); SIGNAL a_bus: BIT_VECTOR (1 TO 4); .... z_bus <= a_bus;

es lo mismo que:

z_bus(3) <= a_bus(1); z_bus(2) <= a_bus(2); z_bus(1) <= a_bus(3); z_bus(0) <= a_bus(4);

Observaciones:

1) Cualquier diferencia de "downto" y "to" aparece cuando queremos usar un vector de bits no solo para representar una matriz de bits, donde cada bit tiene un comportamiento independiente, sino para representar un número entero. Luego, hay una diferencia en la importancia de los bits, debido a la forma en que los números se procesan mediante circuitos como sumadores, multiplicadores, etc.

En este caso especialmente discutible, suponiendo que 0 <x <y, es una convención habitual que cuando se usa x to y , x es el bit más significativo (MSB) y y el bit menos significativo (LSB). A la inversa, cuando se utiliza y downto x , y es el MSB yx el LSB. Puede decir que la diferencia, para los vectores de bits que representan enteros, se debe a que el índice de la MSB es el primero, ya sea que use "to" o "downto" (aunque el primer índice es más pequeño que el segundo cuando se usa "to" y más grande cuando se usa "downto").

2) Debe tener en cuenta que y downto x significa que y es el MSB y, a la inversa, x to y significa x es el MSB son convenciones conocidas, generalmente utilizadas en los núcleos de Propiedad Intelectual (IP) que puede encontrar implementados e incluso de forma gratuita. Es, también, la convención utilizada por las bibliotecas IEEE VHDL, creo, al convertir entre vectores de bits y enteros. Pero, no hay nada de difícil en el modelado estructural de, por ejemplo, un sumador de 32 bits que utiliza vectores de bits de entrada de la forma y downto x y usa y como el LSB, o usa vectores de bits de entrada de la forma x to y donde x se usa como el LSB ...

Sin embargo, es razonable usar la notación x downto 0 para un entero no negativo, porque las posiciones de los bits corresponden a la potencia de 2 multiplicada por el dígito para sumar el valor del número. Esto parece haberse extendido también en la mayoría de las otras prácticas relacionadas con enteros.

3) El orden de bits no tiene nada que ver con la endianidad . Endianness se refiere al ordenamiento de bytes (bueno, el ordenamiento de bytes es una forma de ordenamiento de bits ...). La endianidad es un problema expuesto en el nivel de la Arquitectura de conjunto de instrucciones (ISA), es decir, es visible para el programador que puede acceder a la misma dirección de memoria con diferentes tamaños de operandos (por ejemplo, palabra, byte, palabra doble, etc.). El orden de los bits en la implementación (como en la pregunta) nunca se expone a nivel ISA. El programador solo puede ver la semántica de las posiciones relativas de los bits (por ejemplo, el desplazamiento a la izquierda puede implementarse realmente desplazando a la derecha un registro cuya significación de bits se invierte en la implementación).

(¡Es sorprendente cuántas respuestas que mencionan esto han sido votadas!)


Uno sube, uno baja.

-- gives 0, 1, 2, 3: for i in 0 to 3 loop -- gives 3, 2, 1, 0: for i in 3 downto 0 loop