我不知道如何处理priority encoder
的第三部分,如果在1
中出现多个inputs
,则输出将是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
我做了一点修改,但是我不能正确地控制else 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
增大了,我认为这是有效的。如果有人想看任何东西,或者他/她可以使代码占用更少的空间,而又保持信号原样(或者如果他们添加了一个如喜欢的注释的reg),我会多留一点。
答案 0 :(得分:2)
这是根据您的代码起作用的变体。这个想法是,您使用Ds中的第一个“ 1”进行检查,然后停止检查。要检查它们,可以使用按位&
。
module priorityenc_behav( D0, D1, D2, D3, Y0, Y1, Z);
input D0, D1, D2, D3;
output reg Y0, Y1, Z;
integer i;
reg flag;
always @* begin
if ({D3,D2,D1,D0} == 4'b0000)
{Y1,Y0,Z} = 3'b001;
else begin
flag = 0;
for (i=3; i>=0; i=i-1) begin
if (flag == 0 && ({D3,D2,D1,D0} & (4'b0001 << i)) != 0) begin
flag = 1;
{Y1, Y0} = i;
Z = 1'b0;
end
end
end
end
endmodule
根据您的情况,另一个版本更简单易读:
module priorityenc_behav( D0, D1, D2, D3, Y0, Y1, Z);
input D0, D1, D2, D3;
output reg Y0, Y1, Z;
always @* begin
casez({D3,D2,D1,D0})
4'b0000: {Y1,Y0,Z} = 3'b001;
4'b0001: {Y1,Y0,Z} = 3'b000;
4'b001?: {Y1,Y0,Z} = 3'b010;
4'b01??: {Y1,Y0,Z} = 3'b100;
4'b1???: {Y1,Y0,Z} = 3'b110;
endcase
end
endmodule