Hola chicos, estoy tratando de traducir el siguiente código VHDL a Verilog, sin embargo, no funciona incluso si se ven bastante iguales. No recibo errores, sin embargo, no funciona con Verilog one pero funciona con VHDL one. ¿Pueden por favor 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. ¿Podrías ayudarme?:
La asignación de variables en VHDL (con :=
) se realiza inmediatamente. Para obtener el mismo comportamiento en Verilog, debe usar la asignación de bloqueo con =
en lugar de la de no bloqueo ( <=
). z
En su ejemplo, se requieren asignaciones de bloqueo para la variable porque su código verifica el nuevo valor de z
inmediatamente después de asignarlo.
Además, el bucle va de 0 a 4 (inclusive) en VHDL. En su código Verilog, va de 0 a 3 porque se desglosa en 4. Tiene que cambiar la condición en su for
declaración a 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 de z
a una de bloqueo, puede eliminar estos else-cases, porque no tienen ningún efecto:
else
z = z
Además, debe agregar 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 una 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.
usuario_1818839
std_logic_unsigned
. Elnumeric_std
uno debe ser adecuado y evitar posibles ambigüedades. Además, el primerfor
ciclo es innecesario:z := (others => '0');
lo reemplaza con una sola declaración.caído
tom carpintero
tom carpintero
Sam Gibson