当输出由3个单独的信号描述时,处理优先级编码器

时间:2018-11-15 09:44:37

标签: verilog

我不知道如何处理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),我会多留一点。

1 个答案:

答案 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