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