Jump to content

    

Flip-fl0p

Свой
  • Content Count

    1201
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Flip-fl0p

  • Rank
    «Я знаю, что я ничего не знаю»(С)
  • Birthday 01/03/1990

Старые поля

  • skype
    Array
  • Vkontakte
    Array

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

8315 profile views
  1. Синхронны ли частота с кторой происходит выборка в ST или частота, которую вы смотрите ?
  2. Функцию писал для себя. Я почти никогда не пользуюсь векторами(M to N). Ну разве что описание массивов исключение из этого правила. А разве при передаче в функцию Вектора N downto M этот вектор в функции не будет автоматом считаться (M-N downto 0) ? minus_data := std_logic_vector(-signed(data)); До этого не додумался
  3. Есть старый математический трюк b = a & (-a) Он возвращает вектор где все значения нули, кроме првого бита, где есть лог. 1. Вы как раз картинку этого выложили. Я для этого имею функцию --=========================================================== -- Получить вектор, где есть только старший бит --=========================================================== function GET_LSB_ON_VECTOR ( data : std_logic_vector ) return std_logic_vector is variable minus_data : std_logic_vector(data'left downto 0); variable b : std_logic_vector(data'left downto 0); begin minus_data := std_logic_vector(unsigned(not data) + "1"); -- Получаем отрицательное значение -a b := data and minus_data; -- Умножаем их a & (-a) return b; end function; Ну а далее простой FSM. Анализируем вектор b ---> Вектор b != 0 ---> запускаем чтение из памяти по адресу памяти который выставил ready (адрес определяем как раз таки при помощи этого вектора b, операцией обратной декодеру) ---> данные прочитаны ---> обнуляем сигал ready этой памяти ---> Анализируем вектор b. Например 1. Имеем 4 памяти. 2. Внезапно и одномоментно вектор ready стал "1010" 3. пользуемся трюком и получаем вектор b = "0010" 4. Подаем вектор b на энкодер - и получаем addr = 1 case b is when "0001" => addr <= "00"; when "0010" => addr <= "01"; when "0100" => addr <= "10"; when "1000" => addr <= "11"; when "others => addr <= "--"; end case; 5. Читаем память с адресом addr = 1. 6. После чтения памяти обнуляем соответствующий ready. Т.е было ready = 1010, стало ready = 1000. 7. Опа ! У нас ready = 1000 8. пользуемся трюком и получаем вектор b = "1000" 9 .....
  4. 1. Простой round_robin 2. Нашли первую единичку в векторе -> прочитали эту память -> обунлили этот сигнал -> Нашли первую единичку в векторе... 3. Обычный кольцевой арбитр.
  5. Хороший ПЛИСовик должен уметь писать тесты. Иначе никак.
  6. Проверьте список чувствительности. Он неполный.
  7. А почему сын сам на форуме не зарегистрировался и не задал вопрос ? Если этом ему не нужно и не интересно, то может ему вообще не стоит этим заниматься ?
  8. Не знаю можно ли тактировать PLL клоком с о скважностью отличной от 2.
  9. Открываете в Quartus нужный вам чип и в resource property editor внимательно вкуриваете в устройство выходной ячейки FPGA.
  10. На 10 максе есть ODDR. Вы только, что описали классическую схему forwarded clock.
  11. Не проще ли решить задачу тогда при помощи динамического реконфига PLL ? МК выдал команду - PLL сменил конфиг и выдает новую частоту. Смотреть надо описание FPGA. С теми FPGA, с которыми я работаю, клоковые MUX - это хардаварные блоки. PS. Вкорячить клоковый MUX не сложно если он есть. Ну или перестроить PLL. Гораздо сложнее - правильно такой проект описать констрейнами.
  12. Из исходных данных. 1. Кто является источником мультиплексируемых клоков. 2. Кто является потребителем клока. Т.е итоговый клок выводится наружу или клок исключительно внутри. 3. Какие требования к выходному клоку.
  13. Нужно больше исходных данных. В идеале надо применять клоковые мультиплексоры