Имеем: отладочную плату ML605 (Virtex-6).
Задача: помигать светодиодами.
Беру клок от встроенного генератора (200МГц), и пишу к нему два делителя частоты на 100 и 1’000’000 (думаю не принципиально, сколько и как делить). Подключаем последовательно, и на выходе получаем клок в 2Гц. Этим клоком тактируем сдвиговый регистр (в котором изначально записано “00001”). Изначально клок от генератора идёт по дифференциальной паре, поэтому ещё один компонент обязан это исправить (IBUFDS).
Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity BPI_MultiBoot_Module_A is
Port (
sys_clk_in_pn : in std_logic_vector(1 downto 0); --- Differential 200 Mhz clock input
LED_REVXX : out std_logic_vector(4 downto 0)--- LED
);
end BPI_MultiBoot_Module_A;
architecture Behavioral of BPI_MultiBoot_Module_A is
---
--- объявление компонентов удалено
---
begin
----- Instantiation of all modules -------
--Differential Clock input 200Mhz --
Inst_CLOCK_DIFF_IN: CLOCK_DIFF_IN PORT MAP(
diff_clock_in => sys_clk_in_pn,
Master_clock => CLK_Single_Out
);
--- Clock divide by ------
Inst_Clock_200mhz_div_10: Clock_200mhz_div_10 PORT MAP(
clock_200mhz_in => CLK_Single_Out,
clock_2mhz_out => CLK_IN
);
--- Clock divide by for LED display------
Inst_clk_div_10k: clk_div_10k PORT MAP(
clk_in_4_div => CLK_IN,
div_10k_out => CLK_MST_OUT
);
-- LED Status --
Inst_LED_Disp_assign: LED_Disp_assign PORT MAP(
led_out => LED_REVXX,
clk => CLK_MST_OUT
);
-- LED Status --
end Behavioral;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity BPI_MultiBoot_Module_A is
Port (
sys_clk_in_pn : in std_logic_vector(1 downto 0); --- Differential 200 Mhz clock input
LED_REVXX : out std_logic_vector(4 downto 0)--- LED
);
end BPI_MultiBoot_Module_A;
architecture Behavioral of BPI_MultiBoot_Module_A is
---
--- объявление компонентов удалено
---
begin
----- Instantiation of all modules -------
--Differential Clock input 200Mhz --
Inst_CLOCK_DIFF_IN: CLOCK_DIFF_IN PORT MAP(
diff_clock_in => sys_clk_in_pn,
Master_clock => CLK_Single_Out
);
--- Clock divide by ------
Inst_Clock_200mhz_div_10: Clock_200mhz_div_10 PORT MAP(
clock_200mhz_in => CLK_Single_Out,
clock_2mhz_out => CLK_IN
);
--- Clock divide by for LED display------
Inst_clk_div_10k: clk_div_10k PORT MAP(
clk_in_4_div => CLK_IN,
div_10k_out => CLK_MST_OUT
);
-- LED Status --
Inst_LED_Disp_assign: LED_Disp_assign PORT MAP(
led_out => LED_REVXX,
clk => CLK_MST_OUT
);
-- LED Status --
end Behavioral;
Код
architecture Behavioral of LED_Disp_assign is
signal led_pattern : std_logic_vector(4 downto 0):= "00001";
begin
led_display: process(clk)
begin
if clk'event and clk='1' then
led_pattern <= led_pattern(3 downto 0) & led_pattern(4);
end if;
led_out <= led_pattern;
end process led_display;
end Behavioral;
signal led_pattern : std_logic_vector(4 downto 0):= "00001";
begin
led_display: process(clk)
begin
if clk'event and clk='1' then
led_pattern <= led_pattern(3 downto 0) & led_pattern(4);
end if;
led_out <= led_pattern;
end process led_display;
end Behavioral;
Код синтезируется (хотя есть варнинг по поводу того, что led_pattern не включён в список чувствительности led_display: process(clk)).
При implementation проекта вываливается ещё варнинга, что неплохо бы было использовать вход CE.
После после создания прошивки пытаюсь залить через iMPACT идёт долгий процесс записи (минут 25) памяти конфигуратора (*.mcs), а на 70% процесс обрывается ошибкой. При попытке конфигурирования кристалла (*.bin) через JTAG ChipScope тут же выдаёт что
ERROR: Wrong configuration stream for device
ERROR: Configuration failed.
Сдаётся мне, что при создании проекта я задаю неверные установки, но перелистав их несколько раз, не могу найти ошибку… Подскажите, на какие грабли я наступаю, где искать спасения? Ну и советы какие-нибудь, тоже рад был бы услышать.
P/S/ IO настроил следующим через *.ucf
Код
# differential clock input 200Mhz
NET "sys_clk_in_pn<0>" LOC = "J9";
NET "sys_clk_in_pn<1>" LOC = "H9";
NET "LED_REVXX<0>" LOC = "AD21";
NET "LED_REVXX<1>" LOC = "AH28";
NET "LED_REVXX<2>" LOC = "AH27";
NET "LED_REVXX<3>" LOC = "AE21";
NET "LED_REVXX<4>" LOC = "AP24";
NET "sys_clk_in_pn<0>" LOC = "J9";
NET "sys_clk_in_pn<1>" LOC = "H9";
NET "LED_REVXX<0>" LOC = "AD21";
NET "LED_REVXX<1>" LOC = "AH28";
NET "LED_REVXX<2>" LOC = "AH27";
NET "LED_REVXX<3>" LOC = "AE21";
NET "LED_REVXX<4>" LOC = "AP24";