verilog 输出一串数字的初始1的位置,末端1的位置_组合逻辑_附代码仿真波形


1.题目 输入 数据 data=1100_1010 输出first_one = 0010 last=1000 ,

思路,计算first_one ,先将1100_1010 变成0000_0010 这就是优先仲裁器的设计思路,然后输出该bit的位置就可,

对于last_one ,将datain 高低位转换一下,再同样的用之前思路就可。

2.分析,此题用组合逻辑设计,对电路的理解,有很大的作用,小编犯的错误有

  1. 用assign 赋值时,若做减法,必须右边用信号代替,不能直接用数值。 即
reg [7:0] last_one8=8'd8;

assign last_one=last_one8-last_one_1; //正确

//******************
assign  last_one=8'd8-last_one_1;    //错误!!!

  2.generate for beign  没有命名,

  3.不能直接assign last[7:0]=datain[0:7] ; 这样的语句实现倒置功能,必须用多个赋值语句 或者用 generate for

genvar k;
generate for (k=0;k<8;k=k+1) begin : l3
 assign last_1[k]=datain[7-k];     // last_1[0:7]=datain[7:0];
    end
endgenerate

3. 全部代码

module fund1(input [7:0]datain,
 
output reg [3:0]first_one,
output [3:0] last_one
);

wire [7:0] last_1,last_2;
wire [7:0] first;

assign first= datain & (~(datain-8'd1)) ;

genvar i,j,k;
generate for (i=0;i<8;i=i+1) begin : fst1
always @(*)
case(1)
first[i] :     first_one=i+1;
endcase
end
endgenerate

//***************************************************

generate for (k=0;k<8;k=k+1) begin : l3
 assign last_1[k]=datain[7-k];     // last_1[0:7]=datain[7:0];
    end
endgenerate

assign last_2=last_1 & (~ (last_1-1));

//**********************************************
reg [7:0]last_one_1;
generate for (j=0;j<8;j=j+1) begin : lst2
always @(*)
case(1)
last_2[j] :     last_one_1=j;
endcase
end
endgenerate

reg [7:0] last_one8=8'd8;

assign last_one=last_one8-last_one_1;

endmodule
View Code

4. tb 代码

`timescale 1ns/1ps

module fund1_tb();
reg [7:0]data;
wire [3:0]first_one,last_one;
 

initial
begin
 
data=0000_0000;
 
#10 data=1000_0100;
#10
    data=0010_1000;
#10 data=0000_0100;
#10
    data=0110_1100;
#10 data=1010_0101;
#10
    data=0010_1010;
end
fund1 fund1u(  .datain(data),
 .first_one(first_one),.last_one(last_one)
);


endmodule
View Code

5.仿真波形


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM