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

Aleksei_Rostov

Свой
  • Постов

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

  • Посещение

Весь контент Aleksei_Rostov


  1. Прошу прощения за проверку экстрасенсорных способностей))) итак, в схемантике проект имеет вид модули фифо из коргена, data_logic создает поток на частоте 10 МГц, который пишу в фифо, cmd, my_soc модуль xps проекта, и reset для управления латентностью ресетов в соответствии с датащитом на датамувер. в xps проект имеет вид то есть только датамувер и ддр. Порты датамувера мастер кидаю на шину с интерфейсом axi4, а слейвы s2mm и cmd (в асинхронном режиме) выкинул наружу. Осцилограммы как у вас я получил (с преславутыми 4-мя тактами). Однако, если сигнал s2mm valid ноль, а потом перекинуть на один, то картина следующая: реди датамувера падает в ноль, и даже cmd_valid не исправляет ситуацию. Почему при наличии сигнала данных на входе датамувера, он сообщает что "не реди"? Вот это и не понятно. Что ему еще не хватает? :cranky: бьюсь уже третий день...
  2. не могу запустить сам датамувер. Он гад сигнал реди на 4 такта выдает, а потом мертвым сном... При этом просто сброс, он опять 4 такта и спать.. Достаточным условием для его запуска по мануалу: дата_валид и запись в регистр cmd (ready + valid). Может что то еще?
  3. Благодарю за ответы. Большое спасибо с логикой разобрался. Если все верно, то алгоритм буду пробывать такой: наполняю фифо, по сигналу записи последнего слова в фифо запускаю cmd_valid, и вычитываю burst датамувером. Пока вопросов больше нет. Думаю позже появятся :laughing: Большое спасибо за помощь!
  4. Вопрос такой: есть поток данных по 32 разряда, частота например 10 МГц, необходимо этот поток последовательно записать в ДДР (64 Мб). как можно сделать? мой вариант такой: Для проекта собираю в xps ддр слейв, и мастер датамувер. Для перехода с клокового домена потока в клоковый домен системы (ддр + дм), как я понимаю необходимо фифо. Фифо имеет вход "наружу", т.е. на запись потока, и выход в датамувер. Я пока вывел наружу ноги дата мувера: валид, реади, дата и др. Сам фифо буду делать вне XPS. Если я вас правильно понял?, варианты с фифо могут быть: -- coregen ядро (выход прикручивать к дата муверу с "наружи") -- в ise создавать самому (выход прикручивать к дата муверу с "наружи") -- должно быть готовое фифо в xps (поглядываю в сторону этого варианта, ноги ядра в stream дата мувера "внутри", и ноги наружу). все верно: на 4 такта как в начале темы.
  5. подскажите пожалуйста как организовали стрим в датамувер и из него в MM? Использую датамувер для заполнения ДДР . Включил его в режиме FULL для S2MM с асинхронным command регистром. Сделал мастером на шине, слейв соответственно ДДР. Из датамувера наружу вывел ноги cmd, sts регистров, и s2mm_ tvalid, s2mm_tdata, tready, tlast, tkeep датамувера. На эти ноги буду вешать фифо. Далее как только фифо full и датамувер ready данные посылаю в ДДР по адресу указанному в cmd регистре. пока проблемы с запуском датамувера. Просто делаю сброс по всем ресетам, должен по идее наблюдать сигнал ready от датамувера. Сигнал появляется на пару тактов и пропадает. Идеологию понимаю так: есть реади из датамувера, даю ему валид, он вычитывает burst.
  6. благодарю за ответ. как с кряком быть не подскажите? :laughing:
  7. Думаю заказать. Подскажите есть ли проблемы с лицензией для Квартуса? Необходимо поработать с ядрами АЦП?
  8. микроконтроллер + LVDS

    здравствуйте. Может кто нибудь подскажет решение: необходима плата с микроконтроллером с интегрированным 16 или 8 канальным АЦП и LVDS интерфейсом?
  9. Какие изменения вы ожидаете? После прошивки sof, в eclipse заливаете elf файл с программой
  10. Посмотрите внимательно, там должен быть, если не изменяет память, .sof файл и time_limited.sof. Просто sof и выбирайте
  11. большое спасибо за совет. Действительно лезть в шину это я погорячился... :laughing: Про подачу данных непосредственно на вход ДМА обязательно посмотрю. Вообще в идеале задача решалась бы так: на шину вешать ядро FIFO с выходом в сторону процессора (ДМА) , а вход выводить наружу. Тут я до конца не разобрался: в xps ядра FIFO такой возможности не предоставляют... (из двух ядер одно для ethernet, другое для ДМА (скорее всего то о чем Вы говорите))
  12. хорошая идея. Еще посматриваю в сторону сигнала s_axi_rready для интерфейса. Вроде как по нему процессор получает информацию о готовности канала чтения
  13. Здравствуйте! Подскажите как лучше решить след задачу: есть fifo + microblz + dma + ddr Необходимо "аппаратно" наполнить fifo и программно c помощью mcrblz записать данные в DDR. Пока делаю так: вешаю FIFO на AXI для процессора (DMA) c одной стороны, а с другой вывожу ноги наружу. Наполняю FIFO и по сигналу full процессор должен дать команду DMA на трансфер данных в ДДР. Вот тут и загвоздка: как сигнал full сделать сигналом прерывания для процессора? FIFO сделал через coregen и в XPS повесил на шину через интерф AXI4.
  14. Какие характеристики АЦП не подскажете? кроме частоты и разрядности пока ничего не нашел. Биполярный? какой размах?
  15. не секрет: на ПЛИС необходимо реализовать различные вычисления для каждого из каналов + выдача вычисленной информации.
  16. Здравствуйте. Может кто подскажет какие доступные готовые платы есть с 16 или 8 канальным АЦП (от 10 kSPS) + FPGA?
  17. Все разобрался! Собрал систему без microblaze: pcie + ddr + cdma + bram + leds_gpio В настройках pcie выделил 3 BAR пространства. Отмаппировал cdma и leds_gpio на BAR1 и BAR2, ddr на BAR0. Залил во flash. Перезагрузил ПК Далее программой Pcietree открываю например BAR2 и пишу в первый регистр число -- загораются соответствующие светодиоды. Аналогично можно управлять cdma для считывания\записи потока данных в BAR0
  18. здравствуйте! Подскажите как правильно организовать обмен по 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. Что делаю не так?
  19. Здравствуйте. Подскажите пожалуйста, как можно правильно подключить 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.
  20. у 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
  21. Не могу понять почему в 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 ... Моделсим отображает:
  22. Написал тестбенч для генератора 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!
×
×
  • Создать...