Не исключаю что на VHDL возможна такая запись, гуру VHDL приведите пример, этот код с натяжкой показывает как раз разницу между функциональным и поведенческим описанием
Вид для печати
Не исключаю что на VHDL возможна такая запись, гуру VHDL приведите пример, этот код с натяжкой показывает как раз разницу между функциональным и поведенческим описанием
Всё корректно, молодец!
Из мелких добавлений - в данном случае, поскольку y_out нигде более в проекте не используется. а просто выводится наружу, его можно не использовать, а результаты дешифрации сразу отдавать в y.
И второе, в списке чувствительности процесса y_out также излишен. Его состояние никак не влияет на работу процесса, тем более, что это сигнал выходной.
Образно говоря, в список чувствительности вносим те сигналы, которые входят в условия if и case. Больше ничего не надо.
---------- Post added at 18:47 ---------- Previous post was at 18:46 ----------
Что это??? :)
Правильно ругается. нафига ты у засунул в список чувствительности? Я же тебе только что разъяснял, что это не нужно.
---------- Post added at 20:02 ---------- Previous post was at 20:00 ----------
вот это скомпилируй:
Код:library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.STD_LOGIC_arith.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity dc_1 is
port(a : in std_logic_vector (3 downto 0); -- Вход (8421).
y : out std_logic_vector (15 downto 0)); -- Выход 16 выводов.
end entity dc_1;
architecture id_1 of dc_1 is -- Дешифратор 4:16.
begin
process (a)
begin
case a(3 downto 0) is
when "0000" => y <= "0000000000000001";
when "0001" => y <= "0000000000000010";
when "0010" => y <= "0000000000000100";
when "0011" => y <= "0000000000001000";
when "0100" => y <= "0000000000010000";
when "0101" => y <= "0000000000100000";
when "0110" => y <= "0000000001000000";
when "0111" => y <= "0000000010000000";
when "1000" => y <= "0000000100000000";
when "1001" => y <= "0000001000000000";
when "1010" => y <= "0000010000000000";
when "1011" => y <= "0000100000000000";
when "1100" => y <= "0001000000000000";
when "1101" => y <= "0010000000000000";
when "1110" => y <= "0100000000000000";
when others => y <= "1000000000000000";
end case;
end process;
end id_1;
Верно :)
Я тут хочу еще одну задачку подсунуть. просто она мне полчаса назад свалилась в реале, от нашего общего коллеги Микка_А :)
Вот рисунок, это по сути - программа в квартусе, но в схемном вводе.
http://savepic.org/6184247.png
Задача - перевести эту схемку в VHDL.
Способы могут быть разные, разумеется.
В дополнение к задаче - пины у ПЛИСы могут быть не только на вход и выход и вход/выход, а еще и "выход с возможностью чтения (buffer)".
Я этим воспользовался, хотя это совсем и необязательно.
Код на VHDL написан за десять минут, под спойлером.
Скрытый текст
Код:library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.STD_LOGIC_unsigned.ALL;
entity divider is
port(
CLK : in std_logic;
Q : buffer std_logic_vector(9 downto 0)
);
end divider;
architecture arch of divider is
signal CNT : std_logic_vector(1 downto 0);
begin
CNT <= CNT+1 when (rising_edge(CLK));
Q(0) <= (CNT(0) and CNT(1));
Q(1) <= not(Q(0));
Q(2) <= ((not CNT(0)) and CNT(1));
Q(3) <= not Q(2);
Q(4) <= (CNT(0) and (not CNT(1)));
Q(5) <= not(Q(4));
Q(6) <= ((not CNT(0)) and (not CNT(1)));
Q(7) <= not(Q(6));
Q(8) <= (Q(0) or Q(2));
Q(9) <= (Q(4) or Q(6));
end arch;
[свернуть]
Viktor2312, всё правильно :)
Сейчас - вообще всё правильно.
---------- Post added at 21:54 ---------- Previous post was at 21:47 ----------
Саму мелкую логику (И, ИЛИ, НЕ) тоже не нужно как-либо отображать. Берешь выходы, и от них и пляшешь, вставляешь всю необходимую and-or-not прямо в булеву алгебру.
---------- Post added at 22:37 ---------- Previous post was at 21:54 ----------
История с этой задачей получила забавный поворот событий...
Вот диаграмма симуляции кода на VHDL:
http://savepic.org/6188380.png
И здесь - всё правильно, "бегущий огонь" плюс "бегущая тень" плюс еще два клока в противофазе.
Но когда запустили в симуляцию оригинал на схемном вводе....
http://savepic.org/6215007.png
Вот такая вот ботва... :)
Я, когда только начинал учиться работать с ПЛИСами, тоже сидел на "схематике".
Кстати, прошивка СМУК-2 сделана на нем.
Но тоже частенько натыкался на странную работу прошивки... Поэтому плюнул, растерел и ушел на VHDL. Потом уже, позже, разобрался с Verilog. И Скорпион-1024 для самодельной девборды писал на Верилоге, и проект СкорпЭво - тоже на верилоге. Но, первая любовь - самая чистая, VHDL мне нравится больше :)
Viktor2312, Вроде как всё похоже на правду :)
Ты у себя еще не поставил Кактус с симулятором?
---------- Post added at 11:27 ---------- Previous post was at 10:45 ----------
Только симуляция маленько бред выдает, проверь скобки приоритета и логику.
http://savepic.org/6165672.png
А ты убери лишние НЕ, станет проще :)
Оставь только И, а инверторы переставь на линии, на которых их небыло.
---------- Post added at 12:16 ---------- Previous post was at 12:13 ----------
Кстати, по диаграммам видно, что у тебя неправильно реализованы сигналы out_1_1 и out_1_2. И они тянут за собой мертвый out_or1
---------- Post added at 12:17 ---------- Previous post was at 12:16 ----------
А все остальное тикает как надо.
---------- Post added at 12:19 ---------- Previous post was at 12:17 ----------
Ладно, не будем тянуть кота за хвост, в строчке
out1_2a <= not cnt (0) and cnt (1);
надо просто поставить две скобки:
out1_2a <= not (cnt (0) and cnt (1));
и всё заработает правильно.
---------- Post added at 12:21 ---------- Previous post was at 12:19 ----------
http://savepic.org/6186147.png
Да, всё правильно, как один из вариантов.
Заглядывай :)
У меня давно блуждала мысль сделать ЮТ-88 на попуПЛИСной основе.
Т.е., берем настоящий 580ВМ80А, память статику 64кб, ПЗУ, индикаторы и CPLD.
Задача сама по себе копеечная, сел и сделал. Наверное хорошо, что я это так до сих пор и не сделал, ибо эту идею можно применить как темы следующих практических занятий :)
Для начала можно сделать на VHDL симуляцию 580ВК28.
По сути, там обычный двунаправленный буфер, направление которого определяется сигналами слова состояния ВМ80.
Какие биты за что отвечают - нам тоже известно.
Поэтому задача номер один - сделать дешифратор слова состояния в сигналы MEM_RD, MEM_WR, IO_RD, IO_WR.
Задачка уже по силам? :)