Konvertieren von Bin-to-BCD-Code von VHDL nach Verilog

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?:

Löschen Sie die nicht standardmäßige std_logic_unsignedBibliothek. Die numeric_stdEins sollte angemessen sein und mögliche Zweideutigkeiten vermeiden. Außerdem forist die erste Schleife unnötig: z := (others => '0');ersetzt sie durch eine einzelne Anweisung.
@BrianDrummond Ich habe kein Problem mit vhdl. Mein Problem ist, dass mein Verilog-Code nicht funktioniert, aber vhdl funktioniert übrigens, danke für deine Ratschläge
@NihadAzimli Ich habe den Fragentitel so aktualisiert, dass er zu Ihrer Frage passt - Sie hatten im Titel Verilog zu VHDL gesagt, versuchen aber tatsächlich, in die andere Richtung zu gehen.
Haben Sie versucht, das Design zu simulieren? Wenn ja, können Sie beschreiben, was "es funktioniert nicht" bedeutet. Wenn Sie es nicht simuliert haben, sollten Sie dies tun.
Die Frage wurde auch an SO gepostet und dort beantwortet: stackoverflow.com/questions/34372347/…

Antworten (1)

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 zerforderlich, da Ihr Code den neuen Wert von zunmittelbar 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 forAnweisung 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 zin 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.