Форумы Modlabs.net: Сумма членов геом прогрессии: поведен уст-ва шины, задача реализ-ся шиной с использованием MUX - Форумы Modlabs.net

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Сумма членов геом прогрессии: поведен уст-ва шины, задача реализ-ся шиной с использованием MUX

#1 Пользователь офлайн   Ksenya23 

  • Junior
  • Pip
  • Группа: Пользователи
  • Сообщений: 26
  • Регистрация: 19 Апрель 12

Отправлено 19 Апрель 2012 - 19:59

Здравствуйте. Передо мной стоит задача спроектировать устройство, которое вычисляло бы сумму первых n членов геометрич. прогрессии со знаменателем q, оно потактово увеличивает значение одного регистра на значение второго, и увеличивает значение второго в q раз. (n и q задаются входами устройства). С использованием мультиплексора.
Мои примерные наработки ни к чему хорошему не привели..скорее наоборот запутали. Подскажите пожалуста что в моей схеме необходимо изменить, так как я не совсем понимаю логику работы этого устройства..
ниже представляю картинку. Задача реализуется в программе Logisim.
Прикрепленный файл  устройство.png (46,92К)
Количество загрузок:: 22
0

#2 Пользователь офлайн   dE fENDER 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 271
  • Регистрация: 18 Декабрь 08

Отправлено 20 Апрель 2012 - 22:33

Для быстрого решения задач по схемотехнике применяют два секретных приема. Первый из них - при решении задачи не стоит использовать представление в виде схемы. Второй - нужно использовать только качественные симуляторы (которые в процессе симуляции тоже не показывают схемы устройства).

Сначала рассматриваем логику задачи. Исходя из условий задачи (использование MUX) - на первом такте мы можем прочитать первый член последовательности и добавить его к сумме, на втором - можно уже читать множитель, затем умножить на него предыдущий член и добавить полученный текущий член последовательности к сумме. Собственно и все. Берем и пишем на Verilog'е:
module progressor(q, n, clk, resu); // resu - сумма геометрической прогрессии
input wire [7:0] q, n;
input wire clk;
output reg [15:0] resu = 16'd0;

reg other_tick = 0;      // признак, в случае истины обозначающий что это не первый такт
reg [15:0] accu = 16'd0; // accu - текущий член последовательности

always @(posedge clk)
begin
  accu <= other_tick ? accu * q : n;  // Вот эта конструкция, хорошо знакомая любому человеку, знающему Си - и превратится в Mux
  resu <= resu + accu;
  other_tick <= 1;
end

endmodule

На мой взгляд, особых пояснений этот код не требует.
Правильность решения проверяю в Mentor Graphics ModelSim. Компилирую, запускаю симуляцию:
Изображение
По графику видно, что сумма отстает на 1 такт от подаваемых данных.

Небольшое замечание по поводу некачественных симуляторов. Днем на работе я попробовал отсимулировать эту задачу в симуляторе, встроенном в Quartus 9. На диаграмме я получил полный бред и выяснил, что этот так называемый "симулятор" для простейшего сумматора двух регистров выдает вместо суммы случайные числа, а симуляция умножителя даже в пределах одного такта выдает несколько десятков переключений в произвольные состояния. При этом с двумя константами или с константой и регистром значения правильные.

Теперь, чтобы получить картинку как побочный продукт ответа на задачу, я воспользуюсь компилятором Quartus 11 и его инструментом Rtl Viewer. Вот во что он превратит Verilog'овский файл после компиляции:
Изображение

Еще примечания - вышеприведенный код только по счастливой случайности будет корректно работать в единственном случае - если он запущен на FPGA. На CPLD, в ASIC и на отдельных микросхемах он работать не будет. Почему? Потому что обязательно нужен сигнал сброса/инициализации. А у FPGA этот сигнал имеется и только поэтому я смог написать строки "resu = 16'd0" и другие со стартовым обнулением. Реальные триггеры при подаче питания в нулевое состояние переходить не обязаны. Сброс может быть как общим для всего устройства, так и отдельным для модуля, синхронным или асинхронным. В каждом из этих случаев решение задачи будет разным.
0

#3 Пользователь офлайн   Ksenya23 

  • Junior
  • Pip
  • Группа: Пользователи
  • Сообщений: 26
  • Регистрация: 19 Апрель 12

Отправлено 22 Апрель 2012 - 20:58

спасибо большое за проделанную,подробную работу, но в моей реализации в программе Logisim она по какой-то причине работает некорректно.
Прилагаю картинку схемы, выполненной по аналогии в программе Logisim.
Прикрепленный файл  схема в Logisim.png (126,21К)
Количество загрузок:: 8
0

#4 Пользователь офлайн   dE fENDER 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 271
  • Регистрация: 18 Декабрь 08

Отправлено 22 Апрель 2012 - 23:12

Не вижу константы 1 на вход триггера other_tick. А Logisim скачаю и посмотрю, как он симулирует элементы.

В общем, все правильно там симулируется, до тех пор, пока не переполнится 8битная шина (т.е. до 189)

Изображение
0

#5 Пользователь офлайн   Ksenya23 

  • Junior
  • Pip
  • Группа: Пользователи
  • Сообщений: 26
  • Регистрация: 19 Апрель 12

Отправлено 23 Апрель 2012 - 19:10

исправила ошибки..все работает, все понятно. спасибо вам огромное! :*
0

#6 Пользователь офлайн   dE fENDER 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 271
  • Регистрация: 18 Декабрь 08

Отправлено 23 Апрель 2012 - 20:39

Не за что, обращайтесь.
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

2 человек читают эту тему
0 members, 2 guests, 0 anonymous users