一、
实验目的:
理解generate 相关语法、for 循环、阻塞赋值(=) 和非阻塞赋值(<=)的区别。 典型时序电路逻辑:状态机、多位十进制计数器。理解规约运算符(|和&)、位拼接运算符({})。 典型时序电路逻辑:计数器。关系运算符(>)位运算符(~)、关系运算符(<)、算术运算符(+)、always 引导时序电路描述方法、异步复位、parameter参数、localparam 局部参数(不可通过参数传递由外部修改)、模块例化及参数传递、异步复位、timescale、仿真延时、Verilog 系统数学 函数($clog2)。
二、实验内容:
建立一个频率计电路,用于测量输入波形的频率。该电路采用直 接测量法实现简单频率测量,间接测量法和等精度测量法等方法读者 可尝试自行设计。
该电路为简单时序电路,包含顶层模块、状态机模块、多位十进 制计数器模块,以及第 2.3 节中介绍的分频模块、第 2.4 节中介绍的 数码管扫描显示模块和第 2.5 节中介绍的计数器模块等。
状态机模块产生系统所需控制信号,主要包括计数清除、计数使 能、计数锁存等。顶层模块在计数使能条件下进行计数生成固定时间 为 1s 的闸门信号,并产生计数溢出信号。计数溢出信号指示闸门信 号结束,状态机据此进行状态跳转,产生计数锁存信号。将闸门信号 区间内对待测输入信号的计数值锁存,并通过数码管显示其高 4 位十 进制数(单位 10KHz)。随后产生计数清除信号,对相关计数器的计 数值进行清楚,准备进行下一次频率测量。
顶层模块包含产生待测信号的逻辑,分别对 27MHz 的输入时钟信 号进行 2、4、6、8 分频并输出到指定引脚。在下载测试时,可分别 将这些引脚与待测信号输入引脚相连,验证频率测量结果是否正确。
三、实验代码:
频率计部分代码:
(1)freq_meter_demo部分代码:
`timescale 1ns/1ns
module freq_meter_demo (
input clk,//时钟信号
input rst_n,//复位信号(负极性)
output [3:0] clk_out_o,//输入时钟信号
input clk_in_i,//4位输出时钟信号
output [3:0] dig_o,//4位数码显示输出信号
output [7:0] seg_o//8位数码管段选输出信号
);
localparam CLK_FREQ_HZ = 27000000;
wire rst =~rst_n; //经过取反操作的复位信号
genvar i;
generate
for(i=0; i<4; i=i+1) begin : FREQ_DIV_GEN
freq_div #(
.DIV_RATE_2N((i+1)*2)
)freq_div_i(
.clk_in_i (clk),
.rst_i (rst),