Перейти к содержанию
    

4-х битный полный сумматор на Verilog

Заблудился в трех соснах под конец недели...

 

Таблица истиности:

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 на функциональную симуляцию. Все без предупреждений и ошибок. Но сумматор не суммирует. Буду весьма признателен, если кто разглядит, где нахомутано :).

Изменено пользователем Egor_N

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заблудился в трех соснах под конец недели...

"Рисую" файл входных воздействий (*.vwf). Запускаю в QuartusII на функциональную симуляцию. Все без предупреждений и ошибок. Но сумматор не суммирует. Буду весьма признателен, если кто разглядит, где нахомутано :).

Скажу честно - правильно-ли Вы заминимизировали - не смотрел.

Я-бы на Вашем месте не занимался мазохизмом, а написал всё в лоб через таблицу (или case), и посмотрел что получиться.

Оптимизаторы на сегодня не плохие, не думаю что будет хуже чем ручками.

Или уже пробовали и чем-то не устроило?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все куда проще.

 

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 - то еще не забывайте про ненулевое время распространения сигнала через сумматор. Может так часто меняете воздействия, что он банально не успевает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все куда проще...

 

1) То есть объявляется один модуль, а затем описывается его 4-х кратное использование внутри другого модуля, если я правильно понял.

 

2) Исключающее ИЛИ - s = a^b^ci; - как это я не разглядел.

 

3) о симуляции... перебираю 512 входных воздействий, длительность одного воздействия 1 мксек. по идее, логика должна успевать.

 

0) СПАСИБО. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) То есть объявляется один модуль, а затем описывается его 4-х кратное использование внутри другого модуля, если я правильно понял.

Да. А можно и в generate сделать N-битный параметризованный модуль. Корректнее сказать не "4-х кратное использование" а "использование 4-х экземпляров"

 

1мкс по любому успеет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скажу честно - правильно-ли Вы заминимизировали - не смотрел.

Я-бы на Вашем месте не занимался мазохизмом, а написал всё в лоб через таблицу (или case), и посмотрел что получиться.

Оптимизаторы на сегодня не плохие, не думаю что будет хуже чем ручками.

Или уже пробовали и чем-то не устроило?

 

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

 

минимизировал в Logic Friday 1, другого ничего под рукой нет. до сих пор меня эта прога устраивает, только геморно мышкой клоцать при вводе табличных данных :( если кто аргументировано раскритикует использование данного ПО и предложит альтернативу, постараюсь прислушаться :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и предложит альтернативу, постараюсь прислушаться :)

 

Описать таблицей на AHDL (в этом языке есть такая фича), раз все равно квартусом синтез, а потом посмотреть logic equations.

 

ЗЫ. Я там кой-где забыл "assign" написать в спешке :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да. А можно и в generate сделать N-битный параметризованный модуль. Корректнее сказать не "4-х кратное использование" а "использование 4-х экземпляров"

 

1мкс по любому успеет.

 

о корректности - не спорю :)

 

мне надо именно 4-х битный. я хочу из него сделать двоично-десятичный сумматор, а затем преобразователь bin->bcd используя алгоритм Горнера. вот там может и понадобится параметризация.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мне надо именно 4-х битный. я хочу из него сделать двоично-десятичный сумматор, а затем преобразователь bin->bcd используя алгоритм Горнера. вот там может и понадобится параметризация.

 

Ну и на кой тогда изголяться? Я-то думал препод так сказал... Напишите {co, s} = a + b + ci; и не парьтесь с этой логикой :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Описать таблицей на 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

извиняюсь, но я не понял смысл этой фразы {co, s} = a + b + ci;

И что тут не понятно? Верилог как верилог... 4-х битный сумматор, если a,b,s четырехбитные, а ci,co однобитные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И что тут не понятно? Верилог как верилог... 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...