1、題目要求

輸入32-bit資料,若是2的N次方(如1=20,2=21),輸出1,否則輸出0,復位時輸出高阻態。

2、檢測思路

當且僅當輸入的32bit資料有1bit為1,而其他位均為0時,輸入的data是2的冪次方,所以將輸入的32位資料的每一位相加,若結果為1則是2的冪次方,設計輸出result為1;若結果為1則不是2的冪次方,設計輸出result為0;當復位rstn為0時,輸入result設計為高阻態。

3、檢測程式碼

module detect(

input clk,

input rstn,

input [31:0] data,

output reg result

);

reg result_reg;

reg [5:0] temp;

always @(posedge clk) begin

if(~rstn)

result_reg <= 1‘bX;

else begin

temp = data[31]+data[30]+data[29]+data[28]+data[27]+data[26]+data[25]+

data[24]+data[23]+data[22]+data[21]+data[20]+data[19]+data[18]+

data[17]+data[16]+data[15]+data[14]+data[13]+data[12]+data[11]+

data[10]+data[9]+data[8]+data[7]+data[6]+data[5]+data[4]+

data[3] +data[2]+data[1]+data[0];

if(temp == 6’b000001)

result_reg <= 1‘b1;

else

result_reg <= 1’b0;

end

end

always @(posedge clk) begin

if(~rstn)

result <= 1‘bX;

else begin

result <= result_reg;

end

end

endmodule

4、Test Bench模擬程式碼

`timescale 1ns / 1ns

module detect_tb();

reg clk;

reg rstn;

reg [31:0] data;

wire result;

detect U0(

。clk(clk),

。rstn(rstn),

。data(data),

。result(result)

);

parameter clk_period = 10; //設定時鐘訊號週期(頻率)

parameter clk_half_period=5;//時鐘週期的一半,方便產生時鐘反轉

parameter num = 10000;

initial

begin

clk = 1;

rstn = 0;

data = 0;

#clk_period;

#clk_period;

rstn = 1;

data = 32’b0;

repeat(num)

begin

data = data + 32‘b1;

#clk_period;

end

$stop;

end

always #clk_half_period clk = ~clk;

endmodule

5、Modelsim模擬結果

如下圖,輸入資料data,在下一個時鐘的上升沿輸出判斷結果result,滿足題目要求。

FPGA數字IC筆試題——資料檢測——Quartus與Modelsim模擬

FPGA數字IC筆試題——資料檢測——Quartus與Modelsim模擬

FPGA數字IC筆試題——資料檢測——Quartus與Modelsim模擬