Usando un contador para determinar la siguiente posición de MSB en la división polinómica

1

Estoy trabajando en la implementación de un divisor polinomial, la operación es la siguiente: Compruebe MSB del numerador: si 1 XOR con Denom entonces desplaza Denom a la derecha si 0 Num es el mismo y Denom también se desplaza a la derecha

Al hacer el siguiente cambio para el Denom, la nueva MSB del numerador para comparar es la antigua MSB-1 Por lo tanto, he implementado un contador de Down que comienza con M downto 0 en cada paso, el nuevo MSB es el valor leído en el contador

en la implementación de VHDL recibí un error en lo siguiente

if(numerator(ctr_reg)='1')

el error obtenido es: el identificador de tipo con "ctr_reg" no está de acuerdo con su uso como "tipo natural"

¿Cómo puedo resolver esto? ¿Debería hacerse con una variable dentro de mi proceso? ¿Y cuál es la traducción de hardware de una variable utilizada en tal caso

Gracias

Bibliotecas incluidas

library ieee; 
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
use work.classic_multiplier_parameters.all;

Error de la declaración actualizada:

if(numerator(to_integer(unsigned(ctr_reg)))='1') then

    
pregunta chaosmind

1 respuesta

1

Supongo que ctr_reg es de tipo (un) firmado porque es un contador.

VHDL espera que los índices normales sean de tipo entero (natural, positivo son subtipos de entero). Consulte la definición de std_logic_vector:

type STD_LOGIC_VECTOR is array (NATURAL range <>) of STD_LOGIC;

Por lo tanto, debe convertir su contador de (un) firmado a entero:

if (numerator(to_integer(ctr_reg)) = '1') then

Si ctr_reg es de tipo std_logic_vector (slv), entonces también debe convertir slv a unsigned:

if (numerator(to_integer(unsigned(ctr_reg))) = '1') then

Si esta construcción es demasiado larga, escribe una función (digamos que to_index (..)) que oculta estas conversiones :)

if (numerator(to_index(ctr_reg)) = '1') then

Se puede encontrar una definición para to_index(..) aquí .

Edición 1:

Lista de paquetes comúnmente utilizados en VHDL:

library IEEE;
use     IEEE.STD_LOGIC_1164.ALL;  -- common std_logic(_vector) operations
use     IEEE.NUMERIC_STD.ALL;     -- defines signed and unsigned and their operations
    
respondido por el Paebbels

Lea otras preguntas en las etiquetas