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; endmodule
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
5.仿真波形

