Спойлер
Теперь можно снова запускать Implement Design и радоваться появлению зелёного кружка против "Fit" и "Generate programming file". В процессе сборки наверняка выскочит куча предупреждений.
WARNING:Xst:646 - Signal <out_seg4<6:3>> is assigned but never used. - Ожидаемое предупреждение. Выходы есть, но никуда не подключены. Мы же сами только что их отсоединили.
WARNING:Xst:2734 - Property "use_dsp48" is not applicable for this technology. - На это можно не обращать внимания - документированный глюк.
Теперь можно было бы сесть за паяльник и паять схему. Ан нет. Чуть погодим. Если посмотреть отчет, можно найти, что выводы назначены совершенно неприемлимо. Для нас. Для САПРа это может и приемлимо. Поэтому в панели Processes выполним User Constraints -> Assign package pins. Расположение выводов, я пока оставлю на ваше усмотрение.
Спойлер
Спойлер
Тем же, у кого не нашлось ЖКИ для этой конструкции могут подключить их к четырём семисегментным светодиодным индикаторам. Для этого вход polarity модулей bin2seg надо отключить от цепи common и подключить к лог.1 или лог.0 в зависимости от того, какой индикатор и какие ключи вы будете использовать - с общим катодом или анодом. Рекомендую изучить Application Note xapp805.pdf с сайта http://www.xilinx.com. В общем случае, рекомендуется применять индикаторы с общим анодом и током через сегменты не более 8мА - тогда можно обойтись без дополнительных ключей.
Что касается лично меня, меня никогда не привлекала перспектива паять 4 индикатора АЛС324, а уж тем более делать разводку из 28 сигналов, которые надо протащить к такому частоколу контактов. Мне нравилось использовать светодиодные индикаторы с динамической индикацией - всего 12 контактов, и, готово! Что-ж, вторая конструкция будет на светодиодных индикаторах с динамической индикацией. Как я уже упоминал выше, для облегчения схемы будем использовать индикаторы с общим анодом. Динамическая индикация осуществляется следующим образом: в каждый момент времени активное напряжение подается на общий вывод одного разряда и в это же время на выводы сегментов подаются сигналы соответсвующие отображаемому в данном знакоместе символу. Через некоторый интервал времени активизуется другой разряд и на сегменты подается комбинация, соответствующая уже этому разряду. И так по-очереди перебираются все разряды (кстати, необязательно перебирать именно разряды, можно перебирать и сегменты). При этом нужно только обеспечить, чтобы все разряды были активны одинаковое время в течение периода и период был достаточно мал. Какую частоту мы выберем для своей конструкции? Так как у нас на вход подается частота 32 кГц и постепенно десятью делителями на 2 делится до 32 Гц, у нас уже наличествует целый спектр частот: 16384, 8192, 4096, 2048, 1024, 512, 256, 128 и 64 Гц. Частоту развертки следует выбирать достаточно высокую, но и слишком не жадничать. Можно выбрать 64 Гц - уже будет достаточно, но человек боковым зрением всё же мерцания такой частоты еще замечает, поэтому возмем за основу 128 Гц. Так как у нас 4 разряда, то для тактирования переключений разрядов следовало бы взять частоту в 4 раза выше частоты развертки. Так обычно поступают, но не в нашем случае - счетчики уже есть, поэтому из модуля divider1024 нам достаточно отобрать частоты 128 и 256 Гц. Они и дадут сигналы, комбинацию которых мы и будем использовать, какой разряд в данный момент засветить. Для отбора этих частот немного видоизменим модуль divider1024:
Код: Выделить всё
entity divider1024 is
Port ( clk_input : in STD_LOGIC;
f_dyn : out STD_LOGIC_VECTOR (1 downto 0);
out32 : out STD_LOGIC);
end divider1024;
architecture Behavioral of divider1024 is
signal counter: std_logic_vector (9 downto 0);
begin
process (clk_input)
begin
if (clk_input'event and clk_input='1') then
counter <= counter+1;
End if;
end process;
out32 <= counter(9);
f_dyn <= counter(7 downto 6);
End Behavioral;Сам же "модуль" динамической индикации в данном случае состоит из дешифратора, который активизирует разряды, и мультиплексора, который коммутирует выходы счетчиков на дешифратор двоичного кода в семисегментный:
Код: Выделить всё
entity dynamic is
Port ( f_dyn : in STD_LOGIC_VECTOR (1 downto 0);
data0 : in STD_LOGIC_VECTOR (3 downto 0);
data1 : in STD_LOGIC_VECTOR (3 downto 0);
data2 : in STD_LOGIC_VECTOR (3 downto 0);
data3 : in STD_LOGIC_VECTOR (3 downto 0);
grid_sel : out STD_LOGIC_VECTOR (3 downto 0);
data_out : out STD_LOGIC_VECTOR (3 downto 0)
);
end dynamic;
architecture Behavioral of dynamic is
with f_dyn select
grid_sel <= "0001" when "00",
"0010" when "01",
"0100" when "10",
"1000" when "11",
(others => '-') when others;
with f_dyn select
data_out <= data0 when "00",
data1 when "01",
data2 when "10",
data3 when "11",
(others => '-') when others;
end Behavioral;Спойлер
Спойлер
Код: Выделить всё
div_out <= div_in when a_sel = "10" else '0';


