Delta-Sigma DAC von Verilog nach VHDL
Frage
Der folgende Code implementiert einen Delta-Sigma DAC in Verilog aus einem Xilinx-Anwendungsnotiz, und ich möchte einen äquivalenten VHDL-Code schreiben. Ich weiß nichts über Verilog und ich bin Anfänger in VHDL, also musste ich viele Vermutungen und wahrscheinlich Anfängerfehler machen (Code unten). Ich bin mir nicht sicher, ob die Übersetzung korrekt ist. Kann jemand bitte helfen?
Original Verilog
`timescale 100 ps / 10 ps
`define MSBI 7
module dac(DACout, DACin, Clk, Reset);
output DACout;
reg DACout;
input [`MSBI:0] DACin;
input Clk;
input Reset;
reg [`MSBI+2:0] DeltaAdder;
reg [`MSBI+2:0] SigmaAdder;
reg [`MSBI+2:0] SigmaLatch;
reg [`MSBI+2:0] DeltaB;
always @(SigmaLatch) DeltaB = {SigmaLatch[`MSBI+2], SigmaLatch[`MSBI+2]} << (`MSBI+1);
always @(DACin or DeltaB) DeltaAdder = DACin + DeltaB;
always @(DeltaAdder or SigmaLatch) SigmaAdder = DeltaAdder + SigmaLatch;
always @(posedge Clk or posedge Reset)
begin
if(Reset)
begin
SigmaLatch <= #1 1'bl << (`MSBI+1);
DACout <= #1 1'b0;
end
else
begin
SigmaLatch <== #1 SigmaAdder;
DACout <= #1 SigmaLatch[`MSBI+2];
end
end
endmodule
Mein Versuch in VHDL:
entity audio is
generic(
width : integer := 8
);
port(
reset : in std_logic;
clock : in std_logic;
dacin : in std_logic_vector(width-1 downto 0);
dacout : out std_logic
);
end entity;
architecture behavioral of audio is
signal deltaadder : std_logic_vector(width+2 downto 0);
signal sigmaadder : std_logic_vector(width+2 downto 0);
signal sigmalatch : std_logic_vector(width+2 downto 0);
signal deltafeedback : std_logic_vector(width+2 downto 0);
begin
deltafeedback <= (sigmalatch(width+2), sigmalatch(width+2), others => '0');
deltaadder <= dacin + deltafeedback;
sigmaadder <= deltaadder + sigmalatch;
process(clock, reset)
begin
if (reset = '1') then
sigmalatch <= ('1', others => '0');
dacout <= '0';
elsif rising_edge(clock) then
sigmalatch <= sigmaadder;
dacout <= sigmalatch(width+2);
end if;
end process;
end architecture;
Lösung
Es sieht so aus, als ob Sie IEEE.std_logic_unsigned (oder _arith) oder beides verwenden.
Bitte tun Sie das nicht. Verwenden ieee.numeric_std.all
stattdessen.
Mein Verilog gibt signed
oder unsigned
Übereinstimmende Typen.
Ihre Reset -Klausel möchte wahrscheinlich etwas lesen wie:
sigmalatch <= (width+1 => '1', others => '0');
Und das Deltafeedback -Update ist so etwas wie:
deltafeedback(width+2 downto width+1) <= sigmalatch(width+2) & sigmalatch(width+2);
deltafeedback(width downto 0) <= (others => '0');
Zum Schluss, um dem Verilog zu entsprechen, denke ich Ihr width
Generikum sollte genannt werden MSBI
und auf 7 einstellen (oder alle Ihre ändern width+2
s zu width+1
s, um Ihre Absicht für die zu entsprechen width
generisch)
Andere Tipps
Wenn Sie einfach an Delta-Sigma DAC in VHDL interessiert sind, können Sie sich meine Implementierung ansehen, an die Sie veröffentlicht wurden Alt.Sources (Bitte wählen Sie die "Originalnachricht" aus, speichern Sie eine Datei und führen Sie "Unshar" darauf aus, um Quellen zu erhalten.)
Wojtek