-
Постов
21 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о scorpein
-
Звание
Участник
- День рождения 02.10.1995
Контакты
-
Сайт
Array
-
ICQ
Array
Посетители профиля
288 просмотров профиля
-
"Делай быстрее..." Да, но устройство должно работать. :) Так, в принципе, на данный момент и пробую реализовать. Только возникают некоторые непонятные сложности. Например, с той ошибкой, которую писал выше. Спасибо! :)
-
:) Я бы с радостью взял что-то другое, но это моя дипломная работа. Выбора нет. Поэтому и нужна помощь, так как сроки очень жмут.))
-
Точно не помню, но больше 50%. Зачем вообще нужна память - шина, с которой берутся данные работает на частоте 33МГц, а МК на частоте 16МГц. Поэтому память используется в качестве буфера - в неё помещаются на высокой частоте данные от ПЛИСа, а МК уже на своей частоте эти данные извлекает и в зависимости от полученных данных выводит информацию на дисплей. Но здесь обязательно считывать данные с шины именно в ПЛИС. Кстати, можно ли совместить файл на языке VHDL и файл схем и залить всё это в ПЛИС? :laughing:
-
Спасибо! Попробую что-нибудь... Хм... Сейчас он у меня успешно считывает данные с 80 порта и выводит на семисегментные индикаторы. Но только теперь мне нужно эти данные не выводить на индикаторы, а передать в память. А роль МК - считать их и обработать и т.д....
-
Прошу прощения, но не я не совсем понял, в чём смысл этой функции, относительно задачи.. Менять устройство, к сожалению, уже невозможно. Нужно делать с этим. :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 "." :(
-
Использовать внешнюю память приходится из-за малого числа вентилей в моём ПЛИС - всего 240. Та прошивка, которую выкладывал выше забила его на 95%. Сейчас как раз обдумываю арбитраж. С интерфейсом ещё ничего не решилось. :laughing: На просторах интернета в основном решения передачи от МК к ПЛИСу, не уверен, что это мне подойдёт.
-
Только что предложили использовать внешнюю RAM-память. Модуль на 128 кб. Должны подвезти. Наверное, будет лучше использовать такой вариант... Привезли память UM61256K-15 (аналог IS61C256AH). Теперь нужно передавать на неё байты данных с ПЛИС и считывать их МК. Подскажите по этой теме?
-
Я попробовал выделить память "штатными" средствами, которые предлагает сам 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;
-
Дело в том, что я получаю на ПЛИС данные с шины LPC, а далее мне необходимо их передать на МК. Так как частоты шины и МК не совпадают, появилась идея создания некой буферной памяти, откуда данные будут уже на частоте МК передаваться. Спасибо большое за пояснения! Был бы рад сделать шаг назад, но время играет против меня..
-
Благодарю!!!!!! Шас буду смотреть, что получится... Не могли бы вы дать краткое описание этого кода, потому как застрял на объекте "we", ну и остальное, чтобы не затормозить сильно..
-
ну не на русском точно)) не сочтите за наглость, но можно ли такое написать на VHDL? Просто Verilog я вообще не знаю, а VHDL сейчас изучаю и прошивка на нём..
-
Ого! Спасибо! А на каком языке этот код? :laughing:
-
Добрый день всем! Возникла необходимость в ПЛИС выделить некоторую область памяти в качестве буфера и потом с него передавать данные на микроконтроллер. Кто-нибудь может что либо подсказать по данной теме?
-
Нашёл одну прошивку на испанском форуме. Кто-нибудь может глянуть? Прошивка для LPC
-
Добрый день! Ну или у меня уже вечер... Мноожество часов исканий, почему-то, не принесли большого плода. Возможно искал не там или не так... Нашёл следующее: в ноутбучных miniPCIe разъёмы чаще всего разведены шина LPC (только разводка разная, нестандартизированная) и Compal Debug... Ну и, собственно, в десктопных материнских LPC можно встретить в разъёме TPM. Но вот как обратиться к 80 (например) порту, используя LPC - ничего такого не нашёл. По поводу прошивки ПЛИС тоже ничего не смог найти... А вообще я планировал сделать устройства типа такого (изображение). И выводить пост коды и доп.информацию по ним на дисплей. Для этого буду использовать ардуинку на 328 атмеге, куда должны передаваться данные с ПЛИС, а с микро-ра, соответственно информация на дисплей.