1.题目 输入 数据 data=1100_1010 输出first_one = 0010 last=1000 ,
思路,计算first_one ,先将1100_1010 变成0000_0010 这就是优先仲裁器的设计思路,然后输出该bit的位置就可,
对于last_one ,将datain 高低位转换一下,再同样的用之前思路就可。
2.分析,此题用组合逻辑设计,对电路的理解,有很大的作用,小编犯的错误有
- 用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; endmoduleView 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) ); endmoduleView Code
5.仿真波形