Verilog筆記——數據檢測——Quartus與Modelsim仿真

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,滿足題目要求。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章