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 / 1psmodule 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;endelse begincount<=count+27'b1;flag <=1;endend//个位计数器always@(posedge square or negedge flag)beginif(!flag)s1_data<=4'b0000;else beginif(s1_data==4'b1001)begins1_data<=4'b0000;flag1<=1;endelse begins1_data <= s1_data+4'b1;flag1<=0;endendend//十位计数器always@(posedge flag1 or negedge flag)beginif(!flag)s2_data<=4'b0000;else beginif(s2_data==4'b1001)begins2_data<=4'b0000;flag2<=1;endelse begins2_data <= s2_data+4'b1;flag2<=0;endendend//百位计数器always @ (posedge flag2 or negedge flag)beginif(!flag)s3_data<=4'b0000;else beginif(s3_data==4'b1001)begins3_data<=4'b0000;flag3<=1;endelse begins3_data <= s3_data+4'b1;flag3<=0;endendend//千位计数器always @ (posedge flag3 or negedge flag)beginif(!flag)s4_data<=4'b0000;else beginif(s4_data==4'b1001)s4_data<=4'b0000;else s4_data <= s4_data+4'b1;endendreg [3:0] data; //各位数据reg [18:0] times; initial times = 0; initial s = 4'b0001; //初始化位选//一秒钟将所存的频率送给数码管always @ (negedge flag)beginlockdata1<=s1_data;lockdata2<=s2_data;lockdata3<=s3_data;lockdata4<=s4_data;end//4位数码动态扫描 低电平有效always @ (posedge clk)begintimes <= times + 19'b1;case (times)19'd000000: begin s <= 4'b1110; data <= lockdata1; end19'd100000: begin s <= 4'b1101; data <= lockdata2; end19'd200000: begin s <= 4'b1011; data <= lockdata3; end19'd300000: begin s <= 4'b0111; data <= lockdata4; endendcaseif(times == 400000)times <= 19'b0;end//7段数码管翻译always @ (posedge clk)begincase(data)4'b0000: seg = 7'b1000000; //04'b0001: seg = 7'b1111001; //14'b0010: seg = 7'b0100100; //24'b0011: seg = 7'b0110000; //34'b0100: seg = 7'b0011001; //44'b0101: seg = 7'b0010010; //54'b0110: seg = 7'b0000010; //64'b0111: seg = 7'b1111000; //74'b1000: seg = 7'b0000000; //84'b1001: seg = 7'b0010000; //94'b1010: seg = 7'b0001000; //A4'b1011: seg = 7'b0000011; //b4'b1100: seg = 7'b1000110; //C4'b1101: seg = 7'b0100001; //d4'b1110: seg = 7'b0000110; //E4'b1111: seg = 7'b0001110; //Fendcaseend
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]}]
实现效果
动图

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
