Работа с приоритетным датчиком, когда выход описывается 3 отдельными сигналами - PullRequest
0 голосов
/ 15 ноября 2018

Я не знаю, как поступить с третьей частью 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 увеличиваетсяи это работает, я думаю.Я оставлю это немного больше, если кто-то хочет что-то увидеть, или он / она может заставить код делать меньше места, но оставляет сигналы такими, какие они есть (или если они добавляют один регистр, как, например, прокомментированный)

1 Ответ

0 голосов
/ 16 ноября 2018

Вот вариант, основанный на вашем коде, который работает. Идея состоит в том, что вы проверяете, используя первую '1' в Ds, и прекращаете проверку после нее. Для проверки их можно использовать поразрядно &.

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
...