Страница 1 из 1
Мажоритарный элемент на 13 входов
Добавлено: 03 июл 2017, 20:38
radio_fox
Добрый день. По заданию нужно описать на Verilog мажоритарный элемент на 13 входов. Проблема в том, что простая схема с использованием карт Карно к нему не подходит. Была найдена и описана такая схема
.
Код: Выделить всё
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
Код: Выделить всё
`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
Но выход все равно получается неверно. Подскажите пожалуйста, в чем моя ошибка? Может со схемой что-то не так или тест неверно написан?
Re: Мажоритарный элемент на 13 входов
Добавлено: 03 июл 2017, 23:21
super_bum
Странный код. Почему нельзя сравнить содержимое входной шины, например, input(12:0) с числом 7 и в случае истинности на выход подавать 1?
Re: Мажоритарный элемент на 13 входов
Добавлено: 04 июл 2017, 00:09
TAN
Потому что комбинации 7 единиц могут быть разные, очевидно же.
А на автомате реализовывать разрешено?
Re: Мажоритарный элемент на 13 входов
Добавлено: 04 июл 2017, 05:18
BSVi
Сразу видно схемотехника
Я бы писал что-то типа такого (не протестировано)
Код: Выделить всё
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
Правда, это может работать довольно медленно (но не медленнее чем вы нарисовали). Вполне вероятно ,что это придестя пайплайнить.
Re: Мажоритарный элемент на 13 входов
Добавлено: 04 июл 2017, 09:44
super_bum
TAN писал(а):Потому что комбинации 7 единиц могут быть разные, очевидно же.
Дык сравнивать не с шиной инпут, а что-то типа input[0] + input[1] + ... + input[12].
Re: Мажоритарный элемент на 13 входов
Добавлено: 04 июл 2017, 14:52
iEugene0x7CA
Нормально поиздевались с заданием. Я честно не видел, чтобы где-нибудь требовалась majority function больше чем на 3 входа.
Обычно банально перечисляются варианты входов, но в данном случае... Наверное самый норм вариант
super_bum'а.
Т.е. переплюсовываем биты с входов и после сравниваем с 6-ю, если больше — на выходе единица.
Компилятор офигенно круто оптимизирует код и вполне вероятно, что эта штуки и не займет много ресурсов. Там аррей сумматоров и цифровой компаратор.
Да, лучше сделать эту штуку синхронной, ибо асинхрон будет жестко звонить.
Re: Мажоритарный элемент на 13 входов
Добавлено: 04 июл 2017, 16:05
TAN
Ну, если городить чисто на логике, без автомата, то будет 4 ступени сумматоров (14 штук) и компаратор. Между ними буферы конвейера. Это если в лоб рисовать. Думаю, не далеко будет от оптимума.
Re: Мажоритарный элемент на 13 входов
Добавлено: 07 июл 2017, 03:02
radio_fox
Как-то не пришло в голову, что в Verilog может быть такой подход.
Мне казалось думать нужно только о схемотехническом решении, а от него уже писать.
Кстати QuestaSim не жрет код, написанный господином BSVi. Говорит синтаксис используется для Verilog 2001 года, т.е. там выходит 95 что ли использовался о_О. Это как бы странно для новой версии. Возможно что-то неверно было с настройками. У меня вообще вызывает недоумение, как инструмент завоевал такую популярность, учитывая хотя бы неудобство редактирования кода, да и написания тоже. Наверное, он в чем-то другом невероятно крут.
К счастью, мне удалось отбрыкаться от этой задачи после трех месяцев мучений.
Но надеюсь тема поможет тому, кого еще угораздит столкнуться с таким заданием.
Re: Мажоритарный элемент на 13 входов
Добавлено: 08 июл 2017, 08:34
iEugene0x7CA
radio_fox писал(а):Мне казалось думать нужно только о схемотехническом решении
На то он и HDL — чтобы можно было behavioral'ом описывать что да как. Фактически программировать, а не составлять схему.
В случае схемотехники удобней, как было бы не странно — рисовать схему.
А вообще, самими производителями рекомендуется гибридный подход: глобальный файл делать схемой, а отдельные запчасти описывать на HDL.
Получается визуально понятная структура, а не просто простыня текста.
Re: Мажоритарный элемент на 13 входов
Добавлено: 08 июл 2017, 22:46
Qic
Точно также кодит наш кодер на работе - в CodeSys - сама "программа" на CFC - точнее объединение блоков и потоки данных, а вот сама суть программы на ST.
Мне с микроконтроллерами частенько не хватает такого подхода.
Re: Мажоритарный элемент на 13 входов
Добавлено: 09 июл 2017, 04:19
TAN
Дык так все кодят. Топ еще нагляднее делать схемой, поскольку из него идут физические связи наружу.
Основной плюс HDL - в поведенческом описании. Не надо мозг ебать конкретной реализацией. Точнее, надо, если херню накодил кривокомпилируемую и нет понимания того, во че это синтезируется.