Egor_N 0 21 августа, 2009 Опубликовано 21 августа, 2009 (изменено) · Жалоба Заблудился в трех соснах под конец недели... Таблица истиности: 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 на функциональную симуляцию. Все без предупреждений и ошибок. Но сумматор не суммирует. Буду весьма признателен, если кто разглядит, где нахомутано :). Изменено 21 августа, 2009 пользователем Egor_N Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Builder 1 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба Заблудился в трех соснах под конец недели... "Рисую" файл входных воздействий (*.vwf). Запускаю в QuartusII на функциональную симуляцию. Все без предупреждений и ошибок. Но сумматор не суммирует. Буду весьма признателен, если кто разглядит, где нахомутано :). Скажу честно - правильно-ли Вы заминимизировали - не смотрел. Я-бы на Вашем месте не занимался мазохизмом, а написал всё в лоб через таблицу (или case), и посмотрел что получиться. Оптимизаторы на сегодня не плохие, не думаю что будет хуже чем ручками. Или уже пробовали и чем-то не устроило? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба Все куда проще. 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 - то еще не забывайте про ненулевое время распространения сигнала через сумматор. Может так часто меняете воздействия, что он банально не успевает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egor_N 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба Все куда проще... 1) То есть объявляется один модуль, а затем описывается его 4-х кратное использование внутри другого модуля, если я правильно понял. 2) Исключающее ИЛИ - s = a^b^ci; - как это я не разглядел. 3) о симуляции... перебираю 512 входных воздействий, длительность одного воздействия 1 мксек. по идее, логика должна успевать. 0) СПАСИБО. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба 1) То есть объявляется один модуль, а затем описывается его 4-х кратное использование внутри другого модуля, если я правильно понял. Да. А можно и в generate сделать N-битный параметризованный модуль. Корректнее сказать не "4-х кратное использование" а "использование 4-х экземпляров" 1мкс по любому успеет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egor_N 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба Скажу честно - правильно-ли Вы заминимизировали - не смотрел. Я-бы на Вашем месте не занимался мазохизмом, а написал всё в лоб через таблицу (или case), и посмотрел что получиться. Оптимизаторы на сегодня не плохие, не думаю что будет хуже чем ручками. Или уже пробовали и чем-то не устроило? сложно сказать, что быстрее - таблица или логика (хотя мне в данном случае особой скорости и не надо), но про табличную реализацию как-то и не подумал. как вариант вполне может быть. минимизировал в Logic Friday 1, другого ничего под рукой нет. до сих пор меня эта прога устраивает, только геморно мышкой клоцать при вводе табличных данных :( если кто аргументировано раскритикует использование данного ПО и предложит альтернативу, постараюсь прислушаться :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба и предложит альтернативу, постараюсь прислушаться :) Описать таблицей на AHDL (в этом языке есть такая фича), раз все равно квартусом синтез, а потом посмотреть logic equations. ЗЫ. Я там кой-где забыл "assign" написать в спешке :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egor_N 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба Да. А можно и в generate сделать N-битный параметризованный модуль. Корректнее сказать не "4-х кратное использование" а "использование 4-х экземпляров" 1мкс по любому успеет. о корректности - не спорю :) мне надо именно 4-х битный. я хочу из него сделать двоично-десятичный сумматор, а затем преобразователь bin->bcd используя алгоритм Горнера. вот там может и понадобится параметризация. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба мне надо именно 4-х битный. я хочу из него сделать двоично-десятичный сумматор, а затем преобразователь bin->bcd используя алгоритм Горнера. вот там может и понадобится параметризация. Ну и на кой тогда изголяться? Я-то думал препод так сказал... Напишите {co, s} = a + b + ci; и не парьтесь с этой логикой :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egor_N 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба Описать таблицей на 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба извиняюсь, но я не понял смысл этой фразы {co, s} = a + b + ci; И что тут не понятно? Верилог как верилог... 4-х битный сумматор, если a,b,s четырехбитные, а ci,co однобитные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egor_N 0 21 августа, 2009 Опубликовано 21 августа, 2009 · Жалоба И что тут не понятно? Верилог как верилог... 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться