首页 > 其他分享 >Modelsim仿真实现Verilog HDL频率检测器

Modelsim仿真实现Verilog HDL频率检测器

时间:2024-07-28 13:24:32浏览次数:20  
标签:10 clk signal Modelsim high Verilog rst HDL clear

 检测输入信号的频率,输出8位数码显示,十进制。可以用于八段式数码管显示屏。

1

clk

产生1Hz的方波,这是个很低的频率,被检测的频率都比这个高,因此,1个周期(即1s)内,可以有很多很多个signal的上升沿,只需要统计signal上升沿的数量,就可以算出signal的频率。

在clk第1个上升沿发生后,令程序处于count state;

在clk第2个上升沿发生后,令程序处于latch state;

在clk第3个上升沿发生后,令程序处于clear state;

在clk第4个上升沿发生后,令程序处于count state;

依此类推。

2

signal

产生XHz的方波,例如10Hz,800Hz,200kHz,10MHz

3

rst

复位,高电平有效,上升沿有效,初始1,100ns后变为0,即刚开始时复位100ns,然后正式开始工作。

4

d0~d7

锁存器输出的4位寄存器变量,共8个。d7是最高位。latch state时用于锁存q0~q7。也可以理解为数码管的显示器。

5

q0~q7

wire格式,用于表示频率检测的结果,10进制,q7是最高位,可以表示的范围最小是0,最大是99999999。掐头去尾,常用频段10Hz~10MHz。

主程序: 

module freq_detector(input wire clk, signal, rst, output reg [3:0] d0, d1, d2, d3, d4, d5, d6, d7);
reg count, latch, clear;
reg [1:0] state;
wire [3:0] q0,q1,q2,q3,q4,q5,q6,q7;
counter_10 u0(rst, clear, signal, count, high_out1, q0);
counter_10 u1(rst, clear, signal, high_out1, high_out2, q1);
counter_10 u2(rst, clear, signal, high_out2, high_out3, q2);
counter_10 u3(rst, clear, signal, high_out3, high_out4, q3);
counter_10 u4(rst, clear, signal, high_out4, high_out5, q4);
counter_10 u5(rst, clear, signal, high_out5, high_out6, q5);
counter_10 u6(rst, clear, signal, high_out6, high_out7, q6);
counter_10 u7(rst, clear, signal, high_out7, high_out8, q7);
always@(posedge clk or posedge rst) begin
	if(rst) begin
		state <= 0;
		count <= 0;
		latch <= 0;
		clear <= 0;
	end
	else begin
		case (state)
		0: begin
			state <= 1;
			count <= 1;
			latch <= 0;
			clear <= 0;
		end
		1: begin
			state <= 2;
			count <= 0;
			latch <= 1;
			clear <= 0;
		end
		2: begin
			state <= 0;
			count <= 0;
			latch <= 0;
			clear <= 1;
		end
		default: begin
			state <= 0;
			count <= 0;
			latch <= 0;
			clear <= 0;
		end
		endcase
	end
end
always@(posedge signal or posedge rst) begin
	if(rst | clear) begin
		d0 <= 0;
		d1 <= 0;
		d2 <= 0;
		d3 <= 0;
		d4 <= 0;
		d5 <= 0;
		d6 <= 0;
		d7 <= 0;
	end
	else begin
		if(latch) begin
			d0 <= q0;
			d1 <= q1;
			d2 <= q2;
			d3 <= q3;
			d4 <= q4;
			d5 <= q5;
			d6 <= q6;
			d7 <= q7;
		end
	end
end
endmodule

module counter_10(input wire rst, clear, signal, low_in, output reg high_out, output reg [3:0] low_out);
always@(posedge signal or posedge rst) begin
	if(rst | clear) begin
		high_out <= 0; 
		low_out <= 0;
	end
	else begin
		if(low_in) begin
			if(low_out==9) begin
				high_out <= 1;			
				low_out <= 0;
			end
			else begin
				high_out <= 0;
				low_out <= low_out + 1;
			end
		end
		else begin
			high_out <= 0;
		end
	end
end
endmodule

 测试程序:

