数字频率计的基本设计思路是在给定一个time开始测量的时候产生的T的个数,也就是采用一个标准的基准时钟,在单位时间(1秒)里对被测信号的脉冲数进行计数。测频法包括直接测频法、等精度频率测量法、周期法等。

数字频率计的原理如图6-1所示。对系统时钟的信号分频后产生1Hz的输出频率被作为控制模块的时钟输入,由控制模块产生的计数使能信号和清零信号对计数模块进行控制,而由其产生的锁存信号load对锁存模块进行控制,一旦计数使能信号为高电平,并且时钟上升沿到来,计数器便开始正常计数,清零信号到来则计数清零,而当锁存信号为高电平时,数据便被锁存器锁存,然后将锁存的数据输出到显示模块显示出来,数据锁存保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在数码显示管上可以显示的十进制结果。

(1)分频器模块

分频器模块将对系统时钟进行分频,输出1Hz赫兹的信号,作为测频控制模块的输入信号。例如,假设系统时钟为1024Hz,则对其进行2的10次方分频即可得到1Hz的分频输出信号。

(2)测频控制模块

测频控制模块的输出包括计数器的使能端,清零端以及数据锁存器的锁存信号。分别控制计数器的计数和清零。当锁存信号为高电平时,计数器的计数结果被锁存并输出到显示模块显示。

 View Code

   该模块的仿真结果可参考图6-2。

(3)计数器模块

计数器是完成计数步骤的一个单元。它也可用与分频、定时、产生节拍脉冲和脉冲序列等。本设计中为了可以使计数器正常工作,必须只有当使能端为1的时候才开始计数,每个时钟的上升沿到来时计数器加1,当累加到10的时候就清零,同时产生进位信号,同时计数器也应带有清零信号,一旦清零信号有效时,计数器立即清零。

(4)锁存器模块

锁存,就是把信号暂存以维持某种电平状态。测量模块的工作任务成功后,在load信号的上升沿到来时把测量值存入reg当中,之后发送到显示模块当中。锁存器主要是为了保护数据,使其在下次触发或者复位时仍然有效。

(5)显示模块

LED显示器在许多的数字系统中作为显示输出设备,使用非常广泛。它内部有七个发光的a、b、d、e、f和g二极管。通过点亮不同的LED字段,可显示数字0,1,┅,9和A,b,C,d,E,F等不同的字符及自定义一些段发光代表简单符号。

(6)顶层模块

       按照图一所示的数字频率计的框图,调用各单元模块,完成数字频率计的顶层设计,并进行仿真,实现频率测量。

练习

(1)分频器模块

1 module fre_div (clk, clk_out);
2 input clk;
3 output clk_out;
4 reg [8:0] counter;
5 reg clk_out;
6 parameter N = 1000; //改变N的值变成任意偶分频,同时counter的范围需要相应修改
7
8 always @ (posedge clk)
9 begin
10 if (counter == N/2 - 1) //偶分频数一半时反相
11 begin
12 clk_out <= ~clk_out;
13 counter <= 0; //置0,从0计数
14 end
15 else
16 counter <= counter + 1;
17 end
18 endmodule

(2)测频控制模块1 module testctl (clk_out_ctl, tsten, rst_ctl, load);
2 input clk_out_ctl;
3 output tsten, rst_ctl, load;
4 reg rst_ctl, div2;
5 always @(posedge clk_out_ctl) begin
6 div2 = ~div2;
7 end
8 always @(clk_out_ctl or div2) begin
9 if (clk_out_ctl == 0 && div2 == 0) begin
10 rst_ctl = 1;
11 end
12 else
13 begin
14 rst_ctl = 0;
15 end
16 end
17 assign load = ~div2;
18 assign tsten = div2;
19 endmodule

