Verilog HDL实现0Hz-9999Hz方波频率计

IP编程实现频率计

 频率计IP编程实现后,鄙人一直想着用Verilog HDL编程实现频率计,奈何HDL入门不易,学了3天才懵懵懂懂地编出频率计,以下是我能想到频率计最简单的实现代码,动态数码管显示的参考了一些资料,仅用一个module实现0Hz-9999Hz方波频率计,具体细节方面有待改进和优化。
编程思路与IP编程类似,具体方法请看注释。

//  声明
//  Created by Livion on 2020/9/8.
//  Copyright © 2020 Livion. All rights reserved.

Verilog HDL实现

`timescale 1ns / 1ps


module bcd_2_7seg(
        input square, //输入的方波 
        input wire clk, //FPGA晶振
        output reg [6:0] seg, //7段数码管
        output reg [3:0] s //位选
        );
    reg [3:0] s1_data; //个位	
    reg [3:0] s2_data; //十位
    reg [3:0] s3_data; //百位
    reg [3:0] s4_data; //千位

    //4个寄存器保留频率数
    reg [3:0] lockdata1; //个位
    reg [3:0] lockdata2; //十位
    reg [3:0] lockdata3; //百位
    reg [3:0] lockdata4; //千位
    
    
    reg [26:0] count;  //分频器需要的寄存器,100MHZ共27位宽
    reg flag;			//1Hz 
    reg flag1;			//个位进十位
    reg flag2;			//十位进百位
    reg flag3;			//百位进千位
    
	//分频函数,将100MHz晶振分频为1Hz,以flag为标志位
    always @(posedge clk)begin 
    if(count == 27'd99999999)begin //1秒钟100M次
    flag <= 0;
    count<=27'b0;
    end
    else begin
    count<=count+27'b1;
    flag <=1;
    end
    end
    
	//个位计数器
    always@(posedge square or negedge flag)begin
    if(!flag)
    s1_data<=4'b0000;
    else begin
    if(s1_data==4'b1001)begin
    s1_data<=4'b0000;
    flag1<=1;
    end
    else begin
    s1_data <= s1_data+4'b1;
    flag1<=0;
    end
    end
    end
    
	//十位计数器
    always@(posedge flag1 or negedge flag)begin
    if(!flag)
    s2_data<=4'b0000;
    else begin
    if(s2_data==4'b1001)begin
    s2_data<=4'b0000;
    flag2<=1;
    end
    else begin
    s2_data <= s2_data+4'b1;
    flag2<=0;
    end
    end
    end
    
	//百位计数器
    always @ (posedge flag2 or negedge flag)begin
    if(!flag)
    s3_data<=4'b0000;
    else begin
    if(s3_data==4'b1001)begin
    s3_data<=4'b0000;
    flag3<=1;
    end
    else begin
    s3_data <= s3_data+4'b1;
    flag3<=0;
    end
    end
    end
    
	//千位计数器
    always @ (posedge flag3 or negedge flag)begin
    if(!flag)
    s4_data<=4'b0000;
    else begin
    if(s4_data==4'b1001)
    s4_data<=4'b0000;
    else 
    s4_data <= s4_data+4'b1;
    end
    end
    
    reg [3:0] data; //各位数据
    reg [18:0] times; 
    
    initial times = 0;   
    initial s = 4'b0001; //初始化位选
    
	//一秒钟将所存的频率送给数码管
    always @ (negedge flag)begin
    lockdata1<=s1_data;
    lockdata2<=s2_data;
    lockdata3<=s3_data;
    lockdata4<=s4_data;
    end
    
	//4位数码动态扫描 低电平有效
    always @ (posedge clk)
        begin
        times <= times + 19'b1;
        case (times)
            19'd000000: begin s <= 4'b1110; data <= lockdata1; end
            19'd100000: begin s <= 4'b1101; data <= lockdata2; end
            19'd200000: begin s <= 4'b1011; data <= lockdata3; end
            19'd300000: begin s <= 4'b0111; data <= lockdata4; end
        endcase
        if(times == 400000)
            times <= 19'b0;
        end
    
	//7段数码管翻译
    always @ (posedge clk)
    begin
        case(data)
            4'b0000: seg = 7'b1000000;    //0
            4'b0001: seg = 7'b1111001;    //1
            4'b0010: seg = 7'b0100100;    //2
            4'b0011: seg = 7'b0110000;    //3
            4'b0100: seg = 7'b0011001;    //4
            4'b0101: seg = 7'b0010010;    //5
            4'b0110: seg = 7'b0000010;    //6
            4'b0111: seg = 7'b1111000;    //7
            4'b1000: seg = 7'b0000000;    //8
            4'b1001: seg = 7'b0010000;    //9
            4'b1010: seg = 7'b0001000;    //A
            4'b1011: seg = 7'b0000011;    //b
            4'b1100: seg = 7'b1000110;    //C
            4'b1101: seg = 7'b0100001;    //d
            4'b1110: seg = 7'b0000110;    //E
            4'b1111: seg = 7'b0001110;    //F
        endcase
    end
endmodule

Basys3约束文件如下:

set_property IOSTANDARD LVCMOS33 [get_ports clk]
#set_property IOSTANDARD LVCMOS33 [get_ports oneHz]
set_property IOSTANDARD LVCMOS33 [get_ports square]
set_property IOSTANDARD LVCMOS33 [get_ports {s[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {s[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {s[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {s[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[0]}]
set_property PACKAGE_PIN U2 [get_ports {s[0]}]
set_property PACKAGE_PIN U4 [get_ports {s[1]}]
set_property PACKAGE_PIN V4 [get_ports {s[2]}]
set_property PACKAGE_PIN W4 [get_ports {s[3]}]
set_property PACKAGE_PIN W7 [get_ports {seg[0]}]
set_property PACKAGE_PIN W6 [get_ports {seg[1]}]
set_property PACKAGE_PIN W5 [get_ports clk]
set_property PACKAGE_PIN A16 [get_ports square]
#set_property PACKAGE_PIN B15 [get_ports oneHz]
set_property PACKAGE_PIN U8 [get_ports {seg[2]}]
set_property PACKAGE_PIN V8 [get_ports {seg[3]}]
set_property PACKAGE_PIN U5 [get_ports {seg[4]}]
set_property PACKAGE_PIN V5 [get_ports {seg[5]}]
set_property PACKAGE_PIN U7 [get_ports {seg[6]}]

实现效果

8524Hz标准方波

动图
海底捞

  • 9
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值