2010-12-31 14 views
3

以下のコードは、ザイリンクスアプリケーションノートからVerilogでデルタシグマDACを実装しており、同等のVHDLコードを書きたいと思っています。私はVerilogについて何も知らないし、VHDLの初心者なので、私は多くの推測をしなければならず、おそらく初心者のエラー(以下のコード)をしなければならなかった。誰かが助けてくれれば、翻訳が正しいかどうかわからないのですか?VerilogからVHDLへのデルタシグマDAC

オリジナルの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 

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

VerilogとVHDLの両方をシミュレートして出力を確認しましたか? –

+0

VerilogコードがVHDLコードと機能的に同等であるかどうかを確認するツールです。あなたのVerilogは '#1 'の遅延を取り除くと合成可能なように見えます。 – toolic

答えて

3

あなたがieee.std_logic_unsigned(または_arith)、またはその両方を使用しているように見えます。

Please don't do that。代わりにieee.numeric_std.allを使用してください。

私のVerilogはほとんど存在しないので、Verilogが符号付きまたは符号なしの算術演算にデフォルト設定されているかどうかを忘れています...しかし、どちらの数値信号も一致させるにはsignedまたはunsignedのすべての数値信号を一致させてください。

あなたリセット句は、おそらくのようなもの読みたい:

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

をしてdeltafeedback更新のようなものです:

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

最後に、Verilogのと一致するように、私はあなたのwidth総称であるべきだと思いますMSBIと設定されて7に設定されている(またはwidth+2widthジェネリックの意図と一致するようにwidth+1に変更してください)

+1

Verilog算術演算はデフォルトでは符号なしです。これは実際には逆になります:-) –

1

単純にVHDLのDelta-Sigma DACに興味がある場合は、alt.sourcesに投稿した実装を見てください(元のメッセージを選択してファイルに保存し、ソースを取得するには "unshar"を実行してください) )。

Wojtek

+0

ありがとう! (より多くの文字) –