Перейти к содержанию
    

scorpein

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о scorpein

  • Звание
    Участник
    Участник
  • День рождения 02.10.1995

Контакты

  • Сайт
    Array
  • ICQ
    Array

Посетители профиля

288 просмотров профиля
  • linu$

  1. "Делай быстрее..." Да, но устройство должно работать. :) Так, в принципе, на данный момент и пробую реализовать. Только возникают некоторые непонятные сложности. Например, с той ошибкой, которую писал выше. Спасибо! :)
  2. :) Я бы с радостью взял что-то другое, но это моя дипломная работа. Выбора нет. Поэтому и нужна помощь, так как сроки очень жмут.))
  3. Точно не помню, но больше 50%. Зачем вообще нужна память - шина, с которой берутся данные работает на частоте 33МГц, а МК на частоте 16МГц. Поэтому память используется в качестве буфера - в неё помещаются на высокой частоте данные от ПЛИСа, а МК уже на своей частоте эти данные извлекает и в зависимости от полученных данных выводит информацию на дисплей. Но здесь обязательно считывать данные с шины именно в ПЛИС. Кстати, можно ли совместить файл на языке VHDL и файл схем и залить всё это в ПЛИС? :laughing:
  4. Спасибо! Попробую что-нибудь... Хм... Сейчас он у меня успешно считывает данные с 80 порта и выводит на семисегментные индикаторы. Но только теперь мне нужно эти данные не выводить на индикаторы, а передать в память. А роль МК - считать их и обработать и т.д....
  5. Прошу прощения, но не я не совсем понял, в чём смысл этой функции, относительно задачи.. Менять устройство, к сожалению, уже невозможно. Нужно делать с этим. :laughing: Почему Quartus ругается на io[addr] <= W_data(7 downto 0); или Data[addr_in] <= data_in; Постоянно ошибка Error (10500): VHDL syntax error at LPC_IOW80.vhd(185) near text "<="; expecting "(", or "'", or "." :(
  6. Использовать внешнюю память приходится из-за малого числа вентилей в моём ПЛИС - всего 240. Та прошивка, которую выкладывал выше забила его на 95%. Сейчас как раз обдумываю арбитраж. С интерфейсом ещё ничего не решилось. :laughing: На просторах интернета в основном решения передачи от МК к ПЛИСу, не уверен, что это мне подойдёт.
  7. Только что предложили использовать внешнюю RAM-память. Модуль на 128 кб. Должны подвезти. Наверное, будет лучше использовать такой вариант... Привезли память UM61256K-15 (аналог IS61C256AH). Теперь нужно передавать на неё байты данных с ПЛИС и считывать их МК. Подскажите по этой теме?
  8. Я попробовал выделить память "штатными" средствами, которые предлагает сам Quartus. Пожалуйста посмотрите код... library IEEE; use IEEE.STD_LOGIC_1164.ALL; --use IEEE.STD_LOGIC_ARITH.ALL; --use IEEE.STD_LOGIC_UNSIGNED.ALL; entity LPC_IOW80 is -- разрядность шин generic ( DATA_WIDTH : natural := 3; ADDR_WIDTH : natural := 5 ); Port ( lclk: in std_logic; -- LPC: 33MHz clock (rising edge) lframe_n: in std_logic; -- LPC: frame, active low lreset_n: in std_logic; -- LPC: reset, active low lad: in std_logic_vector(3 downto 0); -- LPC: multiplexed bus --назначение портов для памяти addr : in natural range 0 to 2**ADDR_WIDTH - 9; we : in std_logic := '1'; q : out std_logic_vector((2**DATA_WIDTH -5) downto 0) ); end LPC_IOW80; architecture RTL of LPC_IOW80 is type LPC_State_Type is ( IDLE, -- Waiting for a start condition START, -- Start condition detected WADDN3, -- I/O write address nibble 3 (A15..A12) WADDN2, -- I/O write address nibble 2 (A11..A8 ) WADDN1, -- I/O write address nibble 1 (A7..A4) WADDN0, -- I/O write address nibble 0 (A3-A0) WDATN1, -- I/O write data nibble 0 (D7..D4) WDATN0, -- I/O write data nibble 1 (D3..D0) WHTAR0, -- I/O write host turn around phase 0 WHTAR1, -- I/O write host turn around phase 1 WSYNC, -- I/O write sync WPTAR -- I/O write peripheral turn around ); signal LPC_State: LPC_State_Type; signal lframe_nreg: std_logic; -- LPC frame register signal lad_rin: std_logic_vector(lad'range); -- LPC input registers signal W_Data: std_logic_vector(7 downto 0); -- LPC input Post Code -- создание массивов и объявление RAM -- Build a 2-D array type for the RAM subtype word_t is std_logic_vector((2**DATA_WIDTH-5) downto 0); type memory_t is array(2**ADDR_WIDTH-9 downto 0) of word_t; -- Declare the RAM signal. signal ram : memory_t; -- Register to hold the address signal addr_reg : natural range 0 to 2**ADDR_WIDTH-9; begin --------------------------------------------------------------------------- -- LPC bidirectional pins definition. --------------------------------------------------------------------------- -- Input register to get some timing margin P_input_register: process(lclk) begin if (lclk'event and lclk='1') then lad_rin <= lad; lframe_nreg <= lframe_n; end if; end process; --------------------------------------------------------------------------- -- LPC state machine -- LPC_State value is actually one clock cycle late. --------------------------------------------------------------------------- P_LPC_StatMachine: process(lclk) begin if (lclk'event and lclk='1') then -- Synchronous reset if (lreset_n = '0') then LPC_State <= IDLE; W_Data(7 downto 0) <= "00000000"; -- init. both displays to all on else case LPC_State is -- Looking for a START condition when IDLE => if (lframe_nreg = '0') and (lad_rin = "0000") then LPC_State <= START; -- START condition detected end if; -- Skip extra cycles on START frame -- (can be many clock cycles) -- and then, check for I/O write transaction when START => if (lframe_nreg = '0') then -- frame still asserted if (lad_rin /= "0000") then LPC_State <= IDLE; -- unsupported start code end if; else if (lad_rin(3 downto 1) = "001") then LPC_State <= WADDN3; -- I/O write detected else LPC_State <= IDLE; -- unsupported command end if; end if; -- -------------------------------- -- I/O write transaction processing -- -------------------------------- when WADDN3 => -- Write Data Address Nibble 3 -- Find next state if (lframe_nreg = '0') or (lad_rin /= "0000") then LPC_State <= IDLE; -- abort cycle, bad frame -- or address mismatch else LPC_State <= WADDN2; end if; when WADDN2 => -- Write Data Address Nibble 2 -- Find next state if (lframe_nreg = '0') or (lad_rin /= "0000") then LPC_State <= IDLE; -- abort cycle, bad frame -- or address mismatch else LPC_State <= WADDN1; end if; when WADDN1 => -- Write Data Address Nibble 1 -- Find next state if (lframe_nreg = '0') or (lad_rin /= "1000") then LPC_State <= IDLE; -- abort cycle, bad frame -- or address mismatch else LPC_State <= WADDN0; end if; when WADDN0 => -- Write Data Address Nibble 0 -- Find next state if (lframe_nreg = '0') or (lad_rin /= "0000") then LPC_State <= IDLE; -- abort cycle, bad frame -- or address mismatch else -- Write address valid. Subsequent Data displays. LPC_State <= WDATN0; -- Next state will get -- first data nibble end if; when WDATN0 => -- Data LSN (Least Significant Nibble)is -- sent first W_Data(3 downto 0) <= lad_rin; -- latch data (LSN) if (lframe_nreg = '1') then LPC_State <= WDATN1; -- Next state gets -- 2nd data nibble else LPC_State <= IDLE; end if; when WDATN1 => -- Data MSN (Most Significant Nibble) W_Data(7 downto 4) <= lad_rin; -- latch data (MSN) if (lframe_nreg = '1') then LPC_State <= WHTAR0; else LPC_State <= IDLE; end if; when WHTAR0 => -- Write Data Turn Around Cycle 0 if (lframe_nreg = '1') and (lad_rin = "1111") then LPC_State <= WHTAR1; else LPC_State <= IDLE; end if; when WHTAR1 => -- Write Data Turn Around Cycle 1 if (lframe_nreg = '1') then LPC_State <= WSYNC; else LPC_State <= IDLE; end if; when WSYNC => -- Write Data Sync Cycle -- Note: No device to respond with a synch at I\O addr -- 080h. Therefore bus should time out and abort. -- State ==> to IDLE if (lframe_nreg = '1') then LPC_State <= WPTAR; else LPC_State <= IDLE; end if; when WPTAR => -- Write Data Final Turn Around Cycle -- (not needed -- see WSYNC) LPC_State <= IDLE; -- I/O write cycle end when others => LPC_State <= IDLE; -- all other cases end case; end if; end if; end process; --данные с шины по тетраде помещаются в ram process(lclk) begin if(rising_edge(lclk)) then if(we = '1') then ram(addr) <= W_data(7 downto 4); end if; -- Register the address for reading addr_reg <= addr; end if; if(rising_edge(lclk)) then if(we = '1') then ram(addr) <= W_data(3 downto 0); end if; -- Register the address for reading addr_reg <= addr; end if; end process; --собственно вывод данных q <= ram(addr_reg); end RTL;
  9. Дело в том, что я получаю на ПЛИС данные с шины LPC, а далее мне необходимо их передать на МК. Так как частоты шины и МК не совпадают, появилась идея создания некой буферной памяти, откуда данные будут уже на частоте МК передаваться. Спасибо большое за пояснения! Был бы рад сделать шаг назад, но время играет против меня..
  10. Благодарю!!!!!! Шас буду смотреть, что получится... Не могли бы вы дать краткое описание этого кода, потому как застрял на объекте "we", ну и остальное, чтобы не затормозить сильно..
  11. ну не на русском точно)) не сочтите за наглость, но можно ли такое написать на VHDL? Просто Verilog я вообще не знаю, а VHDL сейчас изучаю и прошивка на нём..
  12. Ого! Спасибо! А на каком языке этот код? :laughing:
  13. Добрый день всем! Возникла необходимость в ПЛИС выделить некоторую область памяти в качестве буфера и потом с него передавать данные на микроконтроллер. Кто-нибудь может что либо подсказать по данной теме?
  14. Нашёл одну прошивку на испанском форуме. Кто-нибудь может глянуть? Прошивка для LPC
  15. Добрый день! Ну или у меня уже вечер... Мноожество часов исканий, почему-то, не принесли большого плода. Возможно искал не там или не так... Нашёл следующее: в ноутбучных miniPCIe разъёмы чаще всего разведены шина LPC (только разводка разная, нестандартизированная) и Compal Debug... Ну и, собственно, в десктопных материнских LPC можно встретить в разъёме TPM. Но вот как обратиться к 80 (например) порту, используя LPC - ничего такого не нашёл. По поводу прошивки ПЛИС тоже ничего не смог найти... А вообще я планировал сделать устройства типа такого (изображение). И выводить пост коды и доп.информацию по ним на дисплей. Для этого буду использовать ардуинку на 328 атмеге, куда должны передаваться данные с ПЛИС, а с микро-ра, соответственно информация на дисплей.
×
×
  • Создать...