Я не знаю, как поступить с третьей частью priority encoder
, где, если в inputs
появится более одного 1
, на выходе будет number
из most significant
1
.Сначала я подумал, может быть, сделать for loop
, так что i decreases
, но я не смог его применить.И я уверен, что есть более простой способ, чем создание всех комбинаций 4 bit
для VD
.
Таблица истинности: http://prntscr.com/limnd8 и примеры того, как она должна работать:
D3 = 0, D2 = 0, D1 = 0, D0 = 0 -> Υ1 = 0, Υ0 = 0, нули = 1
D3 = 1, D2 = 1, D1 = 0, D0 = 1 -> Υ1 = 1, Υ0 = 1, нули = 0
D3 = 0, D2 = 1, D1 = 0, D0 = 1 -> Υ1 = 1, Υ0 = 0,Нули = 0
module priorityenc_behav( D0, D1, D2, D3, Y0, Y1, Z);
input D0, D1, D2, D3;
output reg Y0, Y1, Z;
reg [3:0] VD;
integer i;
always @ (D0,D1,D2,D3)
begin
VD = 4'b0000;
if ({D3,D2,D1,D0} == 4'b0000)
{Y1,Y0,Z} = 3'b001;
VD = 4'b1111;
for (i=3; i>=0; i=i-1)
begin
if ((2**i) == {D3,D2,D1,D0})
begin
{Y1,Y0} = i;
Z = 0;
end
//////////////////////////
else if(VD[ == {D3,D2,D1,D0})
begin
{Y1,Y0} = i;
Z = 0;
//////////////////////
end
end
end
endmodule
Я немного изменил его, но я не могу контролировать оператор if if правильно
module priorityenc_behav( D0, D1, D2, D3, Y0, Y1, Z);
input D0, D1, D2, D3;
output reg Y0, Y1, Z;
//reg [3:0] VD;
integer i;
always @ (D0,D1,D2,D3)
begin
if ({D3,D2,D1,D0} == 4'b0000)
{Y1,Y0,Z} = 3'b001;
for (i=3; i>=0; i=i-1)
begin
if ({D3,D2,D1,D0} == (2**i))
begin
{Y1,Y0} = i;
Z = 0;
end
else if({D3,D2,D1,D0}>2**i)
begin
{Y1,Y0} = i;
Z = 0;
end
end
end
endmodule
Хорошо, я вернул свой for
обратно, так что i
увеличиваетсяи это работает, я думаю.Я оставлю это немного больше, если кто-то хочет что-то увидеть, или он / она может заставить код делать меньше места, но оставляет сигналы такими, какие они есть (или если они добавляют один регистр, как, например, прокомментированный)