Опишем в Verilog обычный четырех битный сумматор.
module sumbin(RESULT, Cout, a, b, Cin, clk);
output reg [3:0]RESULT;
output reg Cout;
input [3:0]a,b;
input Cin;
input clk;
reg [3:0]rA,rB;
reg rCin;
wire [4:0]sum_bin = rA + rB + rCin;
wire BIN_carry = sum_bin[4];
always@(posedge clk) begin
rA <= a;
rB <= b;
rCin <= Cin;
RESULT <= sum_bin[3:0];
Cout <= BIN_carry;
end
endmodule
Синтезируем и смотрим результат:
Синтезатор показывает нам что тактовая частота способна достигнуть 380МГц, задержка на самом длинном участке 2.631 ns.
Так же синтезатор показывает нам свои затраты на реализацию схемы - это 6 LUT и 14 однобитных регистров (D-триггеров), так как в ядре общая обвязка РОН - сумматор - РОН симулируется нашими регистрами то расход именно D-триггеров можно не рассматривать. Таким образом затрачено 6 LUT из которых 5 находятся в арифметическом режиме (т.е. фактически сумматоры-полусумматоры и есть). Кое какое представление как синтезатор видит описанную в HDL схему мы можем получить из просмотра RTL схемы, это конечно не ахти что - но пользоваться этим приходится.
Как видно из RTL представления схемы синтезатор вполне разборчиво отрисовывает регистры на входах (это то что он делает очень хорошо), а вот с изображением сумматора почти всегда не задается - единичный бит Cin суммируется при помощи еще одного сумматора, как 4 битная константа 0001B. Это не совсем так и для того что бы четко выяснить что же там понастроил синтезатор можно взглянуть на пост-роутинг блоков LE's.
Вот тут уже становится понятно что каждый LUT это однобитный полусумматор с входом переноса с предыдущего разряда. А вот два LUT в начале и в конце цепочки сумматоров синтезатор влепил как обыкновенные проводники, не берусь точно сказать почему он так решил сделать, но рискну предположить что цепи входа на D-триггер оказались более удаленными от выходов LUT полусумматоров. Думаю ситуация поменялась бы заставь я синтезатор оптимизировать по размеру, а не по скорости. В принципе эти два LUT можно не считать и тогда расход LUT составит - 4.
Приступим к BCD четырехбитному сумматору. BCD сумматор можно представить себе как двоичный сумматор с коррекцией результата, коррекция необходима тогда когда полученный результат является недопуcтимым значением (1010B,1011B,1100B,1101B,1110B,1111B) или в результате сложения возник перенос в следующий разряд (сумма превысила 1111B).
Коррекция - это вычитания из полученного результата 10, например для 7+7 сумматор даст 0111B + 0111B = 1110B (Eh), а должен дать 0100 (4h) с переносом в следующую тетраду 1. Воспользуемся тем что вычитание - это сложение с отрицательным числом, а отрицательное число это дополненое до 1 значение.
A - B = A + ~B + 1
A - 1010B (10) = A + 0101B (5) + 0001B = A + 0110B (6)
Таким образом коррекция результата BIN для возращения его в BCD форму это сложение полученного при двоичном суммировании значения с 0110B.
Опишем в Verilog, BCD сумматор.
module sumbcd(RESULT, Cout, a, b, Cin, clk);
output reg [3:0]RESULT;
output reg Cout;
input [3:0]a,b;
input Cin;
input clk;
reg [3:0]rA,rB;
reg rCin;
wire [4:0]sum_bin = rA + rB + rCin;
wire [3:0]sum_bcd = sum_bin[3:0] + 4'b0110;
wire BCD_carry = (sum_bin > 4'b1001);
wire BIN_carry = sum_bin[4];
always@(posedge clk) begin
rA <= a;
rB <= b;
rCin <= Cin;
RESULT <= (BCD_carry|BIN_carry)? sum_bcd : sum_bin[3:0];
Cout <= BCD_carry;
end
endmodule
Просинтезируем схему с помощью Quartus и рассмотрим полученные результаты.
Таблица использования ресурсов говорит о том что количество LUT увеличилось до 10 и похоже два LUT опять обычные проводники - так как используется только два входа, точнее можно ответить рассмотрев пост-роутинг.
Рассматриваем "скорострельность" схемы, само собой понимаем раз LUT стало больше то и задержка увеличилась (чудес не бывает). Так оно и есть максимальная частота снизилась до 353МГц упав на 27МГц по сравнению с BIN сумматором. Однако можно совершенно четко сказать что применения суммирования в бинарном виде и коррекции результата раздельно, в следующем такте (через этот же сумматор) снизило бы частоту решения вдвое. Так что выигрыш все таки есть, насколько он значителен сказать трудно - нужно строить полную модель ядра что бы понять это. Ну и посмотрим на схемы.
Мда... Бред сивой кобылы и то выглядел бы более подобающим :) Мы видим опять каскад сумматоров, элемент сравнения и кучу мультиплексоров. Конечно схемотехнически выразить то что описано Verilog очень сложно и ориентировать на RTL не стоит. Очевидно что оператор ? означающий селекцию по логическому значению в скобках оператора синтезатор отрисовывает как мультиплексор переключаемый этим значением. Взглянем лучше на пост-роутинг он даст неимоверно больше информации о реализации схемы.
Ну вот совершенно другое дело, видно даже то что синтезатор понял что суммирование в первом разряде не требует коррекции и завел это разряд сразу на регистр готового результата. Оно и верно с каким бы числом мы не суммировали 0110B (константа коррекции) в первом разряде ничего уже не поменяется. Лишний раз убеждаемся что синтезатор прогоняет всю таблицу истинности через оптимизатор (ну например через карту Карно). Кроме того видим опять шунты из двух LUT, таким образом считаем расход LUT как 8. В дальнейшем эти LUT могут быть использованы синтезатором в своих целях.
Осталось верифицировать BCD сумматор проверить получаемый им результат. Для этого необходимо написать testbench на том же Verilog.
module testbench;
reg clk;
wire [3:0]Co;
wire Carry;
reg [3:0]Ai,Bi;
reg Ci;
reg [15:0]QADDR;
sumbcd sum(
.clk(clk),
.a(Ai),
.b(Bi),
.Cin(Ci),
.RESULT(Co),
.Cout(Carry)
);
initial begin
Bi = 4'h0;
forever #40 Bi <= (Ai > 8)? Bi + 1'b1 : Bi;
end;
initial begin
Ai = 4'h0;
Ci = 1'b0;
forever #40 Ai <= (Ai > 8)? 0 : Ai + 1'b1;
end
initial begin
clk = 0;
forever #20 clk = !clk;
end
endmodule
Запустив проект в симуляторе ModelSim можно отсмотреть осциллограмму, хотя в принципе можно было бы просто сравнивать результат с тем что должно быть автоматически.
Результат появляется на регистрах только в следующем такте, так как по первому фронту значения слагаемых записываются в регистры rA, rB и только в следующем фронте результат сложения rA и rB записывается в выходной регистр результата.
И так сделаем выводы:
BCD сумматор - 8 LUT
BIN сумматор - 4 LUT
Расход LUT для BCD арифметики вдвое выше.
BCD сумматор - 353 МГц
BIN сумматор - 380 МГц
Частотность - здесь не все так очевидно, возможно будет и выигрыш по скорости, если количество операций для суммирования итоговых вещественных чисел будет меньше в случае BCD. Для этого необходимо задаться примером и совершить сложение на полноразрядных BIN и BCD сумматорах таким образом что бы получить вещественные значения в сопоставимом по точности формате BIN и BCD.
Ну ты мастер... у меня снова взрыв мозга... :) Хотя все более менее понятно, по крайней мере ни одного неизвестного термина не встретил...
ОтветитьУдалитьЭх разгребусь с учебой снова Спецом займусь...
Конечно, давно пора тебе вернуться к реализации своих планов :) Да и сессия уже должна кончиться или я не прав?
ОтветитьУдалитьДолжна то она должна... Но потом практика учебная будет... Опять какую-нибудь чушь делать будем... На прошлой сканер ломали... :D
ОтветитьУдалитьИнтересный вопрос к тебе - раньше когда я учился (правда это было сильно раньше :) в том веке еще), НИРС приветствовался. Может быть найти на кафедре заинтересованных лиц "преподов" и обговорить с ними условия прохождения твоей практики как исследовательской работы - например сборка микропроцессорной системы для исследования работы микропроцессорного комплекта К580? Не выгорит такой вариант? Сейчас вообще НИРС есть?
ОтветитьУдалитьP.S. Мой друг до сих пор в альма-матер утверждает что есть и что привествуется.