Jump to content

    

dak

Участник
  • Content Count

    37
  • Joined

  • Last visited

Everything posted by dak


  1. Здравствуйте. Хотел провести post PAR моделирование для пятого Циклона и обнаружил, что sdo файл не генерируется. Пересобрал тот же проект под Max II - sdo появился. Небольшой поиск в интернете показал, что вроде как для пятого Циклона так и должно быть. Я чего-то не понимаю?
  2. Здравствуйте. Имеется массив из 32 векторов. Одновременно должно что-то писаться только в пять из них. Номера используемых векторов не фиксированы и передаются из вне. Проблема в том,что при использовании текущего подхода синтезатор говорит мне,что он видит для каждого бита каждого вектора ситуацию множества драйверов - то есть, потенциально может возникнуть ситуация, когда все пять модулей контроля будут писать в один и тот же вектор массива. LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.numeric_std.all; library L1_rom_bank_lib; use L1_rom_bank_lib.types.all; ENTITY addr_controller IS port( clk : in std_logic; data_current : in std_logic_vector (7 downto 0); data_1 : in std_logic_vector (7 downto 0); data_2 : in std_logic_vector (7 downto 0); data_3 : in std_logic_vector (7 downto 0); data_4 : in std_logic_vector (7 downto 0); addr_in : in std_logic_vector (9 downto 0); addr : out mem_adr (31 downto 0) ); END ENTITY addr_controller; -- ARCHITECTURE arch OF addr_controller IS BEGIN process(clk) begin if rising_edge(clk) then if (data_current /= data_1 or data_current /= data_2 or data_current /= data_3 or data_current /= data_4) then addr(to_integer(unsigned(data_current))) <= addr_in; end if; end if; end process; END ARCHITECTURE arch; Все пять модулей управления выполнены по одному шаблону, код которого приведен. Не совсем понимаю,на что жалуется синтезатор, ведь контроль записи в один и тот же вектор присутствует. Я подумал, что происходит это из_за отсутствия ветки ELSE, и в случае совпадения хотя бы одного из задающих векторов два модуля пишут в один и тот же вектор состояние неопределенности. Поэтому я добавил к массиву еще пять векторов, куда модули пишут в случае хотя бы одного совпадения: LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.numeric_std.all; library L1_rom_bank_lib; use L1_rom_bank_lib.types.all; ENTITY addr_controller IS generic( false_vector : integer := 33); port( clk : in std_logic; data_current : in std_logic_vector (7 downto 0); data_1 : in std_logic_vector (7 downto 0); data_2 : in std_logic_vector (7 downto 0); data_3 : in std_logic_vector (7 downto 0); data_4 : in std_logic_vector (7 downto 0); addr_in : in std_logic_vector (9 downto 0); addr : out mem_adr (36 downto 0) ); END ENTITY addr_controller; -- ARCHITECTURE arch OF addr_controller IS BEGIN process(clk) begin if rising_edge(clk) then if (data_current = data_1 or data_current = data_2 or data_current = data_3 or data_current = data_4) then addr(false_vector) <= (others=>'0'); else addr(to_integer(unsigned(data_current))) <= addr_in; end if; end if; end process; END ARCHITECTURE arch; У каждого модуля свой generic,разумеется. Впрочем, это не дало нужного эффекта. Подскажите,пожалуйста,как быть.
  3. Они здесь не используются. Я делаю имитатор неких известных сигналов, и в оригинале формирование происходит с боковыми лепестками.
  4. Так я его и использую на приложенной картинке. Вопрос в том, не сломается ли модуляция от того, что фаза сдвигающих син/косов может меняться несколько раз за один их период.
  5. Здравствуйте. Возник вопрос. Реализую на ПЛИС передатчик с BPSK модуляцией несущей. Формирую сигнал, передаю его на ЦАП - все ок. Следующий этап: помимо изменения фазы несущего колебания хочется сдвигать частоту несущей (то есть той частоты, что задается в ЦАПе, поскольку перенос на высокую частоту осуществляет именно он). Известно, что для спектрального сдвига надо умножить несущую на комплексную экспоненту, то есть на синус/косинус. То есть, теперь мне по сути можно умножать несущую н на последовательность из 1 -1, а поставить мультиплексор и переключать битовой последовательностью синус/косинус соот. фазы. Здесь и возникает вопрос. Частота несущей: десятки-сотни МГц, частота битовой последовательности: 0,5 - 10 МГц, а вот частота смещения имеет порядок кГц. То есть, за один период этих смещающих синусов/косинусов смена фазы может произойти несколько раз. Не повлияет ли это в итоге на формирование сигнала на высокой частоте?
  6. Я тут вот о чем подумал. Для меня не критично, если данные задержатся на такт. В таком случае, я могу делить отсчеты на степень двойки, сдвигом. Это не дорого по ресурсам и сразу понятно, какие биты взять. Как вам такое решение?
  7. Спасибо. Эта формула вызывает вопросы. Видимо, там в скобках должно быть сложение, а не умножение. "МАКСИМАЛЬНЫЙ коэффициент передачи фильтра K (вернее округленный в большую сторону Lk=log2(K)" Не совсем понимаю, как это применить к моему случаю. Можно считать, что я отсчеты синуса умножаю на константу. Диапазон синуса -32000 до 32000, константа может принимать целые значения от 0 до 32000.
  8. Всем привет. Допустим, у меня есть вектор 48 бит, из которых мне надо только 16 бит. Известно, что вектор 48 бит получается из перемножения векторов 32 бита и 16 бит, при этом вектор 32 бита - беззнаковое число (максимум 32000, 2 в какой-то там степени), а 16 бит - число знаковое, и диапазон от -32000 до 32000 (та же степень двойки). Мне надо, чтобы оставляемый от 48 битного вектор в 16 бит был также в диапазоне от -32000 до 32000. Идея в том, что тот 16 битный вектор, который умножается на 32 битный вектор - это отсчеты синуса, я не могу менять его амплитуду. Вектор 32 бита - амплитуда синуса, и хочу, чтобы выходной вектор (который также будет синусом) имел близкую амплитуду (близкую к тому значению, что записано в 32 битный вектор). Рассматривал на таком примере: допустим,есть 4 битный вектор. Диапазон от -8 до 7. Если убрать младший разряд, то останется 3 бита, и диапазон будет от -4 до 3. То есть, убрать младший разряд - это практически эквивалентно тому, чтобы поделить записанное в вектор число на 2. Как я понимаю, удаление старшего бита будет иметь схожий эффект. Я попробовал покрутить это все дело, но особо не вышло. Подскажите пожалуйста, как выбрать разрядность. PS. Я знаю, что просто отбросить разряды нельзя и знаю что делать дальше, но вопрос сейчас именно в выборе разрядности.
  9. Я тоже об этом думал, поэтому и сделал подсветку частот дискретизации в Матлабе. Во всей модели используется одна и та же ЧД, и равна она в точности той, с которой получены значения синуса.
  10. Здравствуйте. Возник небольшой вопрос. Вроде и книжки полистал, и погуглил, но ответа не нашел. Есть некий сигнал - набор значений синуса, который имеет частоту 11 кГц. В модели Симулинк использую блок Short-Time FFT - то есть, перед вычислением БПФ происходит умножение входного сигнала с окном. Использую окно Блэкмана. В спектре вижу, что гармоника, соот. моему синусу, "переехала" с 11 кГц в 11 МГц. Не могу никак понять - это закономерный и правильный результат, или это ошибка?
  11. Построение автоматов что на VHDL,что на Verilog подробно рассмотрено в книжках автора Pong Chu. http://academic.csuohio.edu/chu_p/rtl/index.html
  12. В общем, поковыряв все это дело и полазив в интернете, что-то придумал. На идею натолкнул Maverick. Сразу скажу, что в стартовом посте мой косяк: я не сказал, что клоки для RAM получаются делением некой отдельной тактовой частоты; при этом клок для первого потока получается непосредственно из деления входящего клока,а клок для второго потока получается делением клока для первого потока. Погуглив, нашел такой примитив Xilinx - BUFG_CTLR. При определенной настройке этот примитив работает как клоковый мультиплексор, который по мере своей возможности мгновенно переключает клоки (проверено на железе осциллографом). Итак, как это работает по шагам: 1) получение сигнала разрешения. Использую схему определения изменения фронта сигнала из 0 в 1 (вот такую http://marsohod.org/verilog/157-verilogedges). С каждым изменением проверяю, поднят ли у меня внешний управляющий сигнал,и если поднят, то отправляю единицу: process(arst,mark_imp,control) begin if arst='1' then enable <= '0'; elsif rising_edge(mark_imp) then if control <='1' then enable <= '1'; else enable <= '0'; end if; end if; end process; Буду называть этот сигнал разрешения сигналом EN_1. 2) теперь у меня поднят сигнал разрешения по импульсу метки. К моменту приходу следующего импульса метки мне надо сделать свои дела. Первый поток данных я считаю из ROM внутри ПЛИС. Клок для него я запускаю сразу, но считывать хочу начинать не сразу после поднятия сигнала разрешения, а уже ближе к подходу следующей. Для этого мне нужен счетчик, который отсчитает нужное количество времени, а потом заблокируется и перестанет считать. Здесь я и использую указанный выше примитив. На один из входов данных заводится сигнал разрешения, который я получил при приходе метки, а на второй - тот,который хочу получить, и его же использую для адресации. При сбросе этот сигнал устанавливается в 0. Счетчик, пока не отсчитает нужное количество времени, получает сигнал разрешения EN_1, а после (через инвертор) - сигнал разрешения EN_2. Проверка на то,досчитал ли счетчик до нужного значения выполняется так: process(clk240Mhz,arst) begin if arst = '1' then en_2 <= '0'; elsif rising_edge(clk240MHz) then if unsigned(counter) = "нужное число в бинарном виде" then en_2 <= '1'; else en_2 <= '0'; end if; end if; end process; То есть, при старте этот сигнал сбрасывается в 0. Потом, пока счетчик не досчитает до нужного значения держит ноль,а после поднимается в 1. При этом этот EN_2 переключает клоковый мультиплексор и сам служит в качестве данных. 3) чтобы начать считывать что-то в определенный момент времени, надо чтобы в этот момент времени клок для считывания изменил фронт с 0 в 1. Для этого, к двум делителям, которые запукаются при подъеме EN_1, я добавляю еще два, который запустятся по третьему сигналу разрешения EN_3; при этом делить начинают сразу с высокого фронта. EN_3 получаю аналогично EN_2. Теперь что касается фронтов. Использую все тот же клоковый мультиплексор. На один вход данных подаю константу 0, а на другой подключаю выход делителя,работающего по EN_3. EN_3 так же переключает адреса мультиплексора. Так я надеюсь получить имитацию смены фронта. Что скажите?
  13. Я нарисовал временную диаграмму того,что я собственно хочу. Mark of time - моя временна меточка; enable_1 - сигнал разрешения, по которому начинают работу некоторые блоки; Далее идут сигналы разрешения на чтение и запись в/из RAM; Потом красненьким нарисован как раз тот сигнал,который я хочу получить. Ну и последний - один (для упрощения) из двух моих потоков данных на выходе. Спасибо, посмотрю.
  14. Спасибо. Надо выдавать данные синхронно с меткой. К RAM перешел потому,что частоты потоков не постоянны и могут меняться,никаких конкретных таймингов нет. Понимаю,что кривенько,но как еще можно сделать - не знаю. По идее, делая операцию XOR по быстрому клоку (частота более чем в 100 раз больше частоты медленного клока) я могу довольно точно замечать перепады медленного клока.... Спасибо,попробую. Правда,как я понимаю,частота выходного сигнала может скакать в этом случае.... Я тут порисовал на бумажке и понял,что такой способ не подойдет. Сигнал разрешения поднимается по приходу второй метки, а если в этот момент медленный клок единичка, что на выходе будет нолик, и так будет продолжатся пока не спадет медленный клок. Слишком большая задержка.
  15. Здравствуйте. Что-то не могу понять, как сделать такую вещь: допустим, есть какой-то тактовый сигнал, и надо по сигналу разрешения изменить его фронт. Например, сигнал разрешения в один момент времени поднимается в '1' и далее не опускается. Надо,чтобы с сразу же или с задержкой в пару тактов более быстрого клока сделать фронт исходного тактового сигнала '1' если он был '0', и оставить '1', если он и так был высоким. Хотелось бы при этом,чтобы до этого на выходе блока был '0' (чтобы в момент изменения сигнала разрешения и при изменении фронта для последующих блоков фиксировалось изменение фронта). Резюме: есть 2 клока - один условно называем быстрым (порядок сотен МГц), и медленный (порядок единиц МГц). У блока есть так же вход сигнала разрешения. На выходе хочу получить периодический сигнал такой же частоты (назову этот выходной сигнал А), что и медленный клок, но с условием: в момент изменения сигнала разрешения (или через пару тактов быстрого клока) последующие блоки фиксировали изменение фронта А (используя язык VHDL - rising_edge(A) ). Пробывал так: process(enb,fast_clock,slow_clock) begin if rising_edge(fast_clock) then if enb='1' then if slow_clock='1' then clock_out <= slow_clock; elsif slow_clock='0' then clk_out <= not(slow_clock); end if; else clk_out <= '0'; end if; end if; end process; Такой блок фиксирует высокий фронт, и не делает всего,что мне надо... Мне надо 2 независимых друг от друга потока данных передавать синхронно с меткой времени. Сама метка имеет такой вид: 100 нс она единичка,и 1 секунду она ноль. Итак,я делаю так: по приходу первой метки,я поднимаю в единицу сигнал разрешения. По этому сигналу начинают работу некоторые блоки. Потоки данных я пишу в RAM; получая разрешение на запись временным сдвигом полученного ранее сигнала разрешения, а разрешение на чтение генерирую на основе метки времени (тут ве работает как надо). Вот пытаюсь получить клок для чтения.
  16. Скачал с сайта Альтеры. Но это не важно, ибо я очень крупно опозорился. С самим Моделсимом все нормально. В общем, проблема была в моем коде.... Извините, что вынудил вас потратить время зря...
  17. Дык на скриншоте написано же: использую стартер альтеровский. Эта ошибка возникает при попытке просимулировать абсолютно любой проект. Для скриншота использовал это,например: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.numeric_std.ALL; entity shift_register is Port ( D : in STD_LOGIC; CLK : in STD_LOGIC; Q : out STD_LOGIC); end shift_register; architecture Behavioral of shift_register is signal shift_reg : STD_LOGIC_VECTOR(7 downto 0) := (others=>'0'); begin process (CLK) begin if (rising_edge(CLK)) then shift_reg(6 downto 0) <= shift_reg(7 downto 1); shift_reg(7) <= D; end if; end process; Q <= shift_reg(0); end Behavioral; Имею 4 Gb RAM и 500 Gb HDD.
  18. Коллеги , кто-нибудь сталкивался с проблемой,озвученной в заголовке и решал её? При гуглении обнаружил,что проблема известная,но конкретных методик решения так и не нашел.
  19. Спасибо. Но это немного не то,о чем я спрашивал. У Вас здесь один std_logic и один std_logic_vector. А я спрашивал, что если у нас 2 std_logic_vector'a .
  20. Здравствуйте. Думаю, все знают, что такое "исключающее или" (оно же "сложение по модулю 2", оно же xor). Применительно к языку VHDL понятно,что произойдет,если мы a и b (оба объявлены как std_logic) сложим по модулю 2: c <= a xor b. Но если складывать по модулю 2 не 1 бит с другим, а вектора битов (то есть, сигналы std_logic_vector)? Тогда, если вектора одинаковой длины, то xor будет применена побитово? Например: а := 0000; b := 0001; c <= a xor b; c == 0001?