`timescale 1us/1ns
module freq_detector_tb();
reg clk, signal, rst;
wire[3:0] d0, d1, d2, d3, d4, d5, d6, d7;
freq_detector u1(clk, signal, rst, d0, d1, d2, d3, d4, d5, d6, d7);
always #500_000 clk <= ~clk;
always #2.5 signal <= ~signal;
initial begin
	clk <= 0;
	signal <= 0;
	rst <= 1;
	#0.1;
	rst <= 0;
	#3_000_000 $stop;
end
endmodule

以200kHz为例,结果如下:

标签:10,clk,signal,Modelsim,high,Verilog,rst,HDL,clear
From: https://blog.csdn.net/m0_69064909/article/details/140737107

相关文章

  • Verilog编程学习之—呼吸灯
    Verilog编程-呼吸灯1.设计目标用FPGA产生占空比变化的PWM波,控制LED灯由暗变亮的变化。2.设计思路设置PWM波的步长为2us,周期为2ms,每个周期内LED亮的时间由0增加至999,再从999减少至0,依次循环,就可以看到LED灯由暗变亮再由亮变暗的循环过程。可以设置一个占空比寄存器duty_r和一个......
  • SpinalHDL之IO口
    本文作为SpinalHDL学习笔记第二十五篇,介绍SpinalHDLIO口相关API。SpinalHDL学习笔记总纲链接如下:SpinalHDL学习笔记_spinalhdlblackbox-CSDN博客 目录:1.可读开漏IO(ReadableOpenDrain)2.三态1.可读开漏IO(ReadableOpenDrain)ReadableOpenDrain线束定义如下:......
  • HDLBits答案(1)_移位寄存器+更多电路
    前言    由于开发板教学内容部分,代码涉及到状态机内容,HDLBits题库只刷到了计数器,因此后续3至4天决定继续刷题,刷完状态机和全部HDLBits题库。今天刷完移位寄存器+更多电路,以下是书写的代码。题库Question1:构建一个4位移位寄存器(右移),具有异步复位、同步加载和使能......
  • Modelsim仿真时报错Error (vlog-7) Failed to open design unit file XXXXX in read m
    根据之前遇到的问题Vivado关联Modelsim仿真时一直卡在Executinganalysisandcompilationstep…的解决我在TclConsole窗口查看出现的Error信息。出现报错:Error:(vlog-7)Failedtoopendesignunitfile“XXXXX”inreadmode查阅网上解决办法VivadoError:(vlog-......
  • Verilog HDL 的简单组合逻辑设计代码学习记录
    1.比较数据a和b,若两个数据相同则输出1,否则输出0(a、b均为单比特)看需求就简单设置输入a,b,输出o。modulecompare(a,b,o);inputa;inputb;outputo;//先来第一种写法,使用?:,这里是默认全是wire类型assigno=(a==b)?1'b1:1'b0;//第二种写法,使用ifelserego;alwa......
  • [米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-03安路TD结合modelsim仿真
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑!1概述FPGA开发中对设计的代码功能......
  • 【Verilog入门】常见的可用于仿真不能综合成硬件的语句及其原因
    在Verilog设计中,不可综合的语句和结构主要是因为它们无法直接映射到实际的硬件实现。以下是详细的解释和每种不可综合语句或结构背后的原因:1.延迟控制语句(#)原因:延迟控制语句用于仿真环境中引入时间延迟,但在实际硬件中没有直接对应的实现。硬件电路的操作是由时钟边沿......
  • HDLBits答案(3)_状态机(2)
      前言    今天刷完状态机的2/3,以下是书写的代码。题库1:Lemmings2:        除了向左和向右走之外,如果下面的地面消失,旅鼠还会摔倒(大概会“啊啊!”)。        除了左右行走和撞到时改变方向外,当地面=0时,旅鼠还会摔倒并说“啊!当地面重新出现(地面=1)......
  • Verilog程序模块最详细的说明-实现流水灯
    文章目录前言一、Verilog注释二、Verilog关键字三、Verilog模块1.Verillog的基本设计单元是**"模块"(block)**2.一个模块是由两部分组成,一部分是描述接口,另一部分描述逻辑功能.3.每个Verilog模块包括4个主要部分:4.举例-流水灯5.功能定义部分有三种方法:6.模块的调用......
  • 最详细的Verilog阻塞,非阻塞赋值语句介绍--数码管控制段选信号代码
    目录前言一、结构语句1、initial语句2、always语句二、赋值语句1.阻塞赋值2.非阻塞赋值3.总结三、条件语句1if_else语句2.case语句前言本文笔者将为大家详细的介绍Verilog的三种语句介绍,包括结构语句,赋值语句和条件语句一、结构语句1、initial语句initi......