Хозяин барин, если железка какая нужна стукни в личку, да и не только тебе, есть у меня запасы, лежат мертвым грузом. Поделюсь если надо для дела. Все выше перечисленное есть и еще тележка. :)
Вид для печати
По-моему, вы отстали от жизни. Уже давно есть Марсоход2, а это третий циклон и программатор на борту (правда доморощенный, но драйвер для кактуса у них есть).
Viktor2312
Как вариант
http://www.digilentinc.com/Products/...90&Prod=BASYS2
Есть и др. конторы...
[QUOTE=MVV;744001]А так ещё интересней :)
[CODE]process(clock,res) - реагируем на событие
begin
if (clock'event and clock='0') then
if res='0' then
del <= "00";
else
del <= del + 1;
end if;
end if;
end process;
:)
синзронизм я правильно понял?
дружище если ты так будешь "копипастить"то смысла то 0, с таким же успехом можно взять книжку Бибило П.Н, :)
Добрый день!
Заинтересовало Ваше предложение, как связаться?
В этом деле (ПЛИС) я очень начинающий. Попытался что-то сделать на EPM7032SL, но когда доходит до программирования полный облом: не видит программа эту микросхему. Уже вроде все перепробовал - пишет сокет пустой. Может уже микросхему испортил ... Программа Max+plus 2.
. Форум глючит
VladimirS
Если выдернули с какого то девайса, то как правило используются все ноги мелкой плисины, и без "хитродорогогопоргаммер " ее не прошить.
Тут тема есть спецом ,
http://zx-pk.ru/showthread.php?t=9342
по железкам.
В личку кидайте, что хотите просто чип или сразу платку, самоделки я уже почти все раздал, но готовые платки еще должны быть. Сразу скажу, что 1 микруху я слать не буду, бонусы в комплекте
Viktor2312
я так и понял, извини за флуд, если нужны железки обращайся, пришлю.
касается не только плисинок
На Verilog можно проще
reg [15:0] out;
reg [3:0] int;
always @ *
begin
out = 0;
out[in] = 1'b1;
end
Давайте без верилога в этой теме. Третий раз уже посты выпиливаю...
Я тоже пишу на верилоге, но 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.
Задачка уже по силам? :)
Я пока слабо представляю, что это за 580ВМ80 такой 64-хбитный :)
В реале они как-то попроще будут...
И как ты его собираешься реализовывать?
Частотомер на ПЛИС?
Для такой задачи более подходят микроконтроллеры...
Не знаю, надо что-то другое...
---------- Post added at 22:07 ---------- Previous post was at 21:58 ----------
Вот тебе задачка, "близкая к реальности".
Имеем входящий клок 20МГц.
Нужно синтезировать два синхросигнала, горизонтальной и вертикальной развертки VGA.
Вот тебе картинка с времянками сигнала:
http://savepic.org/6206519.png
Калькулятор виндовый тебе в помощь! Все решается прекрасно с его помощью :)
Как всегда, я выложу свой вариант сюда под спойлер.
Скрытый текст
Код:library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.STD_LOGIC_unsigned.ALL;
entity divider is
port(
CLK : in std_logic;
H_SYNC : out std_logic;
V_SYNC : out std_logic
);
end divider;
architecture syn of divider is
signal vcnt : std_logic_vector(9 downto 0);
signal hcnt : std_logic_vector(9 downto 0);
begin
process(CLK)
begin
if rising_edge(CLK) then
if (hcnt(9 downto 7)="101") then -- 640 точек дают 32мкс на частоте 20МГц
hcnt <= "0000000000";
if (vcnt="1000001100") then -- 524 строчки. 524*32мкс=16768мкс, что примерно 16,77мс.
vcnt <= "0000000000";
else
vcnt <= vcnt+1;
end if;
else
hcnt <= hcnt+1;
end if;
if (hcnt=520) then
H_SYNC <= '0';
elsif (hcnt=600) then
H_SYNC <= '1';
end if;
if (vcnt=490) then
V_SYNC <= '0';
elsif (vcnt=493) then
V_SYNC <= '1';
end if;
end if;
end process;
end syn;
[свернуть]
http://savepic.org/6193220.png
---------- Post added at 22:55 ---------- Previous post was at 22:07 ----------
Я свой код выложил под спойлер. Диаграмма прилагается, времянки там соответствуют требуемым (плюс/минус чуть-чуть, допускается).
---------- Post added at 23:21 ---------- Previous post was at 22:55 ----------
Добавил немножко кода, чтобы проверить проект "вживую".
http://savepic.org/6222941.jpg
---------- Post added at 23:34 ---------- Previous post was at 23:21 ----------
http://savepic.org/6162527.jpg
Для начала тебе нужны два счетчика, горизонтальный и вертикальный.
Горизонтальный должен считать такты на всю строку, включая синхро и гашение.
Полный такт - 31,77мкс (32 округленно).
20МГц = 0,00000005 сек/точку. = 0,05мкс/точку.
Нам нужно 32мкс на строку.
Значит, точек в строке нужно 32/0,05=640.
Делаем счетчик до 640, чтобы потом сбрасывался в ноль.
Вертикальный счетчик. 16784мкс на один фрейм. Строчка занимает 32 мкс.
Итого - 16784/32=524 строчки. Лепим счетчик на 524.
Счетчики тикают, по клоку увеличивается горизонтальный, по сбросу горизонтального в ноль - увеличивается вертикальный.
А тем временем проверяется содержимое счетчиков и в нужные моменты дергаем сигналы синхронизации вниз-вверх. Вот и вся кухня.
Не, никуда не годится...
Наверное надо было начать со счетчиков вообще, а не со сразу непонятной задачи.
Давай разобьем на этапы.
Как сделать счетчик, например, до 260?
Сколько разрядов счетчика нам потребуется, чтобы досчитать до этого числа?
Помним, что байт (8 бит) вмещает в себя максимум 256 комбинаций.
Следовательно, чтобы считать в диапазоне выше 256 импульсов, нужно добавить еще один разряд. Теперь мы сможем считать до 511, а количество состояний счетчика - 512.
Объявляем сигнал - signal counter: std_logic_vector(8 downto 0);
После объявления типа std_logic_vector мы пишем количество двоичных разрядов сигнала (счетчика, шины, регистра...) и их логическое размещение.
Здесь могут быть два варианта - 8 downto 0 и 0 upto 8.
Первый вариант означает, что левым (старшим) разрядом при операциях с сигналом будет старший бит. Так оно обычно всегда и делается, это просто логично. Ведь нулевой разряд у нас всегда находится справа (младший). Но для особых случаев можно воспользоваться и вторым вариантом, развернув байт.
Далее...
Как нам сделать, чтобы счетчик, дотикав до нужного числа, сбросился и начал отсчет снова?
На рассыпной логике для этой цели к счетчикам типа ИЕ5/ИЕ7 добавляют мелкологику. Здесь происходит аналогично.
Логика постоянно мониторит состояние битов счетчика и по совпадению с заданным числом дает сигнал сброса на счетчик.
Для нашего случая можно сделать например так, чтобы сброс был на 260:
А если нам нужно, как в случае с синхросигналами, запустить последовательно два счетчика?Код:process(CLK)
if (rising_edge(CLK)) then --всё должно быть синхронно!
if (counter=259) then --нужная цифра минус один, ведь 0 - тоже входит в счет
counter <= "000000000"; --в данном случае кактус не любит десятичные числа
else
counter <= counter + 1;
end if;
end if;
end process;
Чуть-чуть напрягаем мозг, и соображаем, что конструкцию второго счетчика проще всего воткнуть прямо в тот же процесс, где сидит и первый. Ведь там уже есть готовый момент, когда первый счетчик уходит в ноль? Да, это строчка counter <= "000000000";
Поэтому прямо под ней мы может вкошачить второй счетчик. Во второй - третий, и так до бесконечности :)
Давай, второй счетчик у нас будет до... 33, например.
Считаем необходимую разрядность - 6. Значит, нужны разряды от 0 до 5.
Описываем сигнал и - поехали...
Код:process(CLK)
if (rising_edge(CLK)) then
if (counter=259) then
counter <= "000000000";
if (counter1=33) then
counter1 <= "000000";
else
counter1 <= counter1 + 1;
end if;
else
counter <= counter + 1;
end if;
end if;
end process;
---------- Post added at 09:28 ---------- Previous post was at 09:04 ----------
А как нам определить, когда счетчик достиг нужного значения, чтобы соответствующим образом отреагировать? Просто смотрим, сколько он там насчитал, состояние счетчика всегда доступно.
Но и тут есть нюанс. ПЛИС - быстра, но и в ней после каждого импульса разряды устаканиваются не моментально. Если просто сделать типа
А <= '1' when (counter=100) else '0';
то возможно появление "иголок" в сигнале А.
Тут можно использовать принцип, что к следующему сигналу клока все разряды счетчика уже успокоились и показывают правильное значение.
Поэтому можно или создать регистр, разрядностью равный счетчику, и по фронту клока записывать в него текущее состояние счетчика. Тогда можно обычной логикой следить за состоянием счета.
Или можно смотреть счет в процессе, который тактируется тем же клоком, что и счетчик.
Вот один из вариантов. Можно делать это немножко по разному.Код:process(CLK)
if (rising_edge(CLK)) then
if (counter=259) then
counter <= "000000000";
else
counter <= counter + 1;
end if;
if (counter=100) then
A <= '1';
else
A <= '0';
end if;
end if;
end process;
---------- Post added at 09:35 ---------- Previous post was at 09:28 ----------
потому что время между кадровыми синхроимпульсами равно 16,784мс по документации. А обеспечить это время мы можем только количеством строк. Каждая строка выводится на экран монитора за 32 микросекунды.
И если мы выведем 524 строки по 32мкс каждая, то мы и получим эти несчастные 16,7миллисекунд на один фрейм (экран).
Допустимо оба варианта.
---------- Post added at 13:20 ---------- Previous post was at 13:17 ----------
Да, но не сейчас, пускай в голове пока оседает необходимый минимум.
И у меня, например, привычка обходиться без others, поскольку иногда требуется какой-либо битик поднять.
Но это дело сугубо личное :)
---------- Post added at 13:23 ---------- Previous post was at 13:20 ----------
Просто может быть непривычно, что сравнивать значения в многоразрядных сигналах можно с десятичными цифрами, а вот присваивать - ни в коем разе.
---------- Post added at 13:28 ---------- Previous post was at 13:23 ----------
Это выражение означает, что всем разрядам присваивается '0'.
По сути это тоже самое, и даже выглядит солидней. Но это - дело вкуса.
Да, классическая 24.5 или 25 вроде, на материнках можно увидеть старых.
Ничего страшного нет. Тем более, у нас учебный пример, который тем не менее работает :)
Да, конечно только один такт.
А кто тебе мешает вместо else написать elsif и написать второе условие для отключения?
1. Именно FPGA? Самый маленький - EP1C3T100C8. Не, 155ТМ8 туда не влезет... Но туда влезает Орион-128 с парой десятков корпусов, с процессором Z80, горой еще всякого разного и чуть-чуть не умещается AY-2910 поверх всей этой кучи....... :)
2. Дребезг устраняется программно, самим кодом в ПЛИС. Ну или лепи переключающие кнопки с триггерами, дабы делать это внешне. Проще, наверное, микроконтроллер снаружи прикрутить, чтобы он дребезг устранял. Хотя... Это снова код писать, теперь уже для МК :)
---------- Post added at 23:24 ---------- Previous post was at 23:20 ----------
Кстати, напиши тренировки ради код антидребезга для ПЛИС.
Алгоритм, например, такой - процесс, тактируемый клоком. В нем слушаем входной пин. Как только уровень изменился, по клоку начинает расти счетчик. Если сигнал на входе пропал - счетчик обнуляется. Если же он набрал десятка три импульсов - считать, что кнопа нажата выдачей соответствующего сигнала.
Вот и вся премудрость :)
MVV, я уже неделю из-под девборды не вылезаю :)
Viktor2312, для нее потребуется генератор, конфпзу не меньше EPCS1, стабилизаторы линейные на 3,3 и 1,5 вольт. Ну и разъем для бластера. Это минимум для работы.
У меня такая платка с этим циклоном размером со спичечный коробок. Макетку купи, TQFP-0,5 х 100.
---------- Post added at 23:58 ---------- Previous post was at 23:56 ----------
MVV, не делай вид, что ты не читал названия темы :)
ну хочет человек на плисе собрать то, что делается на МК за полбакса... Не мешай ему :)
Не, типы можно брать любые. ПЛИСа кушает немного, 1,5 вольта ей надо для питания ядра (VCCINT) и модуля PLL (VCCA_PLL1). Можно мелкий стабик подобрать. Питание 3,3 идет на периферию, питание пинов образно говоря (VCCIO).
И там, и там хорошо подходят стабики серии 1117 в корпусе... Блин, мелкие такие, миллиметров 6х6 с двумя лапами и задней стенкой-площадкой под пайку.
Генератор - любой, лишь бы 3.3 вольта сигнал выдавал. Можно в DIP, можно MLF, можно как хочешь, хоть ЛН1 с кварцем.
Сигнал заводить на вход CLK0 (10 пин).
Про подключение всех тряхомудии для программирования самого циклона и его конфПЗУ прочитай в статье про конфпзу, ссылка на нее в первом посте есть :)
Там несколько резисторов понадобится. Ну и кучка конденсаторов 0.1 для питания.
---------- Post added at 09:09 ---------- Previous post was at 09:07 ----------
Подойдет. Можно также EPCS4, у нее объем в четыре раза больше, подойдет и для более жирных циклонов. Но она подороже.
---------- Post added at 09:10 ---------- Previous post was at 09:09 ----------
Вроде как это означает PBfree, тоесть нам пофигу абсолютно. Они все сейчас с индексом N идут.
---------- Post added at 09:13 ---------- Previous post was at 09:10 ----------
В данном случае тебе схема антидребезга и не нужна вовсе...
Без нажатия кнопы импульсы все равно не пойдут, поэтому любую помеху на входе можно достоверно считать нажатием. Но - хозяин-барин :)
Будет. Можно было и попроще:
q <= d when (rising_edge(clk));
Самые обычные стабы. Для 1,5 вольта нужно купить настраиваемый, LM1117-ADJ. К нему цепляешь два резистора (калькуляторы в интернетах) и получаешь любое напряжение на выходе.
Обычно указывается максимальная частота... Не знаю, но по сути - любая. Ты все равно можешь синтезатором частот получить любую. Ну, поставь мегагерц на 10...
А толку-то... Собирай девборду, тогда уже и можно браться за проекты посерьезней.
Разъем для программатора есть?
Разъем питания?
Чип-конденсаторы на 0,1мкф есть? Штук 10-15.
Резисторы, 100е...1к...10к?
---------- Post added at 13:22 ---------- Previous post was at 13:11 ----------
Давай я тебе письмом отправлю чипик CPLD EPM3064ATC44? Потренируешься на ней.
Видеогенератор, причем даже с генерацией самой картинки, которую ты видел, легко влезает туда, и еще половина свободна остается.
хорошо, что у тебя хорошее зрение и твердая рука.:v2_dizzy_botan:
http://katalog.we-online.de/pbs/datasheet/82551500.pdf
http://savepic.org/6230507.jpghttp://savepic.org/6285802.jpg
ЛУТ + МГТФ, куда уж без него.. Зато - девбординка на EPM3064. Даже с генератором! :)
---------- Post added at 10:57 ---------- Previous post was at 09:55 ----------
Где здесь входные и выходные пины?
---------- Post added at 10:59 ---------- Previous post was at 10:57 ----------
У тебя bus просто увеличивается и всё?
А можно файлик платки ?
http://savepic.ru/6065975m.gif
Файлик я по неосторожности сделал в "типа шестом" sprint layoute. Была такая дурацкая версия. Поэтому расширение файла - .lay6
И никак не перенести в нормальнай лай...
Вот файлик.
Там уже исправлены несколько ошибок, которые есть на платке на фото.
Описывать проще как многоразрядные входы-выходы:
In : in std_logic_vector(9 downto 0)
А обращаться к ним можно так - In(3), In(7)....