Lessberg

Members
  • Публикации

    7
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

О Lessberg

  • Звание
    Новенький

Информация

  • Город
    Москва

Электроника

  • Стаж в электронике
    Менее года
  • Оборудование
    ПЛИС Altera DE2 Board Cyclone II EP2C 35F 672C6N
    Quartus II v12.1
    ModelSim v10.1b
  1. Реализация Uart На Плис

    Еще предложили приделать разрешающий сигнал для сдвигового регистра. Вот схема (то что ниже схемы. это просто заметки не относящиеся к этой схеме) Вот моя реализация схемы, для простоты расписал пока отдельными компонентами Сигнал разрешения "enable" подключаю к сдвиговому регистру Но в итоге передает все равно пачку Вариантов уже кучу испробовал.. может кто ткнет носом куда надо ?
  2. Реализация Uart На Плис

    не помогает Точно так же пачкой передает signal ovf_s:std_logic; signal flag_s:std_logic; ......... timeout:process(clk) variable cnt: std_LOGIC_vector(22 downto 0); variable ovf:std_logic:='0'; constant zero: std_LOGIC_vector(22 downto 0):="00000000000000000000000"; constant step: std_LOGIC_vector(22 downto 0):="00000000000000000000001"; constant max: std_LOGIC_vector(22 downto 0):="10011000100101001000000"; begin if(rising_edge(clk))then cnt:=cnt+step; if(cnt=max-3)then ovf:='1'; elsif(cnt=max)then ovf:='0'; cnt:=zero; end if; ovf_s<=ovf; end if; end process; Key:process(ovf_s) variable shift:std_logic_vector(2 downto 0); variable flag : std_Logic; begin if(rising_edge(ovf_s))then shift(2 downto 1):=shift(1 downto 0); shift(0):=TX_INT; if(shift="001")then flag:='1'; end if; flag_s<=flag; end if; end process; UART_Tx: process(CLK, RST_N, TxClk, TxBufEmpty, TX_INT, TXRead) variable TxBitCnt: integer range 0 to 9; begin if RST_N='0' then TxD<='1'; TxBitCnt:=0; TxBuf<=(others=>'0'); TxBufEmpty<='1'; TXRead<='0'; else if (rising_edge(clk) ) then if(flag_s = '1')then if TXRead='1' then TXRead<='0'; end if; if (TxBufEmpty='1' and TX_INT='0') then -- *** TXRead<='1'; TxBuf(7 downto 0)<=SW(7 downto 0); TxBufEmpty<='0'; end if; if (TxClk='1' and TxBufEmpty='0') then case TxBitCnt is when 0 => TxD<='0'; -- start bit TxBitCnt:=TxBitCnt+1; when 1|2|3|4|5|6|7|8 => TxD<= TxBuf(0); TxBuf<='1' & TxBuf(7 downto 1); TxBitCnt:=TxBitCnt+1; when 9 => TxD<='1'; -- stop bit TxBuf<='1' & TxBuf(7 downto 1); TxBitCnt:=0; TxBufEmpty<='1'; end case; end if; end if; end if; end if; end process UART_Tx;
  3. Реализация Uart На Плис

    хм.. ну прям чудеса творятся... Дорабатывал проверку на бит четности, и тут взял и стал передавать на ПК по 1 Байту ))).. сейчас еще проверю Почему так, не понимаю. Но меня это больше чем устраивает ))) Вот часть кода, где описывал бит четности. При такой записи бит четности работает (правда без оповещения об ошибке) и данные на ПК по 1 Байту передаются. Но все равно есть загвоздка... ЧТобы пердать следующий байт с другой информацией, требуется нажать кнопку сброса, и только потом кнопку передачи данных... Иначе не передаются данные. А т.к. сброс общий, то и пришедшие с ПК данные сбрасываются. Надо тоже доработать. when 9 => -- бит четности "1" a <= TxBuf (7 downto 0); b <= a(0) xor a(1) xor a(2) xor a(3) xor a(4) xor a(5) xor a(6) xor a(7); c <= parity xor b; -- parity константа равная "1" if c = parity then TxBuf <= TxBuf (6 downto 0) & '1'; end if;
  4. Реализация Uart На Плис

    Опять блок передатчика разбираю... Выкинул пока мысль о задержках, Добавил бит четности "1". Все работает. Но вот в чем проблема: Добавил сигнал выхода "error" сигнализировал об ошибке при передачи данных, если такова была, но светодиод всегда горит, тем самым говоря что данные всегда передаются с ошибкой.. хотя это не правда UART_Tx: process(CLK) begin if RST='0' then UART_TXD <= '1'; TxBitCnt <= 0; TxBuf <= (others => '0'); CntTX <= 0; TxReady <= '1'; elsif (rising_edge(CLK)) then if (TX_VALID = '0' and TxReady = '1') then TxBuf(7 downto 0) <= DATA_IN (7 downto 0); TxReady <= '0'; TxBitCnt <= 0; CntTX <= 0; end if; if (TxReady = '0') then if CntTX=(System_CLK/(UART_Speed)) then CntTX <= 0; case TxBitCnt is when 0 => UART_TXD <= '0'; -- старт бит TxBitCnt <= TxBitCnt+1; when 1|2|3|4|5|6|7|8 => UART_TXD <= TxBuf(0); TxBuf <= '0' & TxBuf(7 downto 1); TxBitCnt <= TxBitCnt+1; when 9 => -- бит четности "1" a <= TxBuf (7 downto 0); b <= a(0) xor a(1) xor a(2) xor a(3) xor a(4) xor a(5) xor a(6) xor a(7); c <= parity xor b; -- parity константа равная "1" if c = parity then TxBuf <= '1' & TxBuf (7 downto 1); TxBitCnt <= TxBitCnt+1; else error <= '1'; TxBitCnt <= TxBitCnt+1; end if; when 10 => UART_TXD <= '1'; -- стоп бит TxBuf <= (others => '0'); TxBitCnt <= 0; TxReady <= '1'; end case; else CntTX <= CntTX+1; end if; end if; end if; end process UART_Tx;
  5. Реализация Uart На Плис

    пока чтото не получается.... Вот компонент передатчик. При компиляции выдает ошибки... Лог ошибок Займусь пока проверкой четности, тут мне хоть понятно как должно работать. А вот с задержкой хоть и выложили пример готовый, но все равно тяжеловато понять
  6. Реализация Uart На Плис

    Сейчас буду пробовать. Спасибо за помощь!
  7. Реализация Uart На Плис

    Добрый день! Мне была поставлена задача реализовать UART приемопередатчик через com port RS-232 для обмена данными между ПЛИС и ПК. ПЛИС -> Altera DE2 Board Cyclone II EP2C 35F 672C6 (Вложен файл для визуального понимания работы проекта) ПК -----> Com Port Toolkit 4.0 Проект делаю в стандартной программе Алтеры: Quartus II v 12.1 Необходимо передать число от 0 до FF из ПК на ПЛИС и так же задав входные данных на ПЛИС передать на ПК. Я взял готовый проект: Доработав его под свои нужды получил следующие: 1. Вывод принятых данных с ПК на 2 семисегментных индикатора в формате от 00 до FF 2. Так же вывод дублируется на 8 светодиодов, дабы видеть соответствие двоичному коду. (более для удобства в отладке программы чем необходимость) 3. Данные для передачи с ПЛИС на ПК задаю 8 тумблерами. Данные для передачи так же выводятся на семисегментные индикаторы (HEX0 HEX1). По нажатию кнопки КЕЙ 0 данные передаются на ПК. Вот мой код: Что хотелось бы еще реализовать, но не получается в связи с недолгим изучением VHDL. 1. Самая важная ошибка, точнее недороботка заключается в том что с ПЛИС на ПК передается не 1 БАЙТ (8 бит) а целая пачка. Зависит конечно от времени нажатия на кнопку КЕЙ0 (передать данные). Стандартная скорость в проекте была 115200. Я пробовал уменьшить и минимальная скорость при которой проект работает верно это 300-600 БОД. К примеру при скорости 115200 передается примерно 100 Байт информации. При 300 БОД 9-10 байт. Если уж сильно постарать быстро нажать и отпустить кнопку передачи у меня выходило 4 байта ))) Пробовал ставить задержку из ряда Триггеров.. не особо помогло. Бьюсь уже не первый день не могу додуматься как в код внести условие чтобы передавал 8 Бит то есть 1 раз ,, данные которые введены на ПЛИС (тумблерами)по нажатию кнопки передачи. ​2. Вторая проблема она не так существенна, но хотелось бы что в проекте присутствовал бит четности. Логика работы его понятна, сложить все 8 бито по модулю 2 (xor). Далее сумму 8 бит сложить по модулю 2 с битом четности (пусть будет 1 (проверка на четность)) и уже результат их добавить как 9-ый бит к фрейму. Или как 0 - ой ? ЗЫ. Постарался разжевать смысл проекта. Надеюсь на Вашу помощь и буду рад любым замечаниям и комментариям.