MVV, я здесь время с корыстью вообще никогда не провожу.
А что, обучение ты будешь оплачивать? Или уже сразу преподавать там будешь? :)
Вид для печати
MVV, я здесь время с корыстью вообще никогда не провожу.
А что, обучение ты будешь оплачивать? Или уже сразу преподавать там будешь? :)
При работе с ПЛИС рано или поздно нужно будет знакомиться с конечными автоматами (state mashine), думаю на примере антидребезга можно и ознакомиться с этой парадигмой программирования.
В принципе там ничего сложного и вкратце работу алгоритма антидребезга на конечном автомате можно описать пимерно так:
1. есть несколько устойчивых состояний - в данном случае их два.
2. для перехода из одного состояния в другое должны опрашиваться какие-то внешние события, либо соблюдение условий.
Под спойлером готовый фрагмент программы антидребезга, но попробуй сначала сам что-нибудь написать)
Скрытый текст
Можно конечно сам сигнал state использовать как output, но для наглядности ввёл его отдельно.Код:signal input: std_logic;
signal output: std_logic;
signal state: std_logic:=0;
signal counter: std_logic_vector (7 downto0):= '00000000';
process (clk,input,state)
if rising_edge(clk) then
if state = '0' then
if input='1' then
state <='1' ;
output<='1';
endif
else
counter <= counter +1;
if counter = '11111111' then
output<='0';
state<='0';
endif;
endif;
end if;
end process;
[свернуть]
Не? такой вариант не годится?Код:process(CLK,In_put,cnt)
begin
if (rising_edge(CLK)) then
if (In_put = x"3F") then -- ни одна из десяти кнопок не нажата, везде высокий
cnt <= "0000000000";
elsif (cnt /= 255) then -- счет до 255, и на этом тормозимся.
cnt <= cnt+1;
end if;
if (cnt = 255) then
Out_put <= not In_put; -- если дотикало, то на выход - единица в разр. нажатой кнопы.
end if;
end if;
end process;
---------- Post added at 15:26 ---------- Previous post was at 15:19 ----------
Не, я еще слишком маленький и глупый. Просто делюсь тем, чему сам научился. В том числе и благодаря тебе :)
У вас код антидребезга нерабочий.
Поясню:
1. код, который в процессе просто увеличивает счётчик когда на вход поступает '1', а так как '1' на входе будет появляться хаотично в течение небольшого промежутка времени, то и счетчик будет увеличиваться так же неравномерно - больше тот код ничего другого не делает.
2. int1_0 будет все время в единице, кроме одного периода тактовой когда счётчик будет в нулях.
в общем код нерабочий - я уже запутался - там вход сканируется только 1 период клока, а 255 клоков никак не влияет на результат.
смысл антидребезга немного по другому устроен:
1. ждём на входе '1' - если да идём к п.2
2. 256 (или сколько надо) периодов клока безразличны ко входу, после чего переходим к п.1.
К моему последнему варианту тоже относится?
---------- Post added at 15:43 ---------- Previous post was at 15:41 ----------
Пораскинув мозгами, да... Если проскочит ноль при зафиксированном уже нажатии, то всё начнется заново, со сброса в ноль выходного сигнала...
Надо отлавливать и нажатие, и отпускание.
Виктор, ты бы хоть источники указывал... Или названия сигналов свои придумывал :)
Скрытый текст
Код:if a=b then
c:=a;
elsif b<c then
d:=b;
b:=c;
else
do_it;
end if;
Learning By Example Using VHDL Advanced Digital Design With a Nexys 2 FPGA BoardКод:If statements may be used to specify conditional assignments or state transitions in a finite state machine:
case READ_CPU_STATE is
when WAITING =>
if CPU_DATA_VALID = '1' then
CPU_DATA_READ <= '1';
READ_CPU_STATE <= DATA1;
end if;
when DATA1 =>
-- other branches of the case statement
end case;
http://dl.rutracker.org/forum/dl.php?t=3701607
Digital Design Using Diligilent FPGA Boards VHDL/Active-HDL Edition
http://dl.rutracker.org/forum/dl.php?t=3701599
[свернуть]
Виктор, а если нажаты две кнопки одновременно?
А если расчет делается только на одну нажатую кнопу, то нафига столько антидребезгов?
Если у тебя существует необходимость обрабатывать неодиночные нажатия, то смысл в шифраторе теряется, он не может хранить код сразу нескольких кнопок.
Поэтому, нужно просто определиться, будут одиночные нажатия, и тогда ставь шифратор, и одиночный антидребезг. Или убирай шифратор и ставь кучу антидребезга.
Вы наверное говорите о приоритетном шифраторе:
http://gorgeous-karnaugh.com/ru/uche...shifrator.html
Скорее о шифраторе К1533ИВ1(74148)
http://www.ralfzimmermann.de/ttl_ic/74148.gif
Код:library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity sn74ls148 is
port(i:in std_logic_vector(7 downto 0);
s:in std_logic;
ys,yex:out std_logic;
y:out std_logic_vector(2 downto 0));
end sn74ls148;
architecture behav of sn74ls148 is
begin
ys<=NOT((NOT(s)) and ( i(0)) and ( i(1))and ( i(2))and ( i(3))and ( i(4))and ( i(5))and ( i(6))and ( i(7)));
yex<=NOT((NOT(s)) and ((NOT i(0)) or (NOT i(1)) or (NOT i(2)) or (NOT i(3)) or (NOT i(4)) or (NOT i(5)) or (NOT i(6)) or (NOT i(7))));
process(i,s)
begin
if(s='0')then
if(i(0)='0')then
y<="000";
elsif (i(1)='0')then
y<="001";
elsif (i(2)='0')then
y<="010";
elsif (i(3)='0')then
y<="011";
elsif (i(4)='0')then
y<="100";
elsif (i(5)='0')then
y<="101";
elsif (i(6)='0')then
y<="110";
elsif (i(7)='0')then
y<="111";
else
y<="XXX";
end if;
end if;
end process;
end behav;
Код:entity HW3Q1_148_Decoder is
Port ( EI : in STD_LOGIC;
Input : in STD_LOGIC_VECTOR (7 downto 0);
A : out STD_LOGIC_VECTOR (2 downto 0);
GS : out STD_LOGIC;
EO : out STD_LOGIC);
end HW3Q1_148_Decoder;
architecture Behavioral of HW3Q1_148_Decoder is
begin
A <= "111" when EI='1' else
"111" when EI&Input="011111111" else
"000" when EI&Input="011111110" else
"001" when EI&Input="011111101" else
"010" when EI&Input="011111011" else
"011" when EI&Input="011110111" else
"100" when EI&Input="011101111" else
"101" when EI&Input="011011111" else
"110" when EI&Input="010111111" else
"111";
EO <= '0' when EI='0' and Input="11111111" else
'1';
GS <= '1' when EI='1' or Input="11111111" else
'0';
end Behavioral;
Viktor2312, вы я так понял делаете связку типа:
кнопка(9..0) -> блок антидребезга(9..0) -> приоритетный шифратор(10 to 4) ИВ1 -> синхронный регистр хранения (4 bit) ИР16 -> дешифратор (4 to 10) ИД1 -> блок реле(9..10) с индикацией
Уже и не спрашиваю наф вам для этого FPGA а не CPLD и МК :)
Тогда Евгений прав - необходимости в 10 модулях антидребезга нет совсем, достаточно одного.
Нет - создаём сигнал который ORится со всеми кнопками, к нему применяем антидребезг, а потом выход антидребезга ORим с каждой кнопкой отдельно.
---------- Post added at 13:56 ---------- Previous post was at 13:24 ----------
Хотя нет - немножко неправильно - нужно подумать )
---------- Post added at 14:10 ---------- Previous post was at 13:56 ----------
примерно так:
1. создаём сигнал any_key который регистрирует факт нажатия любой кнопки - т.е. функция OR ко всем входам.
2. когда any_key = '1' запускаем счётчик (до 256 например)
3. вход каждой кнопки подключен к S-входу RS тригерра (у каждой кнопки свой триггер)
4. все R входы триггеров соединены с инвертированным выходом счётчика.
выигрыш в том что счётчик один а не десять, что значительно уменьшит занимаемые ресурсы.
Вроде должно работать )
Viktor2312, Это ByteBlasterMV.
Кстати, не помню где прочитал, но советуют ставить 74НС244. Вроде как работает лучше нашей АП5.
Я прочитал, что именно эксперименты показали, что 74НС244 лучше работают в байтбластере. Причем именно 74НС244.
---------- Post added at 20:16 ---------- Previous post was at 19:52 ----------
Ладно, спрошу здесь. Есть у меня USB Blaster. Знатоки, подскажите где взять для него дрова под XP?
Наборы "юного синклериста" уезжают своим новым хозяевам, для самых жаждущих познать и стать "поГроммистом" verilog, vhdl,ahdl -заказ подарков от деда мороза доступен по 24.10.2014. 12:00 MSK
всем удачи.
Скрытый текст
Totem, а у тебя не бегают случаем первые циклоны?
Вот этих EP1C3T144C8N в китайском радиомагазине полно :)
из магаза долго ждать, Дед Мороз рядом, тебе дружище, что "отгрузить"? пока в мешочке есть подарки?
В личке написал.
Интересно, а Виктор уже получил свой подарок? Неделю как отправил... Забанили его невовремя...
опять забанили чтоли ? ) за что
Во хмелю невоздержан :v2_dizzy_king:
Так, пока снегура ищет, в закромах флешки для
Ewgeny7, есть возможность упаковать еще, подарочков. Дедушке Морозу потом будет не досуг, определяйтесь до 16:00 MSK, кому железяк потребно.
Давайте что ли чуток продолжим практику.
Очередное задание. Делаем ШИМ (PWM).
Просто я параллельно с этой темой веду переписку с Миккой, там как раз эта темя затрагивалась.
Что такое ШИМ - вроде как все железячники должны знать.
Это способ "оформить" цифровой сигнал в подобие аналогового. Практическое применение - синтез аналогового уровня, или звука, или руление электромотором или светодиодом.
Принцип основан на изменении скважности выходящей с генератора ШИМ частоты. Чем больше соотношение "единицы" к "нулю", тем больше аналоговый уровень на RC (LC) фильтре перед потребителем сигнала. Естесственно, частота ШИМ обычно используется достаточно высокая, чтобы эффективней сгладить пульсации и отрезать высокочастотную составляющую фильтром.
Для светодиодиков, подключенных к ШИМ, в принципе достаточно поставить сглаживающий конденсатор параллельно лапам светика.
Давайте придумаем и изобразим ШИМ.
Техзадание.
Вход - клок, 1 мегагерц.
Выход - сигнал ШИМ, дискретность - 256 импульсов.
Уровень заполнения пока возьмем константой от балды, например - 63.
Т.е. мы должны получить сигнал ШИМ, где 63 кванта времени будет единица на выходе, а оставшиеся 256-63=193 - ноль.
Когда это будет сделано, привинтите восемь кнопочек на вход альтерки, чтобы уже можно было управлять ШИМом.
Готовый код, как обычно, будет под спойлером.
Скрытый текст
Код:library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity test is
port(
clk : in std_logic;
q : out std_logic
);
end test;
architecture arch of test is
signal cnt : std_logic_vector(7 downto 0);
begin
process(clk)
begin
if (rising_edge(clk)) then
if (cnt=0) then
q <= '1';
elsif (cnt=63) then
q <= '0';
end if;
cnt <= cnt+1;
end if;
end process;
end arch;
[свернуть]
http://savepic.org/6341015.png
скоро с вами буду учиться)
Ewgeny7, было бы круто, если бы книжку написал какую-нибудь по этому делу :)