Дельта-сигма ЦАП от Verilog до VHDL - PullRequest
3 голосов
/ 31 декабря 2010

Приведенный ниже код реализует ЦАП Delta-sigma в Verilog из заметки приложения Xilinx, и я хочу написать эквивалентный код VHDL.Я ничего не знаю о Verilog и я новичок в VHDL, поэтому мне пришлось делать много догадок и, вероятно, ошибок новичков (код ниже).Я не уверен, что перевод правильный, может кто-нибудь помочь, пожалуйста?

Оригинал 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;

Ответы [ 2 ]

3 голосов
/ 04 января 2011

Похоже, вы используете ieee.std_logic_unsigned (или _arith) или оба.

Пожалуйста, не делайте этого .Вместо этого используйте 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+2 s на width+1 s, чтобы соответствовать вашему намерению для width универсального)

2 голосов
/ 10 июня 2011

Если вас просто интересует ЦАП Delta-sigma в VHDL, вы можете взглянуть на мою реализацию, опубликованную на alt.sources (выберите «исходное сообщение», сохраните в файл и запустите"unshar" на него, чтобы получить источники).

Wojtek

...