用verilog语言实现在32位二进制数中统计出第一个1之前的0的个数
展开全部
找高位的1的,position输出的就是从高位到低位第一个1的位置,算个数的话用32减一下就行。
reg [31:0] data;
reg [ 4:0] position;
reg [15:0] sel1;
reg [ 7:0] sel2;
reg [ 3:0] sel3;
reg [ 2:0] sel4;
always @(*) begin
if(|data[31:16] == 0) begin
position[4] = 0;
sel1 = data[15:0];
end
else begin
position[4] = 1;
sel1 = data[31:16];
end
end
always @(*) begin
if(|sel1[15:8] == 1'b0) begin
position[3] = 0;
sel2 = sel1[7:0];
end
else begin
position[3] = 1;
sel2 = sel1[15:8];
end
end
always @(*) begin
if(|sel2[7:4] == 1'b0) begin
position[2] = 0;
sel3 = sel2[3:0];
end
else begin
position[2] = 1;
sel3 = sel2[7:4];
end
end
always @(*) begin
if(|sel3[3:2] == 1'b0) begin
position[1] = 0;
sel4 = sel3[1:0];
end
else begin
position[1] = 1;
sel4 = sel3[3:2];
end
end
always @(*) begin
if(sel4[1] == 1'b0) begin
position[0] = 0;
end
else begin
position[0] = 1;
end
end
reg [31:0] data;
reg [ 4:0] position;
reg [15:0] sel1;
reg [ 7:0] sel2;
reg [ 3:0] sel3;
reg [ 2:0] sel4;
always @(*) begin
if(|data[31:16] == 0) begin
position[4] = 0;
sel1 = data[15:0];
end
else begin
position[4] = 1;
sel1 = data[31:16];
end
end
always @(*) begin
if(|sel1[15:8] == 1'b0) begin
position[3] = 0;
sel2 = sel1[7:0];
end
else begin
position[3] = 1;
sel2 = sel1[15:8];
end
end
always @(*) begin
if(|sel2[7:4] == 1'b0) begin
position[2] = 0;
sel3 = sel2[3:0];
end
else begin
position[2] = 1;
sel3 = sel2[7:4];
end
end
always @(*) begin
if(|sel3[3:2] == 1'b0) begin
position[1] = 0;
sel4 = sel3[1:0];
end
else begin
position[1] = 1;
sel4 = sel3[3:2];
end
end
always @(*) begin
if(sel4[1] == 1'b0) begin
position[0] = 0;
end
else begin
position[0] = 1;
end
end
追问
想用assign语句怎么写最好是门级的
追答
这个也都是组合逻辑呀,综合出来也都是门级的。
按思路展开就可以用assign写,不过是一样的。
比如第一个always块可以写成:
assign position[4] = ( | data[31:16]=='b0) ? 1'b1 : 1'b1;
assign sel1 = ( | data[31:16]=='b0) ? data[15:0] : data[31:16];
用assign写有什么特殊要求么?
这电路的具体实现就是一堆2选一的MUX,和多位或
展开全部
用移位寄存器存储数据,然后一位一位的检测,数据为0,计数器加一,为1输出计数器数据。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2017-08-29
引用tt53527191的回答:
找高位的1的,position输出的就是从高位到低位第一个1的位置,算个数的话用32减一下就行。
reg [31:0] data;
reg [ 4:0] position;
reg [15:0] sel1;
reg [ 7:0] sel2;
reg [ 3:0] sel3;
reg [ 2:0] sel4;
always @(*) begin
if(|data[31:16] == 0) begin
position[4] = 0;
sel1 = data[15:0];
end
else begin
position[4] = 1;
sel1 = data[31:16];
end
end
always @(*) begin
if(|sel1[15:8] == 1'b0) begin
position[3] = 0;
sel2 = sel1[7:0];
end
else begin
position[3] = 1;
sel2 = sel1[15:8];
end
end
always @(*) begin
if(|sel2[7:4] == 1'b0) begin
position[2] = 0;
sel3 = sel2[3:0];
end
else begin
position[2] = 1;
sel3 = sel2[7:4];
end
end
always @(*) begin
if(|sel3[3:2] == 1'b0) begin
position[1] = 0;
sel4 = sel3[1:0];
end
else begin
position[1] = 1;
sel4 = sel3[3:2];
end
end
always @(*) begin
if(sel4[1] == 1'b0) begin
position[0] = 0;
end
else begin
position[0] = 1;
end
end
找高位的1的,position输出的就是从高位到低位第一个1的位置,算个数的话用32减一下就行。
reg [31:0] data;
reg [ 4:0] position;
reg [15:0] sel1;
reg [ 7:0] sel2;
reg [ 3:0] sel3;
reg [ 2:0] sel4;
always @(*) begin
if(|data[31:16] == 0) begin
position[4] = 0;
sel1 = data[15:0];
end
else begin
position[4] = 1;
sel1 = data[31:16];
end
end
always @(*) begin
if(|sel1[15:8] == 1'b0) begin
position[3] = 0;
sel2 = sel1[7:0];
end
else begin
position[3] = 1;
sel2 = sel1[15:8];
end
end
always @(*) begin
if(|sel2[7:4] == 1'b0) begin
position[2] = 0;
sel3 = sel2[3:0];
end
else begin
position[2] = 1;
sel3 = sel2[7:4];
end
end
always @(*) begin
if(|sel3[3:2] == 1'b0) begin
position[1] = 0;
sel4 = sel3[1:0];
end
else begin
position[1] = 1;
sel4 = sel3[3:2];
end
end
always @(*) begin
if(sel4[1] == 1'b0) begin
position[0] = 0;
end
else begin
position[0] = 1;
end
end
展开全部
计算个数应该用31去减吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询