Aleksei_Rostov
Свой-
Постов
313 -
Зарегистрирован
-
Посещение
Весь контент Aleksei_Rostov
-
Прошу прощения за проверку экстрасенсорных способностей))) итак, в схемантике проект имеет вид модули фифо из коргена, data_logic создает поток на частоте 10 МГц, который пишу в фифо, cmd, my_soc модуль xps проекта, и reset для управления латентностью ресетов в соответствии с датащитом на датамувер. в xps проект имеет вид то есть только датамувер и ддр. Порты датамувера мастер кидаю на шину с интерфейсом axi4, а слейвы s2mm и cmd (в асинхронном режиме) выкинул наружу. Осцилограммы как у вас я получил (с преславутыми 4-мя тактами). Однако, если сигнал s2mm valid ноль, а потом перекинуть на один, то картина следующая: реди датамувера падает в ноль, и даже cmd_valid не исправляет ситуацию. Почему при наличии сигнала данных на входе датамувера, он сообщает что "не реди"? Вот это и не понятно. Что ему еще не хватает? :cranky: бьюсь уже третий день...
-
не могу запустить сам датамувер. Он гад сигнал реди на 4 такта выдает, а потом мертвым сном... При этом просто сброс, он опять 4 такта и спать.. Достаточным условием для его запуска по мануалу: дата_валид и запись в регистр cmd (ready + valid). Может что то еще?
-
Благодарю за ответы. Большое спасибо с логикой разобрался. Если все верно, то алгоритм буду пробывать такой: наполняю фифо, по сигналу записи последнего слова в фифо запускаю cmd_valid, и вычитываю burst датамувером. Пока вопросов больше нет. Думаю позже появятся :laughing: Большое спасибо за помощь!
-
Вопрос такой: есть поток данных по 32 разряда, частота например 10 МГц, необходимо этот поток последовательно записать в ДДР (64 Мб). как можно сделать? мой вариант такой: Для проекта собираю в xps ддр слейв, и мастер датамувер. Для перехода с клокового домена потока в клоковый домен системы (ддр + дм), как я понимаю необходимо фифо. Фифо имеет вход "наружу", т.е. на запись потока, и выход в датамувер. Я пока вывел наружу ноги дата мувера: валид, реади, дата и др. Сам фифо буду делать вне XPS. Если я вас правильно понял?, варианты с фифо могут быть: -- coregen ядро (выход прикручивать к дата муверу с "наружи") -- в ise создавать самому (выход прикручивать к дата муверу с "наружи") -- должно быть готовое фифо в xps (поглядываю в сторону этого варианта, ноги ядра в stream дата мувера "внутри", и ноги наружу). все верно: на 4 такта как в начале темы.
-
подскажите пожалуйста как организовали стрим в датамувер и из него в MM? Использую датамувер для заполнения ДДР . Включил его в режиме FULL для S2MM с асинхронным command регистром. Сделал мастером на шине, слейв соответственно ДДР. Из датамувера наружу вывел ноги cmd, sts регистров, и s2mm_ tvalid, s2mm_tdata, tready, tlast, tkeep датамувера. На эти ноги буду вешать фифо. Далее как только фифо full и датамувер ready данные посылаю в ДДР по адресу указанному в cmd регистре. пока проблемы с запуском датамувера. Просто делаю сброс по всем ресетам, должен по идее наблюдать сигнал ready от датамувера. Сигнал появляется на пару тактов и пропадает. Идеологию понимаю так: есть реади из датамувера, даю ему валид, он вычитывает burst.
-
Скажите вы данные сразу в порты DM кидаете? Я имею ввиду S2MM (tkeep, tvalid, tready ...) и cmd регистр?
-
благодарю за ответ. как с кряком быть не подскажите? :laughing:
-
Думаю заказать. Подскажите есть ли проблемы с лицензией для Квартуса? Необходимо поработать с ядрами АЦП?
-
микроконтроллер + LVDS
Aleksei_Rostov опубликовал тема в ARM
здравствуйте. Может кто нибудь подскажет решение: необходима плата с микроконтроллером с интегрированным 16 или 8 канальным АЦП и LVDS интерфейсом? -
Какие изменения вы ожидаете? После прошивки sof, в eclipse заливаете elf файл с программой
-
Посмотрите внимательно, там должен быть, если не изменяет память, .sof файл и time_limited.sof. Просто sof и выбирайте
-
большое спасибо за совет. Действительно лезть в шину это я погорячился... :laughing: Про подачу данных непосредственно на вход ДМА обязательно посмотрю. Вообще в идеале задача решалась бы так: на шину вешать ядро FIFO с выходом в сторону процессора (ДМА) , а вход выводить наружу. Тут я до конца не разобрался: в xps ядра FIFO такой возможности не предоставляют... (из двух ядер одно для ethernet, другое для ДМА (скорее всего то о чем Вы говорите))
-
хорошая идея. Еще посматриваю в сторону сигнала s_axi_rready для интерфейса. Вроде как по нему процессор получает информацию о готовности канала чтения
-
Здравствуйте! Подскажите как лучше решить след задачу: есть fifo + microblz + dma + ddr Необходимо "аппаратно" наполнить fifo и программно c помощью mcrblz записать данные в DDR. Пока делаю так: вешаю FIFO на AXI для процессора (DMA) c одной стороны, а с другой вывожу ноги наружу. Наполняю FIFO и по сигналу full процессор должен дать команду DMA на трансфер данных в ДДР. Вот тут и загвоздка: как сигнал full сделать сигналом прерывания для процессора? FIFO сделал через coregen и в XPS повесил на шину через интерф AXI4.
-
Какие характеристики АЦП не подскажете? кроме частоты и разрядности пока ничего не нашел. Биполярный? какой размах?
-
Очень интересный вариант. Спасибо.
-
не секрет: на ПЛИС необходимо реализовать различные вычисления для каждого из каналов + выдача вычисленной информации.
-
Выбор ADC + FPGA
Aleksei_Rostov опубликовал тема в Работаем с ПЛИС, области применения, выбор
Здравствуйте. Может кто подскажет какие доступные готовые платы есть с 16 или 8 канальным АЦП (от 10 kSPS) + FPGA? -
Все разобрался! Собрал систему без microblaze: pcie + ddr + cdma + bram + leds_gpio В настройках pcie выделил 3 BAR пространства. Отмаппировал cdma и leds_gpio на BAR1 и BAR2, ddr на BAR0. Залил во flash. Перезагрузил ПК Далее программой Pcietree открываю например BAR2 и пишу в первый регистр число -- загораются соответствующие светодиоды. Аналогично можно управлять cdma для считывания\записи потока данных в BAR0
-
здравствуйте! Подскажите как правильно организовать обмен по pcie. В XPS собираю систему: microblaze, ddr, cdma, axi_pcie, порты вывода на led'ы. В настройках pcie ядра режим определил как end point, задал только BAR0 и его размер 64 кбайт 32 bit адресного пространства. На начальном этапе работаю без DMA, пытаюсь записать число микроблейзом в регистр BAR0 В SDK программа выполняет: мигание светодиодом и запись числа в первую ячейку BAR0 (для записи использую функцию вывода данных на периферию Xil_Out32). #include "xparameters.h" #include "xil_io.h" /************************** Function Prototypes *****************************/ int leds (void); #define delay 250000 void main(void) { while(1) { leds(); Xil_Out32(XPAR_PCI_EXPRESS_AXIBAR_0, 0x01234567); } } int leds (void) { int i; for(i=0; i<delay; i++ ); Xil_Out8(XPAR_LEDS_8BITS_BASEADDR, 0x01); for(i=0; i<delay; i++ ); Xil_Out8(XPAR_LEDS_8BITS_BASEADDR, 0x00); return 0; } Делаю след образом (плата в разъеме pcie): -- заливаю .bit файл. -- перезагружаю компьютер -- в диспетчере наблюдаю pcie контроллер памяти -- с помощью PcieTree вижу свою плату с заданными VID, размером BAR0 и его начальным адресом (в конфиг регистре) в оперативной памяти и т.д. -- открываю содержимое BAR0 -- загружаю .elf файл содержимое в ячейках BAR0 изменилось на FFFFFFFF, светодиод моргнул только один раз, при обновлении PcieTree начальный адрес BAR0 на 0000. Что делаю не так?
-
Создание IP для AXI4 light
Aleksei_Rostov опубликовал тема в Языки проектирования на ПЛИС (FPGA)
Здравствуйте. Подскажите пожалуйста, как можно правильно подключить VHDL ядро RAM к шине AXI4. Задача: необходимо аппаратное ядро буфер RAM подключить к AXi4 для считывания данных из буфера с помощью microblaze. пока пробую простой вариант для rom. Что делаю: в ISE создаю проект, добавляю mblz. Открываю XPS и там создаю новое ядро. Есть два файла: user_logic.vhdl и топовый файл ядра. В user_logic.vhd добавляю rom. En на считывание завожу на статусный регистр считывания данных из IP ядра (slv_reg_read_sel = "0100"). Далее в SDK пытаюсь считать из регистра содержимое rom. user_logic код library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; library proc_common_v3_00_a; use proc_common_v3_00_a.proc_common_pkg.all; -- DO NOT EDIT ABOVE THIS LINE -------------------- --USER libraries added here ------------------------------------------------------------------------------ -- Entity section ------------------------------------------------------------------------------ -- Definition of Generics: -- C_NUM_REG -- Number of software accessible registers -- C_SLV_DWIDTH -- Slave interface data bus width -- -- Definition of Ports: -- Bus2IP_Clk -- Bus to IP clock -- Bus2IP_Resetn -- Bus to IP reset -- Bus2IP_Data -- Bus to IP data bus -- Bus2IP_BE -- Bus to IP byte enables -- Bus2IP_RdCE -- Bus to IP read chip enable -- Bus2IP_WrCE -- Bus to IP write chip enable -- IP2Bus_Data -- IP to Bus data bus -- IP2Bus_RdAck -- IP to Bus read transfer acknowledgement -- IP2Bus_WrAck -- IP to Bus write transfer acknowledgement -- IP2Bus_Error -- IP to Bus error response ------------------------------------------------------------------------------ entity user_logic is generic ( -- ADD USER GENERICS BELOW THIS LINE --------------- --USER generics added here -- ADD USER GENERICS ABOVE THIS LINE --------------- -- DO NOT EDIT BELOW THIS LINE --------------------- -- Bus protocol parameters, do not add to or delete C_NUM_REG : integer := 4; C_SLV_DWIDTH : integer := 32 -- DO NOT EDIT ABOVE THIS LINE --------------------- ); port ( -- ADD USER PORTS BELOW THIS LINE ------------------ --USER ports added here LEDS_OUT : out std_logic_vector(7 downto 0); DATA_OUT : out std_logic_vector(7 downto 0); RDEN : out std_logic; EOF_P : out std_logic; -- ADD USER PORTS ABOVE THIS LINE ------------------ -- DO NOT EDIT BELOW THIS LINE --------------------- -- Bus protocol ports, do not add to or delete Bus2IP_Clk : in std_logic; Bus2IP_Resetn : in std_logic; Bus2IP_Data : in std_logic_vector(C_SLV_DWIDTH-1 downto 0); Bus2IP_BE : in std_logic_vector(C_SLV_DWIDTH/8-1 downto 0); Bus2IP_RdCE : in std_logic_vector(C_NUM_REG-1 downto 0); Bus2IP_WrCE : in std_logic_vector(C_NUM_REG-1 downto 0); IP2Bus_Data : out std_logic_vector(C_SLV_DWIDTH-1 downto 0); IP2Bus_RdAck : out std_logic; IP2Bus_WrAck : out std_logic; IP2Bus_Error : out std_logic -- DO NOT EDIT ABOVE THIS LINE --------------------- ); attribute MAX_FANOUT : string; attribute SIGIS : string; attribute SIGIS of Bus2IP_Clk : signal is "CLK"; attribute SIGIS of Bus2IP_Resetn : signal is "RST"; end entity user_logic; ------------------------------------------------------------------------------ -- Architecture section ------------------------------------------------------------------------------ architecture IMP of user_logic is --USER signal declarations added here, as needed for user logic type rom_type is array (15 downto 0) of std_logic_vector (7 downto 0); signal ROM_arr : rom_type:= (X"01", X"10", X"02", X"20", X"03", X"30", X"04", X"40", X"05", X"50", X"06", X"60", X"07", X"70", X"08", X"80"); signal rdata : std_logic_vector(7 downto 0); signal ADDR : std_logic_vector(3 downto 0); signal SWITCH_IN : std_logic_vector(7 downto 0); signal RD_EN, EOF : std_logic; ------------------------------------------ -- Signals for user logic slave model s/w accessible register example ------------------------------------------ signal slv_reg0 : std_logic_vector(C_SLV_DWIDTH-1 downto 0); signal slv_reg1 : std_logic_vector(C_SLV_DWIDTH-1 downto 0); signal slv_reg2 : std_logic_vector(C_SLV_DWIDTH-1 downto 0); signal slv_reg3 : std_logic_vector(C_SLV_DWIDTH-1 downto 0); signal slv_reg_write_sel : std_logic_vector(3 downto 0); signal slv_reg_read_sel : std_logic_vector(3 downto 0); signal slv_ip2bus_data : std_logic_vector(C_SLV_DWIDTH-1 downto 0); signal slv_read_ack : std_logic; signal slv_write_ack : std_logic; begin -- сигналы для контроля в chipscope DATA_OUT <= SWITCH_IN; RDEN <= RD_EN; EOF_P <= EOF; rdata <= ROM_arr(conv_integer(ADDR)); process (Bus2IP_Clk) begin if (Bus2IP_Clk'event and Bus2IP_Clk = '1') then if (RD_EN = '1') then SWITCH_IN <= rdata; ADDR <= ADDR + 1; else ADDR <= (others => '0'); end if; end if; end process; EOF <= '1' when ADDR = x"E" else '0'; ------------------------------------------ -- Example code to read/write user logic slave model s/w accessible registers -- -- Note: -- The example code presented here is to show you one way of reading/writing -- software accessible registers implemented in the user logic slave model. -- Each bit of the Bus2IP_WrCE/Bus2IP_RdCE signals is configured to correspond -- to one software accessible register by the top level template. For example, -- if you have four 32 bit software accessible registers in the user logic, -- you are basically operating on the following memory mapped registers: -- -- Bus2IP_WrCE/Bus2IP_RdCE Memory Mapped Register -- "1000" C_BASEADDR + 0x0 -- "0100" C_BASEADDR + 0x4 -- "0010" C_BASEADDR + 0x8 -- "0001" C_BASEADDR + 0xC -- ------------------------------------------ slv_reg_write_sel <= Bus2IP_WrCE(3 downto 0); slv_reg_read_sel <= Bus2IP_RdCE(3 downto 0); slv_write_ack <= Bus2IP_WrCE(0) or Bus2IP_WrCE(1) or Bus2IP_WrCE(2) or Bus2IP_WrCE(3); slv_read_ack <= Bus2IP_RdCE(0) or Bus2IP_RdCE(1) or Bus2IP_RdCE(2) or Bus2IP_RdCE(3); -- implement slave model software accessible register(s) SLAVE_REG_WRITE_PROC : process( Bus2IP_Clk ) is begin if Bus2IP_Clk'event and Bus2IP_Clk = '1' then if Bus2IP_Resetn = '0' then slv_reg0 <= (others => '0'); slv_reg1 <= (others => '0'); slv_reg2 <= (others => '0'); slv_reg3 <= (others => '0'); else case slv_reg_write_sel is when "1000" => for byte_index in 0 to (C_SLV_DWIDTH/8)-1 loop if ( Bus2IP_BE(byte_index) = '1' ) then slv_reg0(byte_index*8+7 downto byte_index*8) <= Bus2IP_Data(byte_index*8+7 downto byte_index*8); end if; end loop; when "0100" => for byte_index in 0 to (C_SLV_DWIDTH/8)-1 loop if ( Bus2IP_BE(byte_index) = '1' ) then slv_reg1(byte_index*8+7 downto byte_index*8) <= Bus2IP_Data(byte_index*8+7 downto byte_index*8); end if; end loop; when "0010" => for byte_index in 0 to (C_SLV_DWIDTH/8)-1 loop if ( Bus2IP_BE(byte_index) = '1' ) then slv_reg2(byte_index*8+7 downto byte_index*8) <= Bus2IP_Data(byte_index*8+7 downto byte_index*8); end if; end loop; when "0001" => for byte_index in 0 to (C_SLV_DWIDTH/8)-1 loop if ( Bus2IP_BE(byte_index) = '1' ) then slv_reg3(byte_index*8+7 downto byte_index*8) <= Bus2IP_Data(byte_index*8+7 downto byte_index*8); end if; end loop; when others => null; end case; end if; end if; end process SLAVE_REG_WRITE_PROC; -- implement slave model software accessible register(s) read mux SLAVE_REG_READ_PROC : process( slv_reg_read_sel, slv_reg0, slv_reg1, slv_reg2, slv_reg3 ) is begin case slv_reg_read_sel is when "1000" => slv_ip2bus_data <= slv_reg0; when "0100" => slv_ip2bus_data <= x"000000" & SWITCH_IN; when "0010" => slv_ip2bus_data <= x"0000000" & "000" & EOF; when "0001" => slv_ip2bus_data <= slv_reg3; when others => slv_ip2bus_data <= (others => '0'); end case; end process SLAVE_REG_READ_PROC; ------------------------------------------ -- Example code to drive IP to Bus signals ------------------------------------------ IP2Bus_Data <= slv_ip2bus_data when slv_read_ack = '1' else (others => '0'); IP2Bus_WrAck <= slv_write_ack; IP2Bus_RdAck <= slv_read_ack; IP2Bus_Error <= '0'; LEDS_OUT <= slv_reg0(7 downto 0); RD_EN <= '1' when slv_reg_read_sel = "0100" else '0'; end IMP; и собственно код в SDK int main() { u8 sw[16]; while(1){ for(i = 0; i <= 15; i++) { sw[i] = Xil_In8(MY_CORE_REG_BASEADDR + 0x04);// +0x04 т.к. slv_reg_read_sel = "0100" } } return 0; } Если я правильно понимаю, то пока работает Xil_In8, то slv_reg_read_sel = "0100" и следовательно моя rom считывается. Но chipscopom вижу что это не так. Какие есть еще варианты реализации? В Altere я просто создавал ram HDL файл, одни ноги из которого шли на шину (типа read_en, addr, data), а другие снаружу в аппаратную часть (wr_en, addr, data). Создавал ядро. Далее в Eclipse ставил указатель на base addr ядра и вычитывал данные с адр пространства. Посоветуйте пожалуйста как лучше сделать в Xilinx. -
у xilinx attribute RAM_STYLE : string; attribute RAM_STYLE of <entity_name>: entity is "BLOCK"; attribute RAM_STYLE : string; attribute RAM_STYLE of <signal_name>: signal is "BLOCK"; вместо "BLOCK" дописывается блочная память для опред кристалла или можно Primitive instantion типа RAMB8BWER_inst : RAMB8BWER
-
Большое спасибо. Все работает исправно.
-
считывание даннйх из файла (VHDL)
Aleksei_Rostov опубликовал тема в Языки проектирования на ПЛИС (FPGA)
Не могу понять почему в modelsim не отображается первый байт при считывании массива чисел из файла. Тем не менее в расчетах (алгоритм crc32) первый байт задействован, т.е. контр сумма считается верно. код в тестбенче ............................ file stimulus: TEXT open read_mode is "pulse.txt"; ............................ receive_data_in: process variable l: line; variable s: std_logic_vector(7 downto 0); begin crc_en <= '0'; rst <= '1'; data_in <= (others => '0'); wait for 4 * clk_period; crc_en <= '1'; rst <= '0'; while not endfile(stimulus) loop readline(stimulus, l); hread(l, s); data_in <= (s); wait until clk = '1' and clk'event; end loop; data_in <= (others => '0'); rst <= '0'; crc_en <= '0'; wait for 8*clk_period; rst <= '1'; report "Simulation completed" severity failure; end process receive_data_in; Данные в файле в шеснадцатиричной системе: 00 0A E6 F0 05 A3 00 12 34 56 78 90 08 ... Моделсим отображает: -
Написал тестбенч для генератора crc32 (VHDL) с сайта. Однако считает неправильно. Все возможные манипуляции с порядком следования\инвертированием входных байтов, содержимым регистра lfsr_c ситуацию не исправили. Входной поток -- кадр Ethernet с рассчитанной FCS взял отсюда: http://www.edaboard.com/thread120700.html Проверяю регистр lfsr_c после прихода каждого байта. Например если для x"00" в регистре x"4e08bfb4", что после инвертирования и реверса совпадает с результатом полученным онлайн калькулятором 0xD202EF8D http://www.lammertbies.nl/comm/info/crc-calculation.html То после прихода второго байта x"0a", текущая контрольная сумма слова x"000a", с результатом онлайн калькулятора расходится: x"00b7647d" а должно быть x"7820сf7a". Есть рабочий модуль на verilog. Но переделывать его для vhdl желание нет, к тому же хочеться убедиться в работоспособности модуля с сайта OutputLogic.Com. Ошибка найдена! Некорректно считывал данные с текстового файла в тестбенче. Очередной раз убедился насколько проще моделировать на verilog!