2010-12-31 4 views
3

Le code ci-dessous implémente un DAC Delta-sigma dans Verilog, à partir d'une note d'application Xilinx et je veux écrire un code VHDL équivalent. Je ne sais rien de Verilog et je suis débutant en VHDL donc j'ai dû faire beaucoup de suppositions et probablement des erreurs de débutant (code ci-dessous). Je ne suis pas sûr que la traduction est correcte, quelqu'un peut-il vous aider s'il vous plaît?DAC Delta-sigma de Verilog à VHDL

originale 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; 
+1

Avez-vous essayé de simuler à la fois le Verilog et le VHDL et de vérifier la sortie? –

+0

Les outils de vérification d'équivalence peuvent vérifier si votre code Verilog est fonctionnellement équivalent à votre code VHDL. Votre Verilog a l'air d'être synthétisable si vous vous débarrassez des délais # 1. – toolic

Répondre

3

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

Please don't do that. Utilisez ieee.numeric_std.all à la place. Mon Verilog est assez inexistant, donc j'oublie si Verilog utilise par défaut l'arithmétique signée ou non signée ... Mais quel que soit le cas, faites tous vos signaux numériques en signed ou unsigned types pour correspondre.

Votre clause de remise à zéro veut probablement lire quelque chose comme:

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

et la mise à jour de 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 devrait être générique appelé MSBI et réglé à 7, (ou changer tous vos width+2 s en width+1 s pour correspondre à votre intention pour le width générique)

+1

L'arithmétique Verilog n'est pas signée par défaut, ce qui est en fait le contraire de ce qu'elle devrait être :-) –

1

Si vous êtes simplement intéressé par Delta-sigma DAC en VHDL, vous pouvez jeter un oeil à ma mise en œuvre affichée au alt.sources (veuillez sélectionner le "message original", enregistrer dans un fichier et lancer "unshar" dessus pour obtenir des sources).

Wojtek

+0

Merci! (plus de caractères) –