Jump to content
    

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

Edited by Egor_N

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...