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,满足题目要求。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

你可能感兴趣的:(Verilog,FPGA,Modelsim)