Сдвиговый регистр на verilog

Сдвиговый регистр на verilog

Довльно нужная вещь этот ваш сдвиговый регистр.

Напишем простейший вариант реализации на VHDL. Из входов у нас будет: тактирование (С, он же CLK), вход данных (serial input) и выход (serial output).

Принципиальных ограничений на разрядность нет, но мы сегодня будем стереотипными пацанами 😉 сделаем 8-ми битный регистр.

Будем использовать тип std_logic. Для чего будем использовать библиотеки:

Секция entity нашего сдвигового регистра выглядит вот так:

Тут мы просто описали нужные входы и выходы.

Архитектура ничего крутого тоже не представляет. Тут мы просто создаем внутренний сигнал tmp разрядностью 8 бит, в который собственно и будем вносить данные и сдвигать. Сдвигаем просто проходом цикла, а затем вносим в tmp(0) входящий сигнал SI, а из tmp(7) данные выводим на выход SO.

Таким образом мы получаем весьма абстрактный регистр, который первые 1 Байт данных будет выводить неопределённое состояние на выход.

Как видно из временной диаграммы, всё получилось 😉 Сдвиговый регистр действует.

192 просмотра

1 ответ

72 Репутация автора

Я хочу создать сдвиговый регистр, используя d-flip-flop в качестве основного структурного элемента. код:

Я думаю, что у тестового стенда есть проблема. Я попытался дать значения s1 для каждого # 10, в то время как clk = 1, но снова не работает.

Этот код не дает мне сигналов для q и s0. Я не могу найти, что не так. Есть идеи?

Ответы (1)

1 плюс

4651 Репутация автора

у вас есть несколько проблем с кодом.

q является выходным регистром dff; q[i] передается как q DFF. q[i] также присваивается в assign заявлении. Таким образом, у вас есть умноженное вождение, wire q[i] которое, скорее всего, разрешается x и никогда не меняется. У вас где-то поменялся ввод / вывод.

Читайте также:  Микрофон для конференц связи

Вы ничего не назначаете s0 , поэтому оно не изменяется и не генерирует никакой формы волны.

в этом конкретном случае блокирующие назначения на флопе не будут играть никакой роли, но в целом они могут привести к непредсказуемым результатам моделирования. Используйте неблокирование.

в этом нет особого смысла generate . Вы можете передавать полные векторы, а также полные векторы.

Похоже, вы запутались в направлении assign утверждения. Это подразумевает направление. assign q[0] = s0; означает присвоить значение s0 проводу q[0] , а не наоборот.

Что делать, если нужно разместить большой цифровой фильтр на FPGA? А если плата уже разведена? Железо старое? В проекте осталось мало места? В этом топике будет рассмотрена одна из возможных реализаций цифрового КИХ фильтра на FPGA Altera Cyclone II EP2C15. По сути это продолжение вот этой темы из песочницы.
Будет рассказано, как сделать сдвиговый регистр на RAM, уменьшив при этом затраты LE, и как из этого получить цифровой фильтр.

Как работает фильтр? Базовая операция — умножение с накоплением. Коэффициенты фильтра перемножаются со значениями в сдвиговом регистре и суммируются. Все, если не вдаваться в подробности. Необходимые ингредиенты озвучены, теперь перейдем к делу.

Умножение с накоплением

Считаем, что мы уже определились и желаемым видом АЧХ фильтра, с порядком фильтра, получили его коэффициенты, знаем скорость входных данных. Еще лучше, если эти параметры каким-либо образом параметризовать. Так и попытаемся сделать. Вот такая получилась у меня реализация умножения с накоплением:

Почему ADDR_WIDTH = 9? Потому что порядок фильтра подобран равным 2^9 = 512. Во-первых, это сделано для простоты получения частоты с делителя или PLL. Во-вторых у меня была возможность повышать частоту в 512 раз, потому что sample rate был 16 кГц. Но об этом дальше. Конечно не очень читабельно из-за параметризации, но разобраться можно.

Читайте также:  Вк сейвер расширение яндекс
Коэффициенты фильтра

