优先级编码器的verilog代码

时间:2016-09-10 06:14:30

标签: verilog digital-logic

我为优先级编码器编写了verilog代码,这个代码可以用于模拟目的吗?什么可以用于合成的代码?请放弃你的意见和想法。

module pri_encoder(y,i,enable);
output reg [3:0]y;
input [15:0]i;
input enable;

always@(i or enable)
if(enable)
if(!i)
y=4'bx;
else if(i==1)
y=4'b0;
else if(i==2)
  y=1;
else if(i==3)
  y=2;
  else if(i>=4 && i<=7)
  y=3;
  else if(i>=8 && i<=16)
  y=4;
  else if(i>=16 && i<=32)
  y=5;
  else if(i>=32 && i<=64)
  y=6;
  else if(i>=64 && i<=128)
  y=7;
  else if(i>=128 && i<=256)
  y=8;
  else if(i>=256 && i<=512)
  y=9;
  else if(i>=512 && i<=1024)
  y=10;
  else if(i>=1024 && i<=2048)
  y=11;
endmodule

2 个答案:

答案 0 :(得分:0)

你的设计可能是可以合成的,但根据上面的评论,你会得到一个锁。如果你摆脱了锁存器,casex语句可能更具可读性。

这是我使用的小型编码器。我已将其修改为启用。 “enable + select”输入的宽度与{1'b1,6'bxxxxxx}中矢量的宽度相匹配至关重要。在这种情况下,1 + 6 = 7.您可以放大以满足您的需要。

function [2:0] prienc6;
 input       enable;
 input [5:0] select;
 reg   [2:0] out;
 begin
   casex({enable,select})
     {1'b1,6'b000001}: out = 3'b101;
     {1'b1,6'b00001x}: out = 3'b100;
     {1'b1,6'b0001xx}: out = 3'b011; 
     {1'b1,6'b001xxx}: out = 3'b010; 
     {1'b1,6'b01xxxx}: out = 3'b001; 
     {1'b1,6'b1xxxxx}: out = 3'b000;
     {1'b0,6'bxxxxxx}: out = 3'b000;  // if you assign out = out, then you get latches.
   endcase

   prienc6 = out ;
 end
endfunction

你可以扩展它以包括prev_out和一个时钟以避免锁存,因此

reg [2:0] encode_out;

function [2:0] prienc6;
 input       enable;
 input [5:0] select;
 input [2:0] prev_out;
 reg   [2:0] out;
 begin
   casex({enable,select})
     {1'b1,6'b000001}: out = 3'b101;
     {1'b1,6'b00001x}: out = 3'b100;
     {1'b1,6'b0001xx}: out = 3'b011; 
     {1'b1,6'b001xxx}: out = 3'b010; 
     {1'b1,6'b01xxxx}: out = 3'b001; 
     {1'b1,6'b1xxxxx}: out = 3'b000;
     {1'b0,6'bxxxxxx}: out = prev_out;
   endcase

   prienc6 = out ;
 end
endfunction

always @ (posedge clk or posedge reset)
begin 
   if (reset) encode_out <= 3'b000;
   else encode_out <= prienc6(some_enable,some_select,encode_out); //latch avoided.

end

我不知道这是否合适,但这是我的首选解决方案。我在函数外部启用了启用。

reg [2:0] encode_out;

function [2:0] prienc6;
     input [5:0] select;
     reg   [2:0] out;
     begin
       casex(select)
         6'b000001: out = 3'b101;
         6'b00001x: out = 3'b100;
         6'b0001xx: out = 3'b011; 
         6'b001xxx: out = 3'b010; 
         6'b01xxxx: out = 3'b001; 
         6'b1xxxxx: out = 3'b000;
         default  : out = 3'b000;
       endcase

       prienc6 = out ;
     end
    endfunction

always @ (posedge clk or posedge reset)
begin 
   if (reset) encode_out <= 3'b000;
   else       encode_out <= enable ? prienc6(some_input) : encode_out;
end

答案 1 :(得分:0)

以下代码是3位优先级编码器。你可以实现同样的目标 代码也。我用最简单的方式编写了代码。

您的代码不包含使电路合成为锁存器的else条件。

module priority(input [7:0] a,
input enable,
output reg [2:0] b    );

always @(*)
begin
if(enable)
begin
if (a[7:0]==1)
b=0;
else if(a[7:1]==1)
b=1;
else if(a[7:2]==1)
b=2;
else if(a[7:3]==1)
b=3;
else if(a[7:4]==1)
b=4;
else if(a[7:5]==1)
b=5;
else if(a[7:6]==1)
b=6;
else if(a[7]==1)
b=7;
end
else
b=4'bxxxx;
end
endmodule