Question

Le code ci-dessous met en œuvre un DAC Delta-Sigma dans Verilog, à partir d'une note d'application Xilinx et je veux écrire équivalent code VHDL. Je ne sais rien au sujet de Verilog et je suis débutant en VHDL donc je devais faire beaucoup de suppositions et des erreurs probablement débutant (code ci-dessous). Je ne suis pas sûr que la traduction est l'aide à quelqu'un correct peut s'il vous plaît?

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

Mon essai en 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;
Était-ce utile?

La solution

On dirait que vous utilisez ieee.std_logic_unsigned (ou _arith) ou les deux.

S'il vous plaît ne pas faire . Utilisez ieee.numeric_std.all à la place.

Mon Verilog est assez inexistant, donc j'oublie si par défaut Verilog à signer ou arithmétique non signé ... Mais quel qu'il soit, faire tous vos signaux numériques en types de signed ou unsigned pour correspondre.

Votre clause reset veut probablement lire quelque chose comme:

sigmalatch <= (width+1 => '1', others => '0');

et la mise à jour deltafeedback est quelque chose comme:

deltafeedback(width+2 downto width+1) <= sigmalatch(width+2) & sigmalatch(width+2);
deltafeedback(width downto 0) <= (others => '0');

Enfin, pour correspondre à la Verilog, je pense que votre width générique devrait être appelé MSBI et ensemble à 7, (ou modifier vos width+2s à width+1s pour correspondre à votre intention pour le width générique)

Autres conseils

Si vous êtes simplement intéressé par DAC Delta-Sigma en VHDL, vous pouvez jeter un oeil à ma mise en œuvre affichée sur alt.sources (s'il vous plaît sélectionner le "message d'origine", enregistrer dans un fichier et d'exécuter "unshar" sur elle pour obtenir des sources).

Wojtek

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top