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. 直接上全部代码

verilog 用组合逻辑记录一串数据的初始1 与最终1的位置_附代码仿真波形
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 代码

verilog 用组合逻辑记录一串数据的初始1 与最终1的位置_附代码仿真波形
`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.仿真波形

verilog 用组合逻辑记录一串数据的初始1 与最终1的位置_附代码仿真波形

 

上一篇:9.8 随心复习,关键是早点睡,好好休息


下一篇:FPGA的设计艺术(12)使用parameter构建可重用的逻辑设计