C
chelena
Guest
Аз имам Verilog код за LM4550 AC'97 за изпълнение в проекта си (прилагане на филтри LMS адаптивни в намаляване на шума).Аз се опитвам да се сдружават VHDL си код с този код, след превръщането на Verilog да VHDL в ISE10.1.Но аз не съм в състояние да получи същите резултати RTL.Кодът за други модули успешно се конвертират и RTL резултатите са абсолютно същите.Бихте ли ми покаже къде са ми проблем е в превръщането на следващия модул.Имам поставили както на оригиналния код Verilog и ми превръща VHDL код, wel.
======= Verilog код =========
модул AC97 (готови,
command_address, command_data, command_valid,
left_data, left_valid,
right_data, right_valid,
left_in_data, right_in_data,
ac97_sdata_out, ac97_sdata_in, ac97_synch, ac97_bit_clock, проучване
);
продукция е готово;
Входящ [7:0] command_address;
Входящ [15:0] command_data;
вход command_valid;
Входящ [19:0] left_data, right_data;
вход left_valid, right_valid;
продукция [19:0] left_in_data, right_in_data;
вход ac97_sdata_in;
вход ac97_bit_clock, проучване;
продукция ac97_sdata_out;
продукция ac97_synch;
обл готови;
обл ac97_sdata_out;
обл ac97_synch;
обл [7:0] bit_count;
обл [19:0] l_cmd_addr;
обл [19:0] l_cmd_data;
обл [19:0] l_left_data, l_right_data;
обл l_cmd_v, l_left_v, l_right_v;
обл [19:0] left_in_data, right_in_data;Винаги @ (posedge ac97_bit_clock) започва
/ / Създаване на синхронизиране на сигнала
ако (нулиране) започва
готови <= 1'b0;
/ / Атрибут първоначален синтез на готовност е "0";
ac97_sdata_out <= 1'b0;
/ / Атрибут първоначален синтез на ac97_sdata_out е "0";
ac97_synch <= 1'b0;
/ / Атрибут първоначален синтез на ac97_synch е "0";
bit_count <= 8'h00;
/ / Атрибут първоначален синтез на bit_count е "0000";
l_cmd_v <= 1'b0;
/ / Атрибут първоначален синтез на l_cmd_v е "0";
l_left_v <= 1'b0;
/ / Атрибут първоначален синтез на l_left_v е "0";
l_right_v <= 1'b0;
/ / Атрибут първоначален синтез на l_right_v е "0";
край
иначе започва
ако (bit_count == 255)
ac97_synch <= 1'b1;
ако (bit_count == 15)
ac97_synch <= 1'b0;
/ / Генериране на готови сигнал
ако (bit_count == 128)
готови <= 1'b1;
ако (bit_count == 2)
готови <= 1'b0;
/ / Капаче потребителски данни в края на всеки кадър.Това гарантира, че
/ / Първия кадър след проучване ще бъдат празни.
ако (bit_count == 255)
започва
l_cmd_addr <= (command_address, 12'h000);
l_cmd_data <= (command_data, 4'h0);
l_cmd_v <= command_valid;
l_left_data <= left_data;
l_left_v <= left_valid;
l_right_data <= right_data;
l_right_v <= right_valid;
край
ако ((bit_count> = 0) & & (bit_count <= 15))
/ / Слот 0: Tags
случай (bit_count [3:0])
4'h0: ac97_sdata_out <= 1'b1; / / Рамка валидна
4'h1: ac97_sdata_out <= l_cmd_v; / / командване адрес валидна
4'h2: ac97_sdata_out <= l_cmd_v; / / командване данни валидна
4'h3: ac97_sdata_out <= l_left_v; / / левица данни валидна
4'h4: ac97_sdata_out <= l_right_v; / / Право данни валидна
По подразбиране: ac97_sdata_out <= 1'b0;
endcase
иначе ако ((bit_count> = 16) & & (bit_count <= 35))
/ / Слот 1: командване адрес (8-бита, наляво оправдано)
ac97_sdata_out <= l_cmd_v?l_cmd_addr [35-bit_count]: 1'b0;
иначе ако ((bit_count> = 36) & & (bit_count <= 55))
/ / Слот 2: командването на данни (16-бита, наляво оправдано)
ac97_sdata_out <= l_cmd_v?l_cmd_data [55-bit_count]: 1'b0;
иначе ако ((bit_count> = 56) & & (bit_count <= 75))
започва
/ / Слот 3: ляв канал
ac97_sdata_out <= l_left_v?l_left_data [19]: 1'b0;
l_left_data <= (l_left_data [18:0], l_left_data [19]);
край
иначе ако ((bit_count> = 76) & & (bit_count <= 95))
/ / Слот 4: Право канал
ac97_sdata_out <= l_right_v?l_right_data [95-bit_count]: 1'b0;
още
ac97_sdata_out <= 1'b0;
bit_count <= bit_count 1;
край
край / / винаги @ (posedge ac97_bit_clock)
Винаги @ (negedge ac97_bit_clock) започва
ако ((bit_count> = 57) & & (bit_count <= 76))
/ / Слот 3: ляв канал
left_in_data <= (left_in_data [18:0], ac97_sdata_in);
иначе ако ((bit_count> = 77) & & (bit_count <= 96))
/ / Слот 4: Право канал
right_in_data <= (right_in_data [18:0], ac97_sdata_in);
край
endmodule-------------------------------------------------- -
----- Частта VHDL започва тук ---------------------
-------------------------------------------------- -
библиотека IEEE;
използване IEEE.STD_LOGIC_1164.ALL;
използване IEEE.STD_LOGIC_ARITH.ALL;
използване IEEE.STD_LOGIC_UNSIGNED.ALL;
предприятието е AC97
порт (
готови: Няма std_logic;
command_address: в std_logic_vector (7 downto 0);
command_data: в std_logic_vector (15 downto 0);
command_valid: в std_logic;
left_data: в std_logic_vector (19 downto 0);
right_data: в std_logic_vector (19 downto 0);
left_valid: в std_logic;
right_valid: в std_logic;
left_in_data: std_logic_vector вън (19 downto 0);
right_in_data: std_logic_vector вън (19 downto 0);
ac97_sdata_in: в std_logic;
ac97_bit_clock: в std_logic;
нулиране: в std_logic;
ac97_sdata_out: Няма std_logic;
ac97_synch: Няма std_logic);
края AC97;
архитектура ac97_arch на AC97 е
сигнал bit_count: естествен обхват от 0 до 0255;
сигнал l_cmd_addr: std_logic_vector (19 downto 0);
сигнал l_cmd_data: std_logic_vector (19 downto 0);
сигнал l_left_data: std_logic_vector (19 downto 0);
сигнал l_right_data: std_logic_vector (19 downto 0);
сигнал l_cmd_v: std_logic;
сигнал l_left_v: std_logic;
сигнал l_right_v: std_logic;
сигнал left_in_data_DUMMY: std_logic_vector (19 downto 0);
сигнал right_in_data_DUMMY: std_logic_vector (19 downto 0);
започва
right_in_data <= right_in_data_DUMMY;
left_in_data <= left_in_data_DUMMY;
synchSignal: процес (ac97_bit_clock, проучване)
започва
ако rising_edge (ac97_bit_clock), тогава
--- Генериране на синхронизиране на сигнала
ако (нулиране = "1"), тогава
готови <= "0";
ac97_sdata_out <= "0";
ac97_synch <= "0";
bit_count <= 0;
l_cmd_v <= "0";
l_left_v <= "0";
l_right_v <= "0";
още
ако (bit_count = 255) след
ac97_synch <= "1"; - Начало на Tags (Slot0)
крайна сметка, ако;
ако (bit_count = 15), тогава
ac97_synch <= "0"; - Край на етикет
крайна сметка, ако;
- Създаване на готови сигнал
ако (bit_count = 128) след
готови <= "1";
крайна сметка, ако;
ако bit_count = 2 тогава
готови <= "0";
крайна сметка, ако;
- Затвори потребителски данни в края на всеки кадър.Това гарантира, че
- Първият кадър след проучване ще бъдат празни.
ако (bit_count = 255) след
l_cmd_addr <= command_address & "000000000000";
l_cmd_data <= command_data & "0000";
l_cmd_v <= command_valid;
l_left_data <= left_data;
l_left_v <= left_valid;
l_right_data <= right_data;
l_right_v <= right_valid;
крайна сметка, ако;
ако (bit_count> = 0) и (bit_count <= 15), тогава
- Слот 0: Tags
bit_count случай е
при 0 => ac97_sdata_out <= "1"; - Рамка валидна
когато 1 => ac97_sdata_out <= l_cmd_v; - командване адрес валидна
при 2 => ac97_sdata_out <= l_cmd_v; - командване данни валидна
когато 3 => ac97_sdata_out <= l_left_v; - левица данни валидна
при 4 => ac97_sdata_out <= l_right_v; - Право данни валидна
когато другите => ac97_sdata_out <= "0";
края случай;
ELSIF (bit_count> = 16) и (bit_count <= 35), тогава
- Слот 1: командване адрес (8-бита, наляво оправдано)
ако l_cmd_v = "1" и след това
ac97_sdata_out <= l_cmd_addr (35-bit_count);
още
ac97_sdata_out <= "0";
крайна сметка, ако;
ELSIF ((bit_count> = 36) и (bit_count <= 55)), тогава
- Слот 2: командването на данни (16-бита, наляво оправдано)
ако l_cmd_v = "1" и след това
ac97_sdata_out <= l_cmd_data (55-bit_count);
още
ac97_sdata_out <= "0";
крайна сметка, ако;
ELSIF ((bit_count> = 56) и (bit_count <= 75)), тогава
- Слот 3: Ляв канал
ако l_left_v = "1" и след това
ac97_sdata_out <= l_left_data (19);
още
ac97_sdata_out <= "0";
l_left_data <= l_left_data (18 downto 0) & l_left_data (19);
крайна сметка, ако;
ELSIF ((bit_count> = 76) и (bit_count <= 95)), тогава
- Слот 4: Право канал
ако l_right_v = "1" и след това
ac97_sdata_out <= l_right_data (95-bit_count);
още
ac97_sdata_out <= "0";
крайна сметка, ако;
още
ac97_sdata_out <= "0";
bit_count <= bit_count 1;
крайна сметка, ако;
крайна сметка, ако; - проучване
крайна сметка, ако; - ac97_bit_clock
край процес synchSignal;
- Входящи AC97 връзка рамка
входящи: процес (ac97_bit_clock)
започва
ако falling_edge (ac97_bit_clock), тогава
ако (bit_count> = 57) и (bit_count <= 76) след това
- Слот 3: ляв канал
left_in_data_DUMMY <= left_in_data_DUMMY (18 downto 0) & ac97_sdata_in;
ELSIF (bit_count> = 77) и (bit_count <= 96) след това
- Слот 4: десния канал
right_in_data_DUMMY <= right_in_data_DUMMY (18 downto 0) & ac97_sdata_in;
крайна сметка, ако;
крайна сметка, ако;
край процес входящи; - края на входящите
края ac97_arch;
======= Verilog код =========
модул AC97 (готови,
command_address, command_data, command_valid,
left_data, left_valid,
right_data, right_valid,
left_in_data, right_in_data,
ac97_sdata_out, ac97_sdata_in, ac97_synch, ac97_bit_clock, проучване
);
продукция е готово;
Входящ [7:0] command_address;
Входящ [15:0] command_data;
вход command_valid;
Входящ [19:0] left_data, right_data;
вход left_valid, right_valid;
продукция [19:0] left_in_data, right_in_data;
вход ac97_sdata_in;
вход ac97_bit_clock, проучване;
продукция ac97_sdata_out;
продукция ac97_synch;
обл готови;
обл ac97_sdata_out;
обл ac97_synch;
обл [7:0] bit_count;
обл [19:0] l_cmd_addr;
обл [19:0] l_cmd_data;
обл [19:0] l_left_data, l_right_data;
обл l_cmd_v, l_left_v, l_right_v;
обл [19:0] left_in_data, right_in_data;Винаги @ (posedge ac97_bit_clock) започва
/ / Създаване на синхронизиране на сигнала
ако (нулиране) започва
готови <= 1'b0;
/ / Атрибут първоначален синтез на готовност е "0";
ac97_sdata_out <= 1'b0;
/ / Атрибут първоначален синтез на ac97_sdata_out е "0";
ac97_synch <= 1'b0;
/ / Атрибут първоначален синтез на ac97_synch е "0";
bit_count <= 8'h00;
/ / Атрибут първоначален синтез на bit_count е "0000";
l_cmd_v <= 1'b0;
/ / Атрибут първоначален синтез на l_cmd_v е "0";
l_left_v <= 1'b0;
/ / Атрибут първоначален синтез на l_left_v е "0";
l_right_v <= 1'b0;
/ / Атрибут първоначален синтез на l_right_v е "0";
край
иначе започва
ако (bit_count == 255)
ac97_synch <= 1'b1;
ако (bit_count == 15)
ac97_synch <= 1'b0;
/ / Генериране на готови сигнал
ако (bit_count == 128)
готови <= 1'b1;
ако (bit_count == 2)
готови <= 1'b0;
/ / Капаче потребителски данни в края на всеки кадър.Това гарантира, че
/ / Първия кадър след проучване ще бъдат празни.
ако (bit_count == 255)
започва
l_cmd_addr <= (command_address, 12'h000);
l_cmd_data <= (command_data, 4'h0);
l_cmd_v <= command_valid;
l_left_data <= left_data;
l_left_v <= left_valid;
l_right_data <= right_data;
l_right_v <= right_valid;
край
ако ((bit_count> = 0) & & (bit_count <= 15))
/ / Слот 0: Tags
случай (bit_count [3:0])
4'h0: ac97_sdata_out <= 1'b1; / / Рамка валидна
4'h1: ac97_sdata_out <= l_cmd_v; / / командване адрес валидна
4'h2: ac97_sdata_out <= l_cmd_v; / / командване данни валидна
4'h3: ac97_sdata_out <= l_left_v; / / левица данни валидна
4'h4: ac97_sdata_out <= l_right_v; / / Право данни валидна
По подразбиране: ac97_sdata_out <= 1'b0;
endcase
иначе ако ((bit_count> = 16) & & (bit_count <= 35))
/ / Слот 1: командване адрес (8-бита, наляво оправдано)
ac97_sdata_out <= l_cmd_v?l_cmd_addr [35-bit_count]: 1'b0;
иначе ако ((bit_count> = 36) & & (bit_count <= 55))
/ / Слот 2: командването на данни (16-бита, наляво оправдано)
ac97_sdata_out <= l_cmd_v?l_cmd_data [55-bit_count]: 1'b0;
иначе ако ((bit_count> = 56) & & (bit_count <= 75))
започва
/ / Слот 3: ляв канал
ac97_sdata_out <= l_left_v?l_left_data [19]: 1'b0;
l_left_data <= (l_left_data [18:0], l_left_data [19]);
край
иначе ако ((bit_count> = 76) & & (bit_count <= 95))
/ / Слот 4: Право канал
ac97_sdata_out <= l_right_v?l_right_data [95-bit_count]: 1'b0;
още
ac97_sdata_out <= 1'b0;
bit_count <= bit_count 1;
край
край / / винаги @ (posedge ac97_bit_clock)
Винаги @ (negedge ac97_bit_clock) започва
ако ((bit_count> = 57) & & (bit_count <= 76))
/ / Слот 3: ляв канал
left_in_data <= (left_in_data [18:0], ac97_sdata_in);
иначе ако ((bit_count> = 77) & & (bit_count <= 96))
/ / Слот 4: Право канал
right_in_data <= (right_in_data [18:0], ac97_sdata_in);
край
endmodule-------------------------------------------------- -
----- Частта VHDL започва тук ---------------------
-------------------------------------------------- -
библиотека IEEE;
използване IEEE.STD_LOGIC_1164.ALL;
използване IEEE.STD_LOGIC_ARITH.ALL;
използване IEEE.STD_LOGIC_UNSIGNED.ALL;
предприятието е AC97
порт (
готови: Няма std_logic;
command_address: в std_logic_vector (7 downto 0);
command_data: в std_logic_vector (15 downto 0);
command_valid: в std_logic;
left_data: в std_logic_vector (19 downto 0);
right_data: в std_logic_vector (19 downto 0);
left_valid: в std_logic;
right_valid: в std_logic;
left_in_data: std_logic_vector вън (19 downto 0);
right_in_data: std_logic_vector вън (19 downto 0);
ac97_sdata_in: в std_logic;
ac97_bit_clock: в std_logic;
нулиране: в std_logic;
ac97_sdata_out: Няма std_logic;
ac97_synch: Няма std_logic);
края AC97;
архитектура ac97_arch на AC97 е
сигнал bit_count: естествен обхват от 0 до 0255;
сигнал l_cmd_addr: std_logic_vector (19 downto 0);
сигнал l_cmd_data: std_logic_vector (19 downto 0);
сигнал l_left_data: std_logic_vector (19 downto 0);
сигнал l_right_data: std_logic_vector (19 downto 0);
сигнал l_cmd_v: std_logic;
сигнал l_left_v: std_logic;
сигнал l_right_v: std_logic;
сигнал left_in_data_DUMMY: std_logic_vector (19 downto 0);
сигнал right_in_data_DUMMY: std_logic_vector (19 downto 0);
започва
right_in_data <= right_in_data_DUMMY;
left_in_data <= left_in_data_DUMMY;
synchSignal: процес (ac97_bit_clock, проучване)
започва
ако rising_edge (ac97_bit_clock), тогава
--- Генериране на синхронизиране на сигнала
ако (нулиране = "1"), тогава
готови <= "0";
ac97_sdata_out <= "0";
ac97_synch <= "0";
bit_count <= 0;
l_cmd_v <= "0";
l_left_v <= "0";
l_right_v <= "0";
още
ако (bit_count = 255) след
ac97_synch <= "1"; - Начало на Tags (Slot0)
крайна сметка, ако;
ако (bit_count = 15), тогава
ac97_synch <= "0"; - Край на етикет
крайна сметка, ако;
- Създаване на готови сигнал
ако (bit_count = 128) след
готови <= "1";
крайна сметка, ако;
ако bit_count = 2 тогава
готови <= "0";
крайна сметка, ако;
- Затвори потребителски данни в края на всеки кадър.Това гарантира, че
- Първият кадър след проучване ще бъдат празни.
ако (bit_count = 255) след
l_cmd_addr <= command_address & "000000000000";
l_cmd_data <= command_data & "0000";
l_cmd_v <= command_valid;
l_left_data <= left_data;
l_left_v <= left_valid;
l_right_data <= right_data;
l_right_v <= right_valid;
крайна сметка, ако;
ако (bit_count> = 0) и (bit_count <= 15), тогава
- Слот 0: Tags
bit_count случай е
при 0 => ac97_sdata_out <= "1"; - Рамка валидна
когато 1 => ac97_sdata_out <= l_cmd_v; - командване адрес валидна
при 2 => ac97_sdata_out <= l_cmd_v; - командване данни валидна
когато 3 => ac97_sdata_out <= l_left_v; - левица данни валидна
при 4 => ac97_sdata_out <= l_right_v; - Право данни валидна
когато другите => ac97_sdata_out <= "0";
края случай;
ELSIF (bit_count> = 16) и (bit_count <= 35), тогава
- Слот 1: командване адрес (8-бита, наляво оправдано)
ако l_cmd_v = "1" и след това
ac97_sdata_out <= l_cmd_addr (35-bit_count);
още
ac97_sdata_out <= "0";
крайна сметка, ако;
ELSIF ((bit_count> = 36) и (bit_count <= 55)), тогава
- Слот 2: командването на данни (16-бита, наляво оправдано)
ако l_cmd_v = "1" и след това
ac97_sdata_out <= l_cmd_data (55-bit_count);
още
ac97_sdata_out <= "0";
крайна сметка, ако;
ELSIF ((bit_count> = 56) и (bit_count <= 75)), тогава
- Слот 3: Ляв канал
ако l_left_v = "1" и след това
ac97_sdata_out <= l_left_data (19);
още
ac97_sdata_out <= "0";
l_left_data <= l_left_data (18 downto 0) & l_left_data (19);
крайна сметка, ако;
ELSIF ((bit_count> = 76) и (bit_count <= 95)), тогава
- Слот 4: Право канал
ако l_right_v = "1" и след това
ac97_sdata_out <= l_right_data (95-bit_count);
още
ac97_sdata_out <= "0";
крайна сметка, ако;
още
ac97_sdata_out <= "0";
bit_count <= bit_count 1;
крайна сметка, ако;
крайна сметка, ако; - проучване
крайна сметка, ако; - ac97_bit_clock
край процес synchSignal;
- Входящи AC97 връзка рамка
входящи: процес (ac97_bit_clock)
започва
ако falling_edge (ac97_bit_clock), тогава
ако (bit_count> = 57) и (bit_count <= 76) след това
- Слот 3: ляв канал
left_in_data_DUMMY <= left_in_data_DUMMY (18 downto 0) & ac97_sdata_in;
ELSIF (bit_count> = 77) и (bit_count <= 96) след това
- Слот 4: десния канал
right_in_data_DUMMY <= right_in_data_DUMMY (18 downto 0) & ac97_sdata_in;
крайна сметка, ако;
крайна сметка, ако;
край процес входящи; - края на входящите
края ac97_arch;