MATLAB 與 FPGA無線通信、圖像處理、數字信號處理系列
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,滿足題目要求。