#logic #verilog #digital-logic
#Логические #verilog #цифровая логика
Вопрос:
Пока у меня есть этот код для 2-разрядного компаратора.
module twobitcomparator(xgtyin,xety,xltyin,x1,x0,y1,y0,xgty,xety,xlty);
//I/O
output xgty, xety, xlty; //xgty - x>y, xlty - x<y, xety - x=y
input x1, x0, y1, y0, xgtyin, xetyin, xltyin;
//specify circuit behavior
assign r = (xgyin);
assign s = (xlyin);
assign t = (xetyin);//not sure if I need an xetyin
assign a = (x1amp;~y1);
assign b = (x1amp;x0amp;~y0);
assign c = (x0amp;~y1amp;~y0);
assign xgty = (a|b|c|r);//X>Y
assign d = (~x0amp;~y0);
assign e = (x0amp;y0);
assign f = (x1amp;y1);
assign g = (~x1amp;~y1);
assign xety = ((d|e)amp;(f|g));//X=Y
assign h = (~x1amp;~x0amp;y0);
assign i = (~x1amp;y1);
assign j = (~x0amp;y1amp;y0);
assign xlty = (h|i|j|s);//X<Y
endmodule
Хорошо ли это выглядит? Я написал для него тестовый стенд и посмотрел на волну, и результаты были правильными для входных данных, но я не уверен, что это самый эффективный способ.
Что касается каскадирования, я знаю, что результат компаратора с наивысшим битом (если это неравенство) просто нужно будет отправить через остальные компараторы, и это будет конечный результат. Если они равны, то мне просто нужно найти компаратор с наивысшим битом, где есть неравенство, и это должно быть каскадировано, как я уже упоминал.
Я застрял на том, чтобы заставить их работать каскадно, я очень новичок в Verilog и понятия не имею, как мне перенести результат каждого компаратора в следующий. Вот моя попытка.
module ncompare#( parameter n = 2)(input [2*n-1:0] xgyin, xlyin,
input [2*n-1:0] x1, x0, y1, y0,
output [2*n-1:0] xgy, xey, xly,
output xqyout);
wire xqyin;
assign xqyin = 1'b0;
twobitcomparator s1(.xgyin(xgyin[xqyin]), .xlyin(xlyin[xqyin]),
.x1(x1[2*n-1]), .x0(x0[2*n-2]), .y1(y1[2*n-1]), .y0(y0[2*n-2]),
.xgy(xgy[ripple0]), .xey(xey[ripple1]), .xly(xly[ripple2]));
twobitcomparator s0(.xgyin(xgyin[ripple0]), .xlyin(xlyin[ripple2]),
.x1(x1[1]), .x0(x0[0]), .y1(y1[1]), .y0(y0[0]),
.xgy(xgy[ripple3]), .xey(xey[ripple4]), .xly(xly[ripple5]));
endmodule
Я думаю, мне нужно использовать оператор generate, так как мне нужно заставить его работать для любого параметра n, но я понятия не имею, как использовать generate, поскольку все примеры, которые я рассмотрел, имеют только один вывод, а у меня их три (которые также являются входами следующего компаратора! Ага!)
Спасибо за любую помощь!
Ответ №1:
2-разрядный модуль компаратора может быть переписан как
module twobitcomparator(xgtyin,xltyin,x,y,xgty,xlty,xety);
output xgty, xety, xlty;
input xgtyin, xltyin;
input [1:0] x,y;
assign xgty = xgtyin | (~xltyin amp; ((x[1] > y[1]) | ((x[1] == y[1]) amp; (x[0] > y[0]))));
assign xlty = xltyin | (~xgtyin amp; ((x[1] < y[1]) | ((x[1] == y[1]) amp; (x[0] < y[0]))));
assign xety = ~(xlty | xgty);
endmodule
Я обработал двухбитовый ввод как шину вместо того, чтобы рассматривать их как отдельные биты (Verilog позволяет вам это делать). Я урезал многочисленные промежуточные результаты, которые присутствовали в вашем коде. Это упрощает понимание кода, поскольку вам не нужно отслеживать все эти временные провода.
Затем я смоделировал этот модуль с помощью Icarus Verilog на EDA Playground. Ссылка здесь https://www.edaplayground.com/x/5KRL
Четырехразрядный компаратор, который использует эти два битовых компаратора, может быть записан следующим образом.
module fourbitcomparator(xgtyin,xltyin,x,y,xgty,xlty,xety);
output xgty, xety, xlty;
input xgtyin, xltyin;
input [3:0] x,y;
wire xgty_1,xlty_1,xety_1;
twobitcomparator u_1 (
.xgtyin(xgtyin),
.xltyin(xltyin),
.x(x[3:2]),
.y(y[3:2]),
.xgty(xgty_1),
.xlty(xlty_1),
.xety(xety_1)
);
twobitcomparator u_0 (
.xgtyin(xgty_1),
.xltyin(xlty_1),
.x(x[1:0]),
.y(y[1:0]),
.xgty(xgty),
.xlty(xlty),
.xety(xety)
);
endmodule
Наконец, 2n-разрядный компаратор, использующий twobitcomparators, можно обобщить следующим образом
module twoN_bitcomparator #(
parameter N = 2
)(
input xgtyin,
input xltyin,
input [(2*N-1):0]x,
input [(2*N-1):0]y,
output xgty,
output xlty,
output xety
);
wire [N:0] xgty_w,xlty_w,xety_w;
assign xgty_w[N] = xgtyin;
assign xlty_w[N] = xltyin;
generate
genvar i;
for (i=0;i<=(N-1);i=i 1)
begin:TWOBITGEN
twobitcomparator u_1 (
.xgtyin(xgty_w[i 1]),
.xltyin(xlty_w[i 1]),
.x(x[(2*i 1) : (2*i)]),
.y(y[(2*i 1) : (2*i)]),
.xgty(xgty_w[i]),
.xlty(xlty_w[i]),
.xety(xety_w[i])
);
end
endgenerate
assign xgty = xgty_w[0];
assign xlty = xlty_w[0];
assign xety = xety_w[0];
endmodule
Моделирование этого обобщенного модуля также доступно на EDA playground по адресу https://www.edaplayground.com/x/2fbr
Форма сигнала для небольшого тестового стенда также доступна по адресу https://www.edaplayground.com/w/x/27X