2010-12-31 12 views
3

아래 코드는 자일링스 애플리케이션 노트에서 Verilog의 델타 - 시그마 DAC를 구현하고 이에 상응하는 VHDL 코드를 작성하려고합니다. 나는 Verilog에 대해 아무것도 모른다. 그리고 초보자 인 VHDL에서 많은 추측을하고 아마 초심자 오류 (아래 코드)를 만들어야했다. 누군가가 도와 주시면 번역이 정확한지 확신 할 수 없습니까?Verilog에서 VHDL 로의 델타 - 시그마 DAC

원래의 Verilog VHDL에서

`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 

내 시도 : 당신이 ieee.std_logic_unsigned (또는 _arith) 또는 둘 모두를 사용하는 것처럼

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

것 같습니다.

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

고마워요! (더 많은 문자) –