FPGA实验四——时间基准电路和带使能的多周期计数器

来源:互联网 发布:mysql 定位慢查询 编辑:程序博客网 时间:2024/05/17 22:10

1. 设计时钟基准电路和带使能的多周期计数器

本质上是两级计数器级联的电路结构——第一级计数器为时钟基准电路,生成时钟基准信号;第二级为多周期计数器用时钟基准信号作为计数使能进行计数;

实验要求:把后级计数器的计数范围改为 0-15,把计数器的 0-15 计数值经过译码,在DE0的 HEX LED上显示成 0-9-A-F 的十六进制数

  • ① 模块例化(Verilog HDL代码)
    时钟基准电路模块
module cnt_sync(  CLK   ,   // clock  CNTVAL,   // counter value  OV    );  // overflowinput CLK;output [32-1:0] CNTVAL;output OV;parameter MAX_VAL = 25_000_000; //MAX ADD NUMreg [32-1:0] CNTVAL;reg OV;always @ (posedge CLK) begin  if(CNTVAL >= MAX_VAL)    CNTVAL <= 0;  else    CNTVAL <= CNTVAL + 1'b1;endalways @ (CNTVAL) begin  if(CNTVAL == MAX_VAL)    OV = 1'b1;  else    OV = 1'b0;endendmodule   //

0-15周期计数器模块

module cnt_en_0to15(  CLK   ,   // clock  CNTVAL,   // counter value  EN    ,  OV    );  // overflowinput CLK;input EN;output [4-1:0] CNTVAL;output OV;reg [4-1:0] CNTVAL;reg OV;always @ (posedge CLK) begin  if(EN) begin  // work enable    if(CNTVAL >= 15)      CNTVAL <= 0;    else      CNTVAL <= CNTVAL + 1'b1;  end  else    CNTVAL <= CNTVAL ;  // hold same valueendalways @ (CNTVAL) begin  if(CNTVAL == 15)    OV = 1'b1;  else    OV = 1'b0;endendmodule  

4-16译码器模块

module Decode_16(IN,OUT);input [4-1:0]IN;output reg [8-1:0]OUT; //HEX's legs are 8always @(IN) begin    case (IN)        4'b0000: OUT = 16'b11000000;//0        4'b0001: OUT = 16'b11111001;//1        4'b0010: OUT = 16'b10100100;//2        4'b0011: OUT = 16'b10110000;//3        4'b0100: OUT = 16'b10011001;//4        4'b0101: OUT = 16'b10010010;//5        4'b0110: OUT = 16'b10000010;//6        4'b0111: OUT = 16'b11111000;//7        4'b1000: OUT = 16'b10000000;//8        4'b1001: OUT = 16'b10010000;//9        4'b1010: OUT = 16'b10001000;//A        4'b1011: OUT = 16'b10000000;//B        4'b1100: OUT = 16'b11000110;//C        4'b1101: OUT = 16'b11000000;//D        4'b1110: OUT = 16'b10000110;//E        4'b1111: OUT = 16'b10001110;//F        endcaseendendmodule
  • ② BDF原理图

这里写图片描述

  • ③ RTL结构图

这里写图片描述

时钟基准电路结构图

这里写图片描述

计数器结构图

这里写图片描述

4-16译码器结构图

这里写图片描述

  • ④ SignalTap仿真图

这里写图片描述

  • ⑤ 效果展示

这里写图片描述

这里写图片描述

这里写图片描述

2. 设计带清零和暂停的计时秒表

实验要求:修改时钟基准发生器,设计一个使用2个HEX LED,精度为0.1秒,范围为 0-9.9 秒的计时秒表,并且带有清零和暂停的控制功能

  • ① 按键button对应管脚图

这里写图片描述

  • ② 模块例化(Verilog HDL 代码)——在多周期计数器的基础上进行修改

修改时钟基准器代码,将最大值设为250000000,使得精度为0.1s

module cnt_sync(  CLK   ,   // clock  CNTVAL,   // counter value  OV    );  // overflowinput CLK;output [32-1:0] CNTVAL;output OV;parameter MAX_VAL = 250_000_000; //MAX ADD NUM 0.1sreg [32-1:0] CNTVAL;reg OV;always @ (posedge CLK) begin  if(CNTVAL >= MAX_VAL)    CNTVAL <= 0;  else    CNTVAL <= CNTVAL + 1'b1;endalways @ (CNTVAL) begin  if(CNTVAL == MAX_VAL)    OV = 1'b1;  else    OV = 1'b0;endendmodule  

带异步、清零和暂停的十进制计数器

module cnt_en_rst0to9(  RST   ,  PAU   ,  CLK   ,   // clock  CNTVAL,   // counter value  EN    ,  OV    );  // overflowinput CLK;input RST;input PAU;input EN;output [4-1:0] CNTVAL;output OV;reg [4-1:0] CNTVAL;reg OV;reg flag;always @ (posedge CLK) begin  if(!RST) begin   //push rst = 0     CNTVAL <= 0;  end  else if(flag) begin       if(EN) begin  // work enable        if(CNTVAL >= 9)            CNTVAL <= 0;        else            CNTVAL <= CNTVAL + 1'b1;    end    else         CNTVAL <= CNTVAL ;  // hold same value  end  else if (!flag)    CNTVAL <= CNTVAL;endalways @(posedge CLK) begin    if (!PAU)       flag = !flag;endalways @ (CNTVAL) begin  if(CNTVAL == 9)    OV = 1'b1;  else    OV = 1'b0;endendmodule

其中通过按键button触发秒表的清零和暂停

  • ③ BDF原理图

这里写图片描述

  • ④ RTL结构图

这里写图片描述

时钟基准计数器和4-16译码器的RTL结构图同上

秒表计数器结构图

这里写图片描述

  • ⑤ 效果展示

带清零和暂停的9.9秒表

阅读全文
0 0
原创粉丝点击