DELTA-SIGMA DAC от VERILOG в VHDL
Вопрос
Приведенный ниже код реализует DAC 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;
Решение
Похоже, вы используете ieee.std_logic_unsigned (или _arith) или оба.
Пожалуйста, не делай этого. Анкет Использовать ieee.numeric_std.all
вместо.
Мой версии довольно отсутствует, поэтому я забываю, если версируйте по умолчанию подписанную или не подписываемую арифметику ... но как бы она ни была, сделайте все свои численные сигналы в 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');
Наконец, чтобы соответствовать версии, я думаю, что вы width
общий должен быть вызван MSBI
и установить на 7 (или изменить все свои width+2
с width+1
S, чтобы соответствовать вашему намерению для width
общий)
Другие советы
Если вы просто заинтересованы в DAC Delta-Sigma в VHDL, вы можете взглянуть на мою реализацию, опубликованную в alt.sources (Пожалуйста, выберите «исходное сообщение», сохраните в файл и запустите «Unshar» на нем, чтобы получить источники).
Войтек