Мажоритарный элемент на 13 входов

Если вы - начинающий в электронике, то задайте ваш вопрос тут. Расскажите что вы уже сделали чтобы найти ответ на свой вопрос, опишите свои рассуждения.
radio_fox
Сообщения: 2

Сообщение radio_fox » 03 июл 2017, 20:38

Добрый день. По заданию нужно описать на Verilog мажоритарный элемент на 13 входов. Проблема в том, что простая схема с использованием карт Карно к нему не подходит. Была найдена и описана такая схемаИзображение.
 Код на Verilog

Код: Выделить всё

module fulladder (c, a, b, Carry_Out, Out);
input c, a, b;
output reg Carry_Out, Out;
always @*
begin
//assign preOut = a ^ b;
Out = (a ^ b) ^ c;
Carry_Out = a & b | a & c | b & c;
end
endmodule

module Major (
   a,
   Carry_Out1, Out1, Carry_Out2, Out2,
   Carry_Out3, Out3, Carry_Out4, Out4,
   Carry_Out5, Out5, Carry_Out6, Out6,
   Carry_Out7, Out7, Carry_Out8, Out8,
   Carry_Out9, Out9, Carry_Out10, Out10,
   Carry_Out11, Out11
   );
    input [12:0]a;
    output Carry_Out1, Out1, Carry_Out2, Out2,
   Carry_Out3, Out3, Carry_Out4, Out4,
   Carry_Out5, Out5, Carry_Out6, Out6,
   Carry_Out7, Out7, Carry_Out8, Out8,
   Carry_Out9, Out9, Carry_Out10, Out10,
   Carry_Out11, Out11;


fulladder ADD1 (a[0], a[1], a[2],                        Out1, Carry_Out1);
fulladder ADD2 (a[4], a[5], a[6],                        Out2, Carry_Out2);
fulladder ADD3 (a[7], a[8], a[9],                        Out3, Carry_Out3);
fulladder ADD4 (a[10], a[11], a[12],                     Out4, Carry_Out4);

