Hallo Leute, ich versuche, den folgenden VHDL-Code in Verilog zu übersetzen, aber es funktioniert nicht, auch wenn sie ziemlich gleich aussehen. Ich erhalte keine Fehler, aber es funktioniert nicht mit Verilog One, sondern mit VHDL One. Könnt ihr mir bitte helfen, dieses Problem zu lösen?
VHDL-Code (funktioniert)
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;
Verilog-Code (funktioniert nicht):
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
Es funktioniert nicht. Kannst du mir bitte helfen?:
Die Variablenzuweisung in VHDL (mit :=
) erfolgt sofort. Um das gleiche Verhalten in Verilog zu erhalten, müssen Sie die blockierende Zuweisung mit =
anstelle der nicht blockierenden ( <=
) verwenden. In Ihrem Beispiel sind blockierende Zuweisungen für die Variable z
erforderlich, da Ihr Code den neuen Wert von z
unmittelbar nach der Zuweisung überprüft.
Außerdem läuft die Schleife in VHDL von 0 bis 4 (einschließlich). In Ihrem Verilog-Code geht es von 0 bis 3, weil es bei 4 ausbricht. Sie müssen die Bedingung in Ihrer for
Anweisung in einen "weniger oder gleich"-Vergleich ändern:
for(i=0; i<=4; i=i+1) begin
Kleinere Code-Verbesserungen:
Nachdem Sie die Zuweisung für z
in eine blockierende geändert haben, können Sie diese Else-Fälle entfernen, da sie keine Auswirkung haben:
else
z = z
In der Addition sollten Sie eine Konstante mit einer bestimmten Länge hinzufügen:
z[11:8] =z[11:8] +4'd3;
z[15:12]=z[15:12]+4'd3;
Die Konstante 3 ohne Längenangabe hat eine Länge von 32 Bit und der Synthese-Compiler warnt vor dem Abschneiden auf 4 Bit.
user_1818839
std_logic_unsigned
Bibliothek. Dienumeric_std
Eins sollte angemessen sein und mögliche Zweideutigkeiten vermeiden. Außerdemfor
ist die erste Schleife unnötig:z := (others => '0');
ersetzt sie durch eine einzelne Anweisung.gefallen
Tom Tischler
Tom Tischler
SamGibson