Delta-Sigma DAC de Verilog VHDL
Question
Le code ci-dessous met en œuvre un DAC Delta-Sigma dans Verilog, à partir d'une note d'application Xilinx et je veux écrire équivalent code VHDL. Je ne sais rien au sujet de Verilog et je suis débutant en VHDL donc je devais faire beaucoup de suppositions et des erreurs probablement débutant (code ci-dessous). Je ne suis pas sûr que la traduction est l'aide à quelqu'un correct peut s'il vous plaît?
Original 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;
La solution
On dirait que vous utilisez ieee.std_logic_unsigned (ou _arith) ou les deux.
S'il vous plaît ne pas faire . Utilisez ieee.numeric_std.all
à la place.
Mon Verilog est assez inexistant, donc j'oublie si par défaut Verilog à signer ou arithmétique non signé ... Mais quel qu'il soit, faire tous vos signaux numériques en types de signed
ou unsigned
pour correspondre.
Votre clause reset veut probablement lire quelque chose comme:
sigmalatch <= (width+1 => '1', others => '0');
et la mise à jour 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
générique devrait être appelé MSBI
et ensemble à 7, (ou modifier vos width+2
s à width+1
s pour correspondre à votre intention pour le width
générique)
Autres conseils
Si vous êtes simplement intéressé par DAC Delta-Sigma en VHDL, vous pouvez jeter un oeil à ma mise en œuvre affichée sur alt.sources (s'il vous plaît sélectionner le "message d'origine", enregistrer dans un fichier et d'exécuter "unshar" sur elle pour obtenir des sources).
Wojtek