Egor_N 0 August 21, 2009 Posted August 21, 2009 (edited) · Report post Заблудился в трех соснах под конец недели... Таблица истиности: b a Ci | Co s -------+------ 0 0 0 | 0 0 0 0 1 | 0 1 0 1 0 | 0 1 0 1 1 | 1 0 1 0 0 | 0 1 1 0 1 | 1 0 1 1 0 | 1 0 1 1 1 | 1 1 Минимизированые логические уравнения: Co=(a & Ci) | (b & Ci) | (b & a ); s=(b & ~a & ~Ci) | (~b & ~a & Ci) | (~b & ~a & Ci) | (b & a & Ci); "Растягиваю" полученное на 4-е бита, пишу вот такой верилог: module full_adder(a, b, Ci, s, Co); // Input Port(s) input [3:0] a; input [3:0] b; input Ci; // Output Port(s) output [3:0] s; output Co; // Internal wire(s) wire [3:0] C_in; wire [3:0] C_out; // Additional Module Item(s) // Minimized: // C_out = a C_in + b C_in + b a; // s = b a' C_in' + b' a C_in' + b' a' C_in + b a C_in; assign C_in[3]=Ci; assign C_out[3]=(a[3]&C_in[3])|(b[3]&C_in[3])|(b[3]&a[3]); assign s[3]=(b[3]&~a[3]&~C_in[3])|(~b[3]&~a[3]&C_in[3])|(~b[3]&~a[3]&C_in[3])|(b[3]&a[3]&C_in[3]); assign C_in[2]=C_out[3]; assign C_out[2]=(a[2]&C_in[2])|(b[2]&C_in[2])|(b[2]&a[2]); assign s[2]=(b[2]&~a[2]&~C_in[2])|(~b[2]&~a[2]&C_in[2])|(~b[2]&~a[2]&C_in[2])|(b[2]&a[2]&C_in[2]); assign C_in[1]=C_out[2]; assign C_out[1]=(a[1]&C_in[1])|(b[1]&C_in[1])|(b[1]&a[1]); assign s[1]=(b[1]&~a[1]&~C_in[1])|(~b[1]&~a[1]&C_in[1])|(~b[1]&~a[1]&C_in[1])|(b[1]&a[1]&C_in[1]); assign C_in[0]=C_out[1]; assign C_out[0]=(a[0]&C_in[0])|(b[0]&C_in[0])|(b[0]&a[0]); assign s[0]=(b[0]&~a[0]&~C_in[0])|(~b[0]&~a[0]&C_in[0])|(~b[0]&~a[0]&C_in[0])|(b[0]&a[0]&C_in[0]); assign C_out[0]=Co; endmodule "Рисую" файл входных воздействий (*.vwf). Запускаю в QuartusII на функциональную симуляцию. Все без предупреждений и ошибок. Но сумматор не суммирует. Буду весьма признателен, если кто разглядит, где нахомутано :). Edited August 21, 2009 by Egor_N Quote Share this post Link to post Share on other sites More sharing options...
Builder 1 August 21, 2009 Posted August 21, 2009 · Report post Заблудился в трех соснах под конец недели... "Рисую" файл входных воздействий (*.vwf). Запускаю в QuartusII на функциональную симуляцию. Все без предупреждений и ошибок. Но сумматор не суммирует. Буду весьма признателен, если кто разглядит, где нахомутано :). Скажу честно - правильно-ли Вы заминимизировали - не смотрел. Я-бы на Вашем месте не занимался мазохизмом, а написал всё в лоб через таблицу (или case), и посмотрел что получиться. Оптимизаторы на сегодня не плохие, не думаю что будет хуже чем ручками. Или уже пробовали и чем-то не устроило? Quote Share this post Link to post Share on other sites More sharing options...
SM 9 August 21, 2009 Posted August 21, 2009 · Report post Все куда проще. module sum(a,b,ci,s,co); input a,b,ci; output s,co; s = a^b^ci; co=(a & ci) | (b & ci) | (b & a ); endmodule module sum4(a,b,ci,s,co); input[3:0] a,b; input ci; output[3:0] s; output co; wire [2:0] c; sum sum0 (a[0], b[0], ci, s[0], c[0]); sum sum1 (a[1], b[1], c[0], s[1], c[1]); sum sum2 (a[2], b[2], c[1], s[2], c[2]); sum sum3 (a[3], b[3], c[2], s[3], co); endmodule ЗЫ Что касается квартуса и vvw - то еще не забывайте про ненулевое время распространения сигнала через сумматор. Может так часто меняете воздействия, что он банально не успевает. Quote Share this post Link to post Share on other sites More sharing options...
Egor_N 0 August 21, 2009 Posted August 21, 2009 · Report post Все куда проще... 1) То есть объявляется один модуль, а затем описывается его 4-х кратное использование внутри другого модуля, если я правильно понял. 2) Исключающее ИЛИ - s = a^b^ci; - как это я не разглядел. 3) о симуляции... перебираю 512 входных воздействий, длительность одного воздействия 1 мксек. по идее, логика должна успевать. 0) СПАСИБО. :) Quote Share this post Link to post Share on other sites More sharing options...
SM 9 August 21, 2009 Posted August 21, 2009 · Report post 1) То есть объявляется один модуль, а затем описывается его 4-х кратное использование внутри другого модуля, если я правильно понял. Да. А можно и в generate сделать N-битный параметризованный модуль. Корректнее сказать не "4-х кратное использование" а "использование 4-х экземпляров" 1мкс по любому успеет. Quote Share this post Link to post Share on other sites More sharing options...
Egor_N 0 August 21, 2009 Posted August 21, 2009 · Report post Скажу честно - правильно-ли Вы заминимизировали - не смотрел. Я-бы на Вашем месте не занимался мазохизмом, а написал всё в лоб через таблицу (или case), и посмотрел что получиться. Оптимизаторы на сегодня не плохие, не думаю что будет хуже чем ручками. Или уже пробовали и чем-то не устроило? сложно сказать, что быстрее - таблица или логика (хотя мне в данном случае особой скорости и не надо), но про табличную реализацию как-то и не подумал. как вариант вполне может быть. минимизировал в Logic Friday 1, другого ничего под рукой нет. до сих пор меня эта прога устраивает, только геморно мышкой клоцать при вводе табличных данных :( если кто аргументировано раскритикует использование данного ПО и предложит альтернативу, постараюсь прислушаться :) Quote Share this post Link to post Share on other sites More sharing options...
SM 9 August 21, 2009 Posted August 21, 2009 · Report post и предложит альтернативу, постараюсь прислушаться :) Описать таблицей на AHDL (в этом языке есть такая фича), раз все равно квартусом синтез, а потом посмотреть logic equations. ЗЫ. Я там кой-где забыл "assign" написать в спешке :) Quote Share this post Link to post Share on other sites More sharing options...
Egor_N 0 August 21, 2009 Posted August 21, 2009 · Report post Да. А можно и в generate сделать N-битный параметризованный модуль. Корректнее сказать не "4-х кратное использование" а "использование 4-х экземпляров" 1мкс по любому успеет. о корректности - не спорю :) мне надо именно 4-х битный. я хочу из него сделать двоично-десятичный сумматор, а затем преобразователь bin->bcd используя алгоритм Горнера. вот там может и понадобится параметризация. Quote Share this post Link to post Share on other sites More sharing options...
SM 9 August 21, 2009 Posted August 21, 2009 · Report post мне надо именно 4-х битный. я хочу из него сделать двоично-десятичный сумматор, а затем преобразователь bin->bcd используя алгоритм Горнера. вот там может и понадобится параметризация. Ну и на кой тогда изголяться? Я-то думал препод так сказал... Напишите {co, s} = a + b + ci; и не парьтесь с этой логикой :) Quote Share this post Link to post Share on other sites More sharing options...
Egor_N 0 August 21, 2009 Posted August 21, 2009 · Report post Описать таблицей на AHDL (в этом языке есть такая фича), раз все равно квартусом синтез, а потом посмотреть logic equations. ЗЫ. Я там кой-где забыл "assign" написать в спешке :) я уже нашел :) все работает, буду дальше раскапывать. Рабочий 4-х битный полный сумматор: module sum(a,b,ci,s,co); input a,b,ci; output s,co; assign s = a^b^ci; assign co = (a & ci) | (b & ci) | (b & a ); endmodule module sum4(a,b,ci,s,co); input[3:0] a,b; input ci; output[3:0] s; output co; wire [2:0] c; sum sum0 (a[0], b[0], ci, s[0], c[0]); sum sum1 (a[1], b[1], c[0], s[1], c[1]); sum sum2 (a[2], b[2], c[1], s[2], c[2]); sum sum3 (a[3], b[3], c[2], s[3], co); endmodule Ну и на кой тогда изголяться? Я-то думал препод так сказал... Напишите {co, s} = a + b + ci; и не парьтесь с этой логикой :) извиняюсь, но я не понял смысл этой фразы {co, s} = a + b + ci; Quote Share this post Link to post Share on other sites More sharing options...
SM 9 August 21, 2009 Posted August 21, 2009 · Report post извиняюсь, но я не понял смысл этой фразы {co, s} = a + b + ci; И что тут не понятно? Верилог как верилог... 4-х битный сумматор, если a,b,s четырехбитные, а ci,co однобитные. Quote Share this post Link to post Share on other sites More sharing options...
Egor_N 0 August 21, 2009 Posted August 21, 2009 · Report post И что тут не понятно? Верилог как верилог... 4-х битный сумматор, если a,b,s четырехбитные, а ci,co однобитные. виноват... :) проверил, действительно все проще... намного... module full_adder(a,b,ci,s,co); input [3:0]a,b; input ci; output [3:0]s; output co; assign {co, s} = a + b + ci; endmodule Quote Share this post Link to post Share on other sites More sharing options...