Jump to content

    

big_ben

Участник
  • Content Count

    39
  • Joined

  • Last visited

Community Reputation

0 Обычный

About big_ben

  • Rank
    Участник

Recent Profile Visitors

733 profile views
  1. Еще раз попробовал удалить блок дма, перезапустить вивадо, создать блок дма, нажать validate design. Все сработало. Автоматом выставило правильную ширину
  2. Перезапустил vivado. В итоге вроде бы могу менять stream data width Если выставляю 64, то в tcl set_property -dict [list CONFIG.c_s_axis_s2mm_tdata_width {64}] [get_bd_cells axi_dma] Нажимаю validate WARNING: [BD 41-702] Propagation TCL tries to overwrite USER strength parameter C_M_AXI_S2MM_DATA_WIDTH(64) on '/axi_dma' with propagated value(32). Command ignored
  3. Выдает startgroup set_property -dict [list CONFIG.c_s_axis_s2mm_tdata_width {64}] [get_bd_cells axi_dma] CRITICAL WARNING: [BD 41-737] Cannot set the parameter c_s_axis_s2mm_tdata_width on /axi_dma. It is read-only. endgroup WARNING: [BD 41-702] Propagation TCL tries to overwrite USER strength parameter C_M_AXI_S2MM_DATA_WIDTH(64) on '/axi_dma' with propagated value(32). Command ignored
  4. В block design вставляю блок AXI DMA. Пытаюсь его конфигурировать. s_axis_s2mm_tdata_width должно быть 64. Но оно упорно отображает 32 бита. Как это изменить не могу понять. 1. tcl пробовал startgroup set_property -dict [list CONFIG.c_s_axis_s2mm_tdata_width.VALUE_SRC USER] [get_bd_cells axi_dma] set_property -dict [list CONFIG.c_s_axis_s2mm_tdata_width {64}] [get_bd_cells axi_dma] endgroup Но вылетает CRITICAL WARNING: [BD 41-737] Cannot set the parameter c_s_axis_s2mm_tdata_width on /axi_dma_tus. It is read-only. 2. На форуме xilinx вроде бы говорят, что необходимо все соединить в bd и нажать validate design. Ничего не изменилось. Естественно приходит сообщение: Ничего удивительного, ведь на блок дма приходит 64 бита. 3. Пытался удалить блок дма и заново создать. Не помогло. 32 бита на входе не меняются. Vivado 2017.1 Помогите пожалуйста решить проблему
  5. Добрый день! Есть два массива, скорее даже вектора размером 1024 * 16 signal arrayData : std_logic_vector((1024 * 16) - 1 downto 0) := (others => '0'); signal arrayC : std_logic_vector((length * 16) - 1 downto 0) := (others => '0'); По сути, происходит заполнение массивов 16-битными числами, а затем происходит свертка. Ничего особенного. В результате "задействованных" ресурсов fpga ~45000 LUT и 9 DSP. Деление делал через обратное умножение. Возведение в квадраты, тоже через умножение. Это столько ресурсов выжирают массивы? Сейчас хочу понять куда копать, чтобы ресурсы раза в 2 уменьшить. Спасибо)
  6. Меня особо не удивляло, что в PL должен быть статический набор переферии Так и думал. Надеялся что может есть более изящный вариант
  7. Добрый день! Есть код вида library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use IEEE.std_logic_unsigned.all; use IEEE.std_logic_arith.all; library UNISIM; use UNISIM.vcomponents.all; entity top_trigger is generic( NumOfChannel : integer := 6 --! ); port( clk_100MHz : in STD_LOGIC; --! start : in STD_LOGIC; --! data : in STD_LOGIC_VECTOR(255 downto 0); --! sig : out STD_LOGIC --! ); end top_trigger; architecture Behavioral of top_trigger is COMPONENT trigger is generic( n : integer := 64; --! param param : integer := 1; --! param length : integer := 1024 --! param ); port( clk_100MHz : in STD_LOGIC; start : in STD_LOGIC; dataIn : in STD_LOGIC_VECTOR(15 downto 0); sig : out STD_LOGIC ); END COMPONENT; signal dataOut : std_logic_vector(31 downto 0) := (others => '0'); signal start_d1 : std_logic := '0'; signal start_d2 : std_logic := '0'; begin inst_fd0: fd port map(start_d1, clk_100MHz, start); inst_fd1: fd port map(start_d2, clk_100MHz, start_d1); inst_channels_gen : for i in NumOfChannel to NumOfChannel generate inst_trigger : trigger generic map( n => 64, param => 1, length => 1024 ) port map( clk_100MHz => clk_100MHz, start => start_d2, dataIn => data(((i + 1) * 16) - 1 downto i * 16), sig => sig ); end generate; end Behavioral; Это PL часть. Сейчас хочу это все прокинуть в PS часть. В будущем, хотелось бы менять NumOfChannel из PS части. Для этого необходимо NumOfChannel убрать из generic и сделать портом. Пытаюсь так сделать, но появляются ошибки вида: actual for formal port is neither a static name nor a globally static expression; range for generate must be a static vhdl. Подскажите как это можно сделать?
  8. Да, действительно. Благодарю!
  9. Добрый день! Не нашел решение такой проблемы. При чтении из файла in.txt вылетает ошибка: Error: STD_LOGIC_1164.READ(STD_ULOGIC_VECTOR) Error: Character '1' read, expected STD_ULOGIC literal. Error: STD_LOGIC_1164.READ(STD_ULOGIC_VECTOR) Error: Character '2' read, expected STD_ULOGIC literal. и т.д. Файл in.txt: 1 2 3 read.vhd use IEEE.std_logic_textio.all; use STD.textio.all; ... file in_file : text; ... read_file : process variable v_ILINE : line; variable v_data : std_logic_vector(15 downto 0); --variable v_data : integer; variable v_SPACE : character; begin file_open(in_file, "in.txt", read_mode); while(not endfile(in_file)) loop readline(in_file, v_ILINE); read(v_ILINE, v_data); --dataIn <= CONV_STD_LOGIC_VECTOR(v_data, 16); dataIn <= v_data; wait for 1 us; end loop; file_close(in_file); wait; end process; ... Если вместо variable v_data : std_logic_vector(15 downto 0); использовать variable v_data : integer; , то все работает. Хотя даже на этом форуме упоминали, что при включении use IEEE.std_logic_textio.all; все должно нормально работать. Пример брал здесь: https://www.nandland.com/vhdl/examples/example-file-io.html
  10. Оранжевым выделена линия, по которой приходят данные с pad. В самих модулях есть IDDR вида: IDDR_inst_data_hv_control : IDDR generic map ( DDR_CLK_EDGE => "OPPOSITE_EDGE", --! "OPPOSITE_EDGE", "SAME_EDGE" or "SAME_EDGE_PIPELINED" INIT_Q1 => '0', --! Initial value of Q1: '0' or '1' INIT_Q2 => '0', --! Initial value of Q2: '0' or '1' SRTYPE => "SYNC") --! Set/Reset type: "SYNC" or "ASYNC" port map ( Q1 => data_art2_odd(i), --! 1-bit output for positive edge of clock Q2 => data_art2_even(i), --! 1-bit output for negative edge of clock C => clk_art2_x1, --! 1-bit clock input CE => '1', --! 1-bit clock enable input D => data_art2(i), --! 1-bit DDR data input R => '0', --! 1-bit reset S => '0' --! 1-bit set ); Если все использовать в таком виде, то вылетит ошибка вида: [Place 30-457] The instance 'data_art2[5]_IBUF_inst' part of an IOB is driving multiple IDDR instances. One IOB can drive only one IDDR which can be packed into ILOGIC. The IDDR instances involved are: design_1_i/axi_data_provider_0/U0/Inst_data_provider/IDDR_inst_data_gen[5].IDDR_inst_data_art2 design_1_i/axi_hv_control_0/U0/Inst_form_hv/IDDR_inst_data_gen_hv_control[5].IDDR_inst_data_hv_control Думал поставить перед IDDR буфер IBUF, но это тоже не помогает. Понял, спасибо
  11. Столкнулся с такой штукой. Есть два модуля, которые на вход получают одни и те же данные и дальше их пакуют соответствующим образом. Вся система работает на 100 МГц, а данные надо принимать на 200 МГц => необходимо ставить IDDR. Т.к. один IOB может управлять одним IDDR, то решил для этого внутри каждого модуля поставить IBUF. Но проблема не решается. Все это реализовано в ZYNQ. Подскажите как можно избавиться от этой проблемы. Свести все в один модуль не вариант.
  12. Добрый день! Начал тестить mig7 c ddr3 (sdram) и получаю бред. ddr3 контроллер написан xilinx. Запись и чтение в burst режиме. Софт Vivado 2017.2 Параметры mig: PHY to Controller clock ratio: 4:1 Number of Bank machines: 4 Memory Type: components memory part: MT41j256m16xx - 107 Ordering: normal Memory address maping selection: bak-row-column ------------------------------------------------------------ Собственно по картинкам. Запись Видно, что по адресу 0x000..c0 пишется 6, по адресу 0x000..e0 - 7, по адресу 0x000..100 - 8 Чтение 0x000..c0 - 6, 0x000..e0 - 7, 0x000..100 - 7, 0x000..120 - 8 ------------------------------------------------------------- Кто сталкивался и как без костылей обходится такая проблема?