Прочли топик из песочницы по ссылке, что была наверху? Там был шаблон RAM? Вот этот шаблон больше нас не устраивает. Не получилось у меня заставить ту RAM читать/писать за один такт. Может все от не знания, но коэффициенты фильтра хранятся теперь вот в таком модуле:

Примерно 508 коэффициентов были пропущены, чтобы не нагонять уныние. Почему 24 бита, а не 16? Спектр мне больше нравится. Но это не принципиально. Поменять коэффициенты — занятие не долгое. К тому же можно прикрепить файл инициализации памяти скриптом $readmemb или $readmemh после initial begin.

Сдвиговый регистр

Вот собственно основная причина, почему я это пишу. Может кто-то подумает про себя, что это и так знал. Может еще что подумает об авторе хорошего, что-то там про колесо.
Тут будет написано, как на RAM сделать сдвиговый регистр при помощи обертки. Наверно каждый читал в handbook на свою FPGA о том, что RAM может работать, как сдвиговый регистр. Как? У меня получилось, в этом нет ничего сложного. Только зачем? Семейство Cyclone позиционируется, как устройства с уклоном на память «devices feature embedded memory structures to address the on-chip memory needs of FPGA designs.» И нужно уметь этой памятью пользоваться. Задача решается в два эта: RAM и обертка. RAM аналогична случаю с хранением коэффициентов фильтра:

Единственное, что непроинициализировав RAM она автоматически заполняется нулями. Кстати, этим приемом можно пользоваться при записи коэффициентов фильтра, если их меньше, чем 2^N.
Теперь сама обертка:

Один и тот же адрес подается на RAM с коэффициентами и сдвиговым регистром. По обратной связи через RAM со сдвигового регистра подается на модуль предыдущее значение, которое записывается по текущему адресу. Таким образом сдвиг осуществляется не за один такт, а за каждый по одному значению. На каждый нулевой адрес записывается входное слово.
Зачем я упорно пользуюсь конечным автоматом, хоть некоторые состояния не задействованы? Вспоминаем, что было написано по ссылке в самом начале. Теперь этот модуль работает в два раза быстрее, а значит при прочих равных еще и простаивает половину времени. Теоретически, эту половину можно чем-нибудь занять. Это может быть пересчет коэффициентов фильтра для адаптивной фильтрации, или работа второго фильтра (что-то вроде тайм слота). Тут этого ничего нету и FSM тут не нужен, но я все равно оставил этот атавизм. Убрать FSM всегда проще, чем вписывать его.

Читайте также:  Иероглифы в программах windows 7
Итого

Тут приведу топовый файл, который получился из шимантика:

Сразу видно, что можно поправить, чтобы стало красивее.
Теперь еще раз о том, что получилось. Главный минус — данный фильтр full serial. То есть частоту работы фильтра нужно поднимать в 2^(ADDR_WIDTH) раз относительно скорости входных данных. Эту проблему можно решить, если импульсный отклик фильтра симметричный, но при этом RAM сдвигового регистра придется разбивать на два модуля, в которые будут посылаться 2 адреса, значения будут из RAM будут складываться и умножаться в модуле mult, которому придется дописывать еще один вход. Тогда частоту нужно будет поднимать в 2^(ADDR_WIDTH-1) раз.

Ссылка на основную публикацию
Сборка пк без корпуса
Если серьезно, то компьютер без корпуса работать может и даже будет, но это достаточно опасно, особенно когда вы плохо понимаете...
Ростелеком брянск личный кабинет вход
Наименование организации: ПАО «Ростелеком» Официальный сайт: rt.ru Вход в личный кабинет Ростелеком Вход в личный кабинет Ростелеком осуществляется по адресу:...
Ростелеком изменил лицевые счета
Когда вы решили стать абонентом компании Ростелеком, то с вами был заключен договор, в котором была указана информация, которая требуется...
Сборка пк на райзен 3 1200
Socket AM4, 4-ядерный, 3100 МГц, Turbo: 3400 МГц, Summit Ridge, Кэш L2 - 2048 Кб, Кэш L3 - 8192 Кб,...
Adblock detector