(3)计数器模块(改正在注释里

1 module counter (enable,clk_t,rst_count,dout,cout);
2 input enable,clk_t,rst_count;
3 output [15:0] dout;
4 output cout;
5 reg cout;
6 reg [15:0] dout;
7 always @(posedge clk_t) begin//有问题,always @(posedge clk_t or posedge rst_count) //异步复位
8 if (!rst_count) begin// if (rst_count) begin dout = 16'd0; cout = 1'b0; end //先写复位,首先考虑复位信号
9 if (enable) begin// else begin
10 if(dout == 65535) begin // if (enable) begin
11 dout = 16'd0; // if(dout == 65535) begin dout = 16'd0; cout = 1'b1; end
12 cout = 1'b1; // else dout = dout + 16'd1;
13 end // end
14 else begin // end
15 dout = dout + 16'd1;
16 end
17 end
18 end
19 else begin
20 dout = 16'd0;
21 cout = 1'b0;
22 end
23 end
24 endmodule
25
26
27

(4)锁存器模块

 1 module latch_out (in_dout, save_dout, load_in);2     input load_in;3     input [15:0] in_dout;4     output [15:0] save_dout;5     reg [15:0] reg_in;6     wire [15:0] save_dout;7     always @(load_in)8     if (load_in)    9     reg_in = in_dout;
10     assign save_dout = reg_in;
11 endmodule

(5)显示模块

  【1】二进制转BCD码模块(参考)

 1 module bin_bcd_cp (bin, wan, qian, bai, shi, ge, bcd); 2     input [15:0] bin;3     output [31:0] bcd;4     output reg [3:0] wan;5     output reg [3:0] qian;6     output reg [3:0] bai;7     output reg [3:0] shi;8     output reg [3:0] ge;9     integer i;
10     always @(bin) begin
11         wan = 4'd0;
12         qian = 4'd0;
13         bai = 4'd0;
14         shi = 4'd0;
15         ge = 4'd0;
16         for (i = 15; i >= 0; i = i - 1) begin
17             if (wan > 4) wan = wan + 3;
18             if (qian > 4) qian = qian + 3;
19             if (bai > 4) bai = bai + 3;
20             if (shi > 4) shi = shi + 3;
21             if (ge > 4) ge = ge + 3;
22
23             wan = wan << 1;
24             wan[0] = qian[3];
25             qian = qian << 1;
26             qian[0] = bai[3];
27             bai = bai << 1;
28             bai[0] = shi[3];
29             shi = shi << 1;
30             shi[0] = ge[3];
31             ge = ge << 1;
32             ge[0] = bin[i];
33         end
34     end
35     assign bcd = {{12{1'b0}}, wan, qian, bai, shi, ge};
36 endmodule

  【2】八段显示数码管

module seg7 (data_in, data_out );input [3:0] data_in ;output [7:0] data_out ;reg [7:0] data_out ;always @(data_in) begindata_out = 7'b1111111;case (data_in )4'b0000: data_out = 8'b1100_0000; // 04'b0001: data_out = 8'b1111_1001; // 14'b0010: data_out = 8'b1010_0100; // 24'b0011: data_out = 8'b1011_0000; // 34'b0100: data_out = 8'b1001_1001; // 44'b0101: data_out = 8'b1001_0010; // 54'b0110: data_out = 8'b1000_0011; // 64'b0111: data_out = 8'b1111_1000; // 74'b1000: data_out = 8'b1000_0000; // 84'b1001: data_out = 8'b1001_1000; // 94'b1010: data_out = 8'b1000_1000; // A4'b1011: data_out = 8'b1000_0011; // b4'b1100: data_out = 8'b1010_0111; // c4'b1101: data_out = 8'b1010_0001; // d4'b1110: data_out = 8'b1000_0110; // E4'b1111: data_out = 8'b1000_1110; // Fdefault: data_out = 8'b1111_1111;endcaseend
endmodule

(6)顶层模块

把各个模块生成symbol,通过创建 block diagram/schematic file 手动连线生成。

RTL:

仿真波形:

注:各个小模块的仿真测试都要一个一个做(在此我省略了)

Verilog频率计设计相关推荐

  1. 移位寄存器专题(verilog HDL设计)

    目录 移位寄存器简介 分类 4位右移位寄存器工作原理 1. 16位右移位寄存器 2. 16位左移寄存器 3. 串行输入并行输出寄存器 4. 并行输入串行输出移位寄存器 移位寄存器简介 移位寄存器内的数 ...

  2. 为什么在 Verilog HDL 设计中一定要用同步而不能用异步时序逻辑?

    本博文内容来源于:<从算法设计到硬件逻辑的实现>,仅供学习交流使用! 同步时序逻辑是指表示状态的寄存器组的值只可能在唯一确定的触发条件发生时刻改变.只能由时钟的正跳沿或负跳沿触发的状态机就 ...

  3. FIR滤波器设计(包括Verilog HDL设计以及MATLAB设计)

    FIR滤波器设计 滤波器原理:滤波器就是对特定的频率或者特定频率以外的频率进行消除的电路,被广泛用于通信系统和信号处理系统中.从功能角度,数字滤波器对输入离散信号的数字代码进行运算处理,以达到滤除频带 ...

  4. 巴克码相关器的verilog HDL设计

    巴克码相关器 巴克码相关器原理:巴克码相关器能够检测巴克码序列峰值,并且能够在1bits错误情况下检测巴克码序列峰值. 巴克码是20世纪50年代初R.H巴克提出的一种具有特殊规律的二进制码组.它是一个 ...

  5. 序列信号产生器的verilog HDL 设计

    一.状态转移型的序列信号产生器的verilog HDL 设计 用一个不断循环的状态机,循环产生序列信号001011.过程过于简单,我就不画状态图了. 直接给出verilog HDL设计代码: //有限 ...

  6. 8位16进制频率计设计实验--VHDL

    一.实验目的 (1)学习并掌握Quartus II的使用方法 (2)学习简单时序电路的设计和硬件测试. (3)学习使用VHDL 语言方法进行逻辑设计输入 (4)学习设计8位16进制频率计,学习较复杂的 ...

  7. (19)System Verilog模块设计示例

    (19)System Verilog模块设计示例 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog模块设计示例 5)结语 1.2 FPG ...

  8. 数字电路之Verilog红绿灯设计

    数字电路之Verilog红绿灯设计 一.题目要求 二.分析题目 三.开始设计 四.结果分析 五.最后的话 写在前面:以下仿真实验设计应用的是Xilinx Vivado. 一.题目要求 题目要求应用Ve ...

  9. Verilog HDL设计方法

    Verilog HDL设计方法 一.采用Verilog HDL设计复杂数字电路的优点 1.1.传统设计方法--电路原理图输入法 1.2.Verilog HDL的标准化与软核的重用 1.3.软核.固核和 ...

最新文章

  1. hive内部表与外部表区别
  2. 使用Memcached提高.NET应用程序的性能
  3. SQL Server 性能调优(cpu)
  4. python中print是什么意思_python中print什么意思
  5. 约束最优化方法 (一) 最优性条件
  6. udp push java ddpush_DDPush首页、文档和下载 - 任意门推送 - OSCHINA - 中文开源技术交流社区...
  7. si4438+efm32g210f128
  8. .NET Core(.NET 6)控制台应用程序与MongoDB Atlas入门示例教程详解
  9. 四川音乐学院计算机音乐创作,川音电子音乐系教师作品、论文入选2019国际计算机年会(ICMC)...
  10. Bilibili 2000W用户信息爬取
  11. oracle ORA-12543
  12. 2022-06-25 网工进阶(十一)IS-IS-三大表(邻居表、路由表、链路状态数据库表)、LSP、CSNP、PSNP、LSP的同步过程
  13. Django项目实践(商城):十五、商品列表页面
  14. c++ 编译 curl 报错 数组‘__curl_rule_01__’的大小为负 解决方法
  15. 爬取QQ音乐(周杰伦)
  16. dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算(终结版)
  17. sql语句插入一条记录同时获取刚插入的id
  18. oracle中in与exists,Oracle中in和exists的区别
  19. tio-http-server 源码浅析(二)Http请求的处理HttpRequestHandler
  20. php导出xlsx格式excel

热门文章

  1. HDU5128 The E-pang Palace
  2. 阿里巴巴DevOps实践手册 附下载链接
  3. 现在Php、Java、Python横行霸道的市场,C++程序员们都在干什么呢?
  4. 第十四课:树莓派网络视频监控(mjpg-streamer)
  5. 使用计算机辐射最大,流言终结者:我们身边的辐射有多大?
  6. 华为机试:节点队列的转发问题
  7. 高端光刻机为什么那么难制造?
  8. 计算机组成原理乘法器实验报告,Booth乘法器实验报告
  9. Tensorflow下利用Deeplabv3+训练自己的数据(超详细完整版)
  10. 子域名查询、DNS记录查询