2 votos

Conversión de código Bin-to-BCD de VHDL a Verilog

Hola chicos estoy tratando de traducir el siguiente código VHDL a Verilog, sin embargo no funciona aunque parezcan bastante iguales. No obtengo ningún error, pero no funciona con Verilog pero sí con VHDL. ¿Pueden ayudarme a resolver este problema?

Código VHDL (en funcionamiento)

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
entity binbcd8 is

port(
b: in unsigned(7 downto 0);
p: out unsigned(9 downto 0)
);
end binbcd8;

architecture Behavioral of binbcd8 is

begin

bcd1: process(b)
variable z: unsigned(17 downto 0);
begin
for i in 0 to 17 loop
    z(i):='0';
end loop;

z(10 downto 3):=b;

for i in 0 to 4 loop
    if z(11 downto 8)>4 then
        z(11 downto 8):=z(11 downto 8)+3;
    end if;
    if z(15 downto 12)>4 then
        z(15 downto 12):=z(15 downto 12)+3;
    end if; 
    z(17 downto 1):=z(16 downto 0);
end loop;
p<=z(17 downto 8);

end process;    
end Behavioral;

Código Verilog (no funciona):

 module binbcd8(input[7:0] b,output reg[9:0] p);
 reg[17:0] z;

 integer i;

 always@(b)
     begin
         z <=17'b0;
         z[10:3] <=b;
         for(i=0;i<4;i=i+1) begin
             if(z[11:8]>4)
                 z[11:8]<=z[11:8]+3;
             else
                 z<=z;
             if(z[15:12]>4)
                 z[15:12]<=z[15:12]+3;
             else
                 z<=z;
             z[17:1]<=z[16:0];
         end
         p<=z[17:8];
     end
 endmodule

No funciona. ¿Puede ayudarme, por favor?

2voto

Paul Puntos 11

La asignación de variables en VHDL (con := ) tiene lugar inmediatamente. Para obtener el mismo comportamiento en Verilog, hay que utilizar la asignación de bloqueo con = en lugar del no bloqueante ( <= ). En su ejemplo, las asignaciones de bloqueo para la variable z son necesarios porque su código comprueba el nuevo valor de z inmediatamente después de asignarlo.

Además, el bucle va de 0 a 4 (inclusive) en VHDL. En tu código Verilog, va de 0 a 3 porque se rompe en 4. Tienes que cambiar la condición en tu for a la comparación "menor o igual":

for(i=0; i<=4; i=i+1) begin

Mejoras menores en el código:

Después de cambiar la asignación para z a uno de bloqueo, puede eliminar estos else-cases, porque no tienen ningún efecto:

    else
      z = z

En la adición, debes añadir una constante con una longitud específica:

      z[11:8] =z[11:8] +4'd3;
      z[15:12]=z[15:12]+4'd3;

La constante 3 sin especificación de longitud tiene una longitud de 32 bits y el compilador de síntesis emite una advertencia sobre el truncamiento a 4 bits.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X