fulladder ADD5 (a[3], Out1, Out2,                        Out5, Carry_Out5);
fulladder ADD6 (Carry_Out5, Carry_Out1, Carry_Out2,      Out6, Carry_Out6);
fulladder ADD7 (1'b1, Out3, Out4,                        Out7, Carry_Out7);
fulladder ADD8 (Carry_Out7, Carry_Out3, Carry_Out4,      Out8, Carry_Out8);

fulladder ADD9 (1'b0, Out5, Out7,                        Out9, Carry_Out9);
fulladder ADD10 (Carry_Out9, Out6, Out8,                 Out10, Carry_Out10);
fulladder ADD11 (Carry_Out10, Carry_Out6, Carry_Out8,    Out11, Carry_Out11);
endmodule

 Testbench

Код: Выделить всё

`timescale 1ns / 10ps
module tb_majority;

//inputs
reg [12:0] a;
//outputs
wire Carry_Out1, Out1, Carry_Out2, Out2,
    Carry_Out3, Out3, Carry_Out4, Out4,
    Carry_Out5, Out5, Carry_Out6, Out6,
    Carry_Out7, Out7, Carry_Out8, Out8,
    Carry_Out9, Out9, Carry_Out10, Out10,
    Carry_Out11, Out11;

Major uut (
   .a(a),
   .Carry_Out1(Carry_Out1),   .Out1(Out1),
   .Carry_Out2(Carry_Out2),   .Out2(Out2),
   .Carry_Out3(Carry_Out3),   .Out3(Out3),
   .Carry_Out4(Carry_Out4),   .Out4(Out4),
   .Carry_Out5(Carry_Out5),   .Out5(Out5),
   .Carry_Out6(Carry_Out6),   .Out6(Out6),
   .Carry_Out7(Carry_Out7),   .Out7(Out7),
   .Carry_Out8(Carry_Out8),   .Out8(Out8),
   .Carry_Out9(Carry_Out9),   .Out9(Out9),
   .Carry_Out10(Carry_Out10), .Out10(Out10),
   .Carry_Out11(Carry_Out11), .Out11(Out11)
   );

integer k;

initial
begin
a = 0;
for (k=0; k<8192; k=k+1)
  #5 a = k;

#10000 $finish;

end

endmodule

Но выход все равно получается неверно. Подскажите пожалуйста, в чем моя ошибка? Может со схемой что-то не так или тест неверно написан?
 Результат
Изображение

super_bum
Сообщения: 229
Откуда: Earth

Сообщение super_bum » 03 июл 2017, 23:21

Странный код. Почему нельзя сравнить содержимое входной шины, например, input(12:0) с числом 7 и в случае истинности на выход подавать 1?

Аватара пользователя
TAN
Сообщения: 122
Откуда: РФ

Сообщение TAN » 04 июл 2017, 00:09

Потому что комбинации 7 единиц могут быть разные, очевидно же.

А на автомате реализовывать разрешено?

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 04 июл 2017, 05:18

Сразу видно схемотехника :) Я бы писал что-то типа такого (не протестировано)

Код: Выделить всё

parameter WIDTH = 13;
reg [$clog2(WIDTH+1)-1:0] count_ones;
reg maj;
integer idx;

always @* begin
  count_ones = {WIDTH{1'b0}}; 
  for( idx = 0; idx<WIDTH; idx = idx + 1) begin
    count_ones = count_ones + a[idx];
  end
  maj = count_ones >= WIDTH/2+1;
end


Правда, это может работать довольно медленно (но не медленнее чем вы нарисовали). Вполне вероятно ,что это придестя пайплайнить.

super_bum
Сообщения: 229
Откуда: Earth

Сообщение super_bum » 04 июл 2017, 09:44

TAN писал(а):Потому что комбинации 7 единиц могут быть разные, очевидно же.

Дык сравнивать не с шиной инпут, а что-то типа input[0] + input[1] + ... + input[12].

Аватара пользователя
iEugene0x7CA
Адепт
Сообщения: 1570
Откуда: Киев

Сообщение iEugene0x7CA » 04 июл 2017, 14:52

Нормально поиздевались с заданием. Я честно не видел, чтобы где-нибудь требовалась majority function больше чем на 3 входа. :)
Обычно банально перечисляются варианты входов, но в данном случае... Наверное самый норм вариант super_bum'а.
Т.е. переплюсовываем биты с входов и после сравниваем с 6-ю, если больше — на выходе единица.

Компилятор офигенно круто оптимизирует код и вполне вероятно, что эта штуки и не займет много ресурсов. Там аррей сумматоров и цифровой компаратор.
Да, лучше сделать эту штуку синхронной, ибо асинхрон будет жестко звонить.

Аватара пользователя
TAN
Сообщения: 122
Откуда: РФ

Сообщение TAN » 04 июл 2017, 16:05

Ну, если городить чисто на логике, без автомата, то будет 4 ступени сумматоров (14 штук) и компаратор. Между ними буферы конвейера. Это если в лоб рисовать. Думаю, не далеко будет от оптимума.

radio_fox
Сообщения: 2

Сообщение radio_fox » 07 июл 2017, 03:02

Спасибо всем за предложенные решения!
Как-то не пришло в голову, что в Verilog может быть такой подход.
Мне казалось думать нужно только о схемотехническом решении, а от него уже писать.
Кстати QuestaSim не жрет код, написанный господином BSVi. Говорит синтаксис используется для Verilog 2001 года, т.е. там выходит 95 что ли использовался о_О. Это как бы странно для новой версии. Возможно что-то неверно было с настройками. У меня вообще вызывает недоумение, как инструмент завоевал такую популярность, учитывая хотя бы неудобство редактирования кода, да и написания тоже. Наверное, он в чем-то другом невероятно крут.
К счастью, мне удалось отбрыкаться от этой задачи после трех месяцев мучений.
Но надеюсь тема поможет тому, кого еще угораздит столкнуться с таким заданием.

Аватара пользователя
iEugene0x7CA
Адепт
Сообщения: 1570
Откуда: Киев

Сообщение iEugene0x7CA » 08 июл 2017, 08:34

radio_fox писал(а):Мне казалось думать нужно только о схемотехническом решении

На то он и HDL — чтобы можно было behavioral'ом описывать что да как. Фактически программировать, а не составлять схему.
В случае схемотехники удобней, как было бы не странно — рисовать схему. :mrgreen:

А вообще, самими производителями рекомендуется гибридный подход: глобальный файл делать схемой, а отдельные запчасти описывать на HDL.
Получается визуально понятная структура, а не просто простыня текста. :geek:

Qic
Сообщения: 985

Сообщение Qic » 08 июл 2017, 22:46

Точно также кодит наш кодер на работе - в CodeSys - сама "программа" на CFC - точнее объединение блоков и потоки данных, а вот сама суть программы на ST.
Мне с микроконтроллерами частенько не хватает такого подхода.

Аватара пользователя
TAN
Сообщения: 122
Откуда: РФ

Сообщение TAN » 09 июл 2017, 04:19

Дык так все кодят. Топ еще нагляднее делать схемой, поскольку из него идут физические связи наружу.

Основной плюс HDL - в поведенческом описании. Не надо мозг ебать конкретной реализацией. Точнее, надо, если херню накодил кривокомпилируемую и нет понимания того, во че это синтезируется. :D

Вернуться в «Для начинающих»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей