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;
War es hilfreich?

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+2s zu width+1s, 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top