我为优先级编码器编写了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
答案 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