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,滿足題目要求。