¿Cómo puedo agregar un vector firmado con uno sin firmar en VHDL?

0

Me gustaría saber cómo puedo agregar un vector sin firmar con uno firmado . La razón es que estoy creando un procesador MIPS y me gustaría agregar el contador del programa que no está firmado con el campo inmediato de la instrucción I-Type que está firmada. A continuación puede ver la ruta de datos y la adición de esos 2 vectores.

Ya he intentado lo siguiente con un error:

-- Signals used
PC_BRANCH_DEC_OUT   : out std_logic_vector(31 downto 0);
PC_PLUS4_DEC_IN     : in std_logic_vector (31 downto 0);
signal signed_imm_s : std_logic_vector    (31 downto 0);

-- Addition of the signals above
PC_BRANCH_DEC_OUT <= std_logic_vector(unsigned(PC_PLUS4_DEC_IN) + signed(signed_imm_s));

La adición antes mencionada funciona solo si ambos están sin firmar o firmados.

¿Existe alguna solución para hacer posible esta adición y cómo?

    
pregunta Spyros Chiotakis

3 respuestas

0

¿Por qué mantienes el contador del programa en un std_logic_vector ? Este tipo de datos está destinado a un conjunto de valores independientes std_logic , mientras que los bits en el contador de su programa no son independientes, ya que se llevan durante la adición.

Implementaría todo el contador del programa como unsigned , lo que permite usar operadores de suma directamente.

    
respondido por el Simon Richter
0

La forma más fácil podría ser convertir ambas señales en enteros, agregarlas y luego volver a convertirlas en firmadas. Hay funciones to_integer para ambos firmados y sin firmar. También puede intentar simplemente encasillar la señal sin firmar en una señal firmada, sin embargo, eso podría convertir 15 ("1111 sin firmar") en -1 ("1111"), y podría arruinar su adición.

    
respondido por el Drew
0

Todo lo que necesita hacer es extender el contador del programa no diseñado para convertirlo en un valor firmado, realizar la suma con el valor inmediato firmado, luego cortar el bit de signo:

signal pc_signed : signed (32 downto 0);
signal new_pc_signed : signed (32 downto 0);

...

pc_signed <= signed ('0' & PC_PLUS4_DEC_IN);
new_pc_signed <= pc_signed + signed(signed_imm_s);
PC_BRANCH_DEC_OUT <= std_logic_vector(unsigned(new_pc_signed(31 downto 0)));

Aquí hay un potencial obvio para que ocurra algo malo si una instrucción intenta mover la PC a un nivel inferior a cero, pero supongo que sería responsabilidad del programador asegurarse de que esto no haya ocurrido. Usted podría agregar cheques para esto en hardware si quisiera; simplemente busque el bit más significativo en new_pc_signed que se está configurando.

Como lo señaló otra persona, estaría mejor con puertos y señales que representen números de tipo numérico, por lo que el contador de su programa sería unsigned en todo. Esto evitaría tener tantas conversiones de tipos en todas partes. Parece ser una queja común que las conversiones de tipo de apariencia torpe son 'requeridas', cuando la solución real a esto es a menudo usar solo los tipos más apropiados en primer lugar.

    
respondido por el scary_jeff

Lea otras preguntas en las etiquetas