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

AJIEKCEu

Свой
  • Постов

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Местный
    Местный

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

2 226 просмотров профиля
  1. В продолжение. Пофантазировать: std_logic_vector(to_unsigned(135, 32 )), --aYEnd_line std_logic_vector(to_unsigned(70, 32 )), --aXEnd_line std_logic_vector(to_unsigned(153, 32 )), --aYStart_line std_logic_vector(to_unsigned(28, 32 )), --aXStart_line std_logic_vector(to_unsigned(2, 32 )), --commands Вот это заменить на функцию DrawXYLine(XStart,YStart,XEnd,YEnd) которая параметрами возьмёт 4 integer, а вернет 5 (в том числе код команды) std_logic_vector нужного размера. std_logic_vector(to_unsigned(150, 32 )), --z std_logic_vector(to_unsigned(150, 32 )), --Y std_logic_vector(to_unsigned(150, 32 )), --X std_logic_vector(to_unsigned(16, 32 )) --commands Вот это заменить на InitXYZsize(X,Y,Z) с тремя integer в параметрах. std_logic_vector(to_unsigned(20, 32 )), -- num_step std_logic_vector(to_unsigned(511, 32 )), -- axis_select std_logic_vector(to_unsigned(128, 32 )), --commands SetPWMdiv(Axis,Step) Объявить type: type tmem_var is array(NATURAL RANGE<>) of std_logic_vector(DATA-1 downto 0); Объявить функцию: function fill_zeros (in_arr:tmem_var) return tmem_var res : tmem_var(0 to 2**ADDR-1) := (others=>(others=>'0')); begin res (0 to in_arr'width-1) := in_arr; res (in_arr'width to 2**ADDR-1) := (others=>(others=>'0')); return res; end function; И после этого ваше заполнение памяти должно стать примерно таким: shared variable mem : tmem_var(0 to 2**ADDR-1) := fill_zeros( InitXYZsize(150,150,150) & SetPWMdiv(511,20) & DrawXYLine(28,153,70,135) & DrawXYLine(184,152,28,153) & ); Ну примерно так хотя бы. PS. За синтаксис не ручаюсь - я ради общей идеи писал.
  2. Сразу не понял. У вас просто странное как мне кажется заполнение... Если это программа - не легче ли её в другой файл вынести? Если выполняются начинает с нулевого адреса - почему бы память не объявить так: type mem_type is array ( 0 to (2**ADDR)-1) of std_logic_vector(DATA-1 downto 0); Тогда и программа логичнее будет читаться, а не снизу-вверх. И тогда можно сделать следующую запись: 0=>std_logic_vector(to_unsigned(16, 32 )), --commands 1=>std_logic_vector(to_unsigned(150, 32 )), --X 2=> ...., ...., 117=>std_logic_vector(to_unsigned(150, 32 )), --the end others => x"00000000") А вообще вы бы рассказали как у вас эти магические числа рождаются.. Может их все таки в отдельном файле держать? Ну и как минимум для читаемости можно было бы сделать функцию которая делает std_logic_vector(to_unsigned(X),DATA) и назвать её коротенько.
  3. shared variable mem : mem_type := (others=>"00000000000000000000000000000000");
  4. https://www.xilinx.com/support/documentation/data_sheets/ds892-kintex-ultrascale-data-sheet.pdf Ищите параметр Irpu на 5й странице. Обратите внимание, что дан ток, а не резистор. И разброс там в зависимости от питания банка доходит до 26 раз. Так что с делителем может не получиться.
  5. Судя по описанию - можно. Опора у них общая - 125 МГц. Частота умножается на CPLL. Так что проблем быть не должно.
  6. Нужен именно такой. Совсем. Время поджимает. Возможен вариант взять ваш - вернуть аналогичный через 2-3 недели с доплатой. Спасибо.
  7. Есть партия микросхем, подозреваем брак. Хотим быстро протестировать без пайки. Теоретически можно с возвратом, но лучше купить. PS. В магазинах пока не нашёл. Если подскажите - буду благодарен. PPS. На AliExpress'ах и под заказ - видел, но хочется быстрее.
  8. Есть документ: http://www.xilinx.com/support/documentatio..._7/xst_v6s6.pdf Ориентируйтесь на страницу 251. Для чтения с двух портов одной RAM не дублируя данные - сделайте два блока @always. На каждый порт - свой.
  9. Этот же вопрос просто решается - вы вместо данного сообщения (или в плюс к нему) разместите резюме - и все узнаете. Заодно, возможно, работу смените. ЗЫ. Перспективным студентам(выпускникам) с хорошими базовыми знаниями предлагаем 50(-13%).
  10. Мне кажется, без минимальной схемы - тут никуда. Я имею ввиду функциональной. Если у вас частота на АЦП неизменна(50 МГц) - какой клок вам нужен на CIC? По идее данные заходят на CIC с частотой работы (дискретизации) АЦП. А вот выходят из CIC - на меньшей частоте. Но обычно это реализуется не другой частотой, а значимостью сигнала. То есть на входе - каждый такт значимый, а на выходе есть некий отдельный признак значимых данных. Который возникает раз в 1/2/4/8 и т.д. тактов.
  11. Я не совсем понимаю схему (недостаточно данных), но если на АЦП клок заходит с плис то делаем следующую вещь: Опорный клок-> Делитель на целое число с учетом DDR триггера на выходе -> выходной DDRC триггер. Отсутствие PLL (и выходного триггера (обязательно расположенного в блоке ввода вывода, у Xilinx это называется iob, у Altera возможно по-другому) даст более качественную выходную частоту нежели с PLL (хотя наверное чуть-чуть хуже, чем при использовании внешних компонентов). Использование DDR триггера позволит делить клок на числа некратные двойке. По идее должно быть сильно лучше чем с PLL. Насколько возможно отсутствие PLL - Не совсем понял из условий задачи. Ещё не совсем понял, как вы выбираете частоту дискретизации извне? У вас гарантированно только полезный сигнал приходит на АЦП? Уже отфильтрован внешними условиями/схемами?
  12. Чё-й то на 8? Я вот считаю с картинки клоки - у меня 7 получается. На 7 периодов исходного клока - один период полученного. Вот вам картинка с временами, если лень считать: 40 ns - период исходного клока, 40+100.1 ns - Clock_High для полученного (0,1 нс - из-за DDR Триггера и это задержка, а не изменение периода). 140 ns - Clock_low для полученного. Итого - DutyCycle 50|50. Отношение периодов - 280/40 = 7.
  13. Например вот: library IEEE; use IEEE.STD_LOGIC_1164.ALL; library UNISIM; use UNISIM.VComponents.all; entity clk_div7 is Port ( clkin : in STD_LOGIC; clkout : out STD_LOGIC); end clk_div7; architecture Behavioral of clk_div7 is signal shift_reg : std_logic_vector(13 downto 0) := "00000001111111"; signal nclkin : std_logic := '1'; begin nclkin <= not clkin; process(clkin) begin if rising_edge(clkin) then shift_reg <= shift_reg(11 downto 0) & shift_reg(13 downto 12); end if; end process; ODDR2_inst : ODDR2 generic map( DDR_ALIGNMENT => "C0", -- Sets output alignment to "NONE", "C0", "C1" INIT => '0', -- Sets initial state of the Q output to '0' or '1' SRTYPE => "ASYNC") -- Specifies "SYNC" or "ASYNC" set/reset port map ( Q => clkout, -- 1-bit output data C0 => clkin, -- 1-bit clock input C1 => nclkin, -- 1-bit clock input CE => '1', -- 1-bit clock enable input D0 => shift_reg(13), -- 1-bit data input (associated with C0) D1 => shift_reg(12), -- 1-bit data input (associated with C1) R => '0', -- 1-bit reset input S => '0' -- 1-bit set input ); end Behavioral; Можно наверное сделать нагляднее, это в качестве proof-of-concept. Результат:
  14. 1. В режиме DCM - входная частота (у Spartan6) от 5 МГц. Так что заведется. А вот как PLL - фиг. 2. Можно использовать счетчик + DDR триггер на выходе. Тогда Duty Cycle выходного клока будет в абсолютном значении такой же как и у входного. Соответственно в процентах - в семь раз меньше.
×
×
  • Создать...