Здравствуйте. Передо мной стоит задача спроектировать устройство, которое вычисляло бы сумму первых n членов геометрич. прогрессии со знаменателем q, оно потактово увеличивает значение одного регистра на значение второго, и увеличивает значение второго в q раз. (n и q задаются входами устройства). С использованием мультиплексора.
Мои примерные наработки ни к чему хорошему не привели..скорее наоборот запутали. Подскажите пожалуста что в моей схеме необходимо изменить, так как я не совсем понимаю логику работы этого устройства..
ниже представляю картинку. Задача реализуется в программе Logisim.
устройство.png (46,92К)
Количество загрузок:: 22
Страница 1 из 1
Сумма членов геом прогрессии: поведен уст-ва шины, задача реализ-ся шиной с использованием MUX
#2
Отправлено 20 Апрель 2012 - 22:33
Для быстрого решения задач по схемотехнике применяют два секретных приема. Первый из них - при решении задачи не стоит использовать представление в виде схемы. Второй - нужно использовать только качественные симуляторы (которые в процессе симуляции тоже не показывают схемы устройства).
Сначала рассматриваем логику задачи. Исходя из условий задачи (использование MUX) - на первом такте мы можем прочитать первый член последовательности и добавить его к сумме, на втором - можно уже читать множитель, затем умножить на него предыдущий член и добавить полученный текущий член последовательности к сумме. Собственно и все. Берем и пишем на Verilog'е:
На мой взгляд, особых пояснений этот код не требует.
Правильность решения проверяю в Mentor Graphics ModelSim. Компилирую, запускаю симуляцию:
По графику видно, что сумма отстает на 1 такт от подаваемых данных.
Небольшое замечание по поводу некачественных симуляторов. Днем на работе я попробовал отсимулировать эту задачу в симуляторе, встроенном в Quartus 9. На диаграмме я получил полный бред и выяснил, что этот так называемый "симулятор" для простейшего сумматора двух регистров выдает вместо суммы случайные числа, а симуляция умножителя даже в пределах одного такта выдает несколько десятков переключений в произвольные состояния. При этом с двумя константами или с константой и регистром значения правильные.
Теперь, чтобы получить картинку как побочный продукт ответа на задачу, я воспользуюсь компилятором Quartus 11 и его инструментом Rtl Viewer. Вот во что он превратит Verilog'овский файл после компиляции:
Еще примечания - вышеприведенный код только по счастливой случайности будет корректно работать в единственном случае - если он запущен на FPGA. На CPLD, в ASIC и на отдельных микросхемах он работать не будет. Почему? Потому что обязательно нужен сигнал сброса/инициализации. А у FPGA этот сигнал имеется и только поэтому я смог написать строки "resu = 16'd0" и другие со стартовым обнулением. Реальные триггеры при подаче питания в нулевое состояние переходить не обязаны. Сброс может быть как общим для всего устройства, так и отдельным для модуля, синхронным или асинхронным. В каждом из этих случаев решение задачи будет разным.
Сначала рассматриваем логику задачи. Исходя из условий задачи (использование 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" и другие со стартовым обнулением. Реальные триггеры при подаче питания в нулевое состояние переходить не обязаны. Сброс может быть как общим для всего устройства, так и отдельным для модуля, синхронным или асинхронным. В каждом из этих случаев решение задачи будет разным.
#3
Отправлено 22 Апрель 2012 - 20:58
спасибо большое за проделанную,подробную работу, но в моей реализации в программе Logisim она по какой-то причине работает некорректно.
Прилагаю картинку схемы, выполненной по аналогии в программе Logisim.
схема в Logisim.png (126,21К)
Количество загрузок:: 8
Прилагаю картинку схемы, выполненной по аналогии в программе Logisim.
схема в Logisim.png (126,21К)
Количество загрузок:: 8
#4
Отправлено 22 Апрель 2012 - 23:12
Не вижу константы 1 на вход триггера other_tick. А Logisim скачаю и посмотрю, как он симулирует элементы.
В общем, все правильно там симулируется, до тех пор, пока не переполнится 8битная шина (т.е. до 189)
В общем, все правильно там симулируется, до тех пор, пока не переполнится 8битная шина (т.е. до 189)
#5
Отправлено 23 Апрель 2012 - 19:10
исправила ошибки..все работает, все понятно. спасибо вам огромное!
Поделиться темой:
Страница 1 из 1