FPGA(verilog)频率计实验——学习历程①

这篇具有很好参考价值的文章主要介绍了FPGA(verilog)频率计实验——学习历程①。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

        本文利用verilog语言完成频率计实验,由于是第一次发文,文章格式以及描述语言请谅解,内容仅供参考,烦请各路大神指正。

二、模块

  1. 数码管动态显示模块
  2. 分频模块
  3. 频率测试模块
  4. 顶层调用模块

三、主要代码

 1、数码管动态显示模块

module seg_led(
    input clk,
    input rst_n,
    input [19:0]         data,//6个数码管最高显示999999,需要20位
    input [5:0]         point,//小数点
    input                 sign,//负号
    input                 en,
    output reg [7:0]    seg_data,//数码管显示的笔画值
    output reg [5:0]     seg_sel
);

wire [3:0] data0;//个位
wire [3:0] data1;//十位
wire [3:0] data2;//百位
wire [3:0] data3;//千位
wire [3:0] data4;//万位
wire [3:0] data5;//十万位

reg [3:0]     clk_cnt;
reg             dri_clk;
reg [23:0]     num;
reg [12:0]    cnt0;
reg             flag;
reg [2:0]     cnt_sel;
reg [3:0]     num_disp;
reg             dot_disp;

parameter CLK_DIVIDE = 4'd10;
parameter MCNT = 13'd5_000;

assign data0 = data%4'd10;//每个数码管取模运算
assign data1 = data/4'd10%4'd10;
assign data2 = data/7'd100%4'd10;
assign data3 = data/10'd1000%4'd10;
assign data4 = data/14'd10000%4'd10;
assign data5 = data/17'd100000;

always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        clk_cnt <= 4'b0;
        dri_clk <= 1'b1;
    end
    else if(clk_cnt == CLK_DIVIDE/2-1'b1)begin
        clk_cnt <= 4'b0;
        dri_clk <= ~dri_clk;
    end
    else begin
        clk_cnt <= clk_cnt + 1'b1;
        dri_clk <= dri_clk;
    end
end

always@(posedge dri_clk or negedge rst_n)begin
    if(!rst_n)
        num <= 24'd0;
    else begin
            if(data5||point[5])begin
                num[23:20]<=data5;
                num[19:16]<=data4;
                num[15:12]<=data3;
                num[11:8]<=data2;
                num[7:4]<=data1;
                num[3:0]<=data0;
        end
        else begin
                if(data4||point[4])begin
                    num[19:0]<={data4,data3,data2,data1,data0};
                if(sign)
                    num[23:20]<=4'd11;
                else
                    num[23:20]<=4'd10;
            end
            else begin
                    if(data3||point[3])begin
                        num[15:0]<={data3,data2,data1,data0};
                        num[23:20]<=4'd10;
                    if(sign)
                        num[19:16]<=4'd11;
                    else
                        num[19:16]<=4'd10;
                end    
                else begin
                        if(data2||point[2])begin
                            num[11:0]<={data2,data1,data0};
                            num[23:16]<={2{4'd10}};
                        if(sign)
                            num[15:12]<=4'd11;
                        else
                            num[15:12]<=4'd10;
                    end
                    else begin
                            if(data1||point[1])begin
                                num[7:0]<={data1,data0};
                                num[23:12]<={3{4'd10}};
                            if(sign)
                                num[11:8]<=4'd11;
                            else
                                num[11:8]<=4'd10;
                        end
                        else begin
                                num[3:0]<={data2,data1,data0};
                                num[23:8]<={4{4'd10}};
                            if(sign)
                                num[7:4]<=4'd11;
                            else
                                num[7:4]<=4'd10;
                        end
                    end
                end
            end
        end
    end
end

always@(posedge dri_clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt0 <= 13'b0;
        flag <= 1'b0;
    end
    else if(cnt0 == MCNT - 1)begin
        cnt0  <= 13'b0;
        flag <= 1'b1;
    end
    else begin
        cnt0  <= cnt0 + 13'b1;
        flag <= 1'b0;
    end    
end

always@(posedge dri_clk or negedge rst_n)begin
    if(!rst_n)
        cnt_sel <= 3'b0;
    else if(flag)
    begin
        if(cnt_sel < 3'd5)
            cnt_sel <= cnt_sel + 1'b1;
        else
            cnt_sel <= 3'b0;
    end
    else
        cnt_sel <= cnt_sel;
end

always@(posedge dri_clk or negedge rst_n)
begin
    if(!rst_n)
        begin
            seg_sel <= 6'b11_1111;
            num_disp <= 4'b0;
            dot_disp <= 1'b0;
        end
    else 
        begin
            if (en)
                begin
                    case(cnt_sel)
                        3'd0 :begin
                        seg_sel <= 6'b11_1110;
                        num_disp <= num[3:0];
                        dot_disp <= ~point[0];
                        end
                        3'd1 :begin
                        seg_sel <= 6'b11_1101;
                        num_disp <= num[7:4];
                        dot_disp <= ~point[1];
                        end
                        3'd2 :begin
                        seg_sel <= 6'b11_1011;
                        num_disp <= num[11:8];
                        dot_disp <= ~point[2];
                        end
                        3'd3 :begin
                        seg_sel <= 6'b11_0111;
                        num_disp <= num[15:12];
                        dot_disp <= ~point[3];
                        end
                        3'd4 :begin
                        seg_sel <= 6'b10_1111;
                        num_disp <= num[19:16];
                        dot_disp <= ~point[4];
                        end
                        3'd5 :begin
                        seg_sel <= 6'b01_1111;
                        num_disp <= num[23:20];
                        dot_disp <= ~point[5];
                        end
                        default :begin
                        seg_sel <= 6'b11_1111;
                        num_disp <= 4'b0;
                        dot_disp <= 1'b1;
                        end
                    endcase
                end
            else begin
                seg_sel <= 6'b11_1111;
                num_disp <= 4'b0;
                dot_disp <= 1'b1;
            end
        end
end

always@(posedge dri_clk or negedge rst_n)
begin
    if(!rst_n)
        seg_data <= 8'hc0;
    else 
        begin
            case(num_disp)
                4'd0 : seg_data <= {dot_disp,7'b100_0000};
                4'd1 : seg_data <= {dot_disp,7'b111_1001};
                4'd2 : seg_data <= {dot_disp,7'b010_0100};
                4'd3 : seg_data <= {dot_disp,7'b011_0000};
                4'd4 : seg_data <= {dot_disp,7'b001_1001};
                4'd5 : seg_data <= {dot_disp,7'b001_0010};
                4'd6 : seg_data <= {dot_disp,7'b000_0010};
                4'd7 : seg_data <= {dot_disp,7'b111_1000};
                4'd8 : seg_data <= {dot_disp,7'b000_0000};
                4'd9 : seg_data <= {dot_disp,7'b001_0000};
                4'd10 : seg_data <= {8'b1111_1111};
                4'd11 : seg_data <= {8'b1011_1111};
            default:
                seg_data<={dot_disp,7'b100_0000};
            endcase
        end
end
    
endmodule

 2、频率测试模块

module cymometer(    
    input clk,
    input rst_n,
    input clk_fx,
    output reg [31:0]    fre
);
 
parameter TIME_SYS = 20;
parameter TIME_GATE = 500_000_000;
localparam N = TIME_GATE /    TIME_SYS;
reg gate;
reg [31:0] cnt_gate;
reg [31:0] cnt_fx;
 
wire gate_n;
 
assign gate_n = ~gate;
always @(posedge clk or negedge rst_n)begin    
    if(!rst_n)begin
        cnt_gate <=0;
        gate <=0;
    end    
    else begin
        if(cnt_gate == N-1)begin
            cnt_gate <= 0;
            gate <= ~gate;
        end    
        else
        cnt_gate<=cnt_gate+1;
    end
end 
always @(posedge clk_fx or negedge rst_n)begin    
    if(!rst_n)
        cnt_fx <= 0;
    else if(gate)
        cnt_fx <= cnt_fx + 1;
    else
        cnt_fx <= 0;
end
 
always @(posedge gate_n or negedge rst_n)begin    
    if(!rst_n)
        fre <= 0;
    else 
        fre <= 1000_000_000/TIME_GATE * cnt_fx;    
end
    
endmodule

 3、分频模块

module test_div(
    input clk,      
    input rst_n,       
    output reg div_clk
);

reg [9:0]clk_cnt; 
parameter CLK_DIVIDE = 7'd100; 

always @(posedge clk or negedge rst_n)begin
    if(!rst_n) begin
      clk_cnt <= 10'd0;
      div_clk <= 1'b0;
   end
   else if(clk_cnt == CLK_DIVIDE/2 - 1'd1)begin
      clk_cnt <= 10'd0;
      div_clk <= ~div_clk;
   end
   else begin
        clk_cnt <= clk_cnt + 1'b1;
        div_clk <= div_clk;
   end
end

endmodule

四、总结

        通过以上代码,最后完成顶层调用模块,再分配引脚,即可完成实验。

        分频模块对系统时钟进行100分频(500KHZ)输入给频率测量模块,通过周期测量法在数码管中显示5000000。(自己产生频率自己测量)

五、图片

 verilog 测量数字信号发生器输出的频率,fpga开发

 verilog 测量数字信号发生器输出的频率,fpga开发verilog 测量数字信号发生器输出的频率,fpga开发

        由于本人初学fgpa有很多困难并未解决,代码虽然可以运行但可能并不是最优,本文仅用于记录自己的学习历程以及实验总结,烦请各位指正以及交流,欢迎各位私信交流。文章来源地址https://www.toymoban.com/news/detail-735844.html

到了这里,关于FPGA(verilog)频率计实验——学习历程①的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 等精度频率计verilog,quartus仿真视频,原理图,代码

    名称:等精度频率计设计verilog quartus仿真 软件:Quartus 语言:Verilog 要求: A:测量范围信号:方波     频率:100Hz~1MHz; B:测试误差:0.1%(全量程) C:时钟频率:50kHz D:预闸门时间:01s E:系统时钟频率:50MHz F:频率计算:保留1位小数 本代码下载:等精度频率计设计verilog,quartus仿真

    2024年02月07日
    浏览(68)
  • 基于FPGA的数字频率计的设计与实现

    基于FPGA的数字频率计的设计与实现 数字频率计是一种重要的电子测试仪器,它可以用来测量信号的频率和周期等参数,被广泛应用于科学研究、工程设计及生产制造等领域。本文将介绍一种基于FPGA的数字频率计的设计与实现方法,并给出相应的源代码。 一、设计原理 数字

    2024年01月23日
    浏览(49)
  • 数字频率计Verilog代码Quartus DE1-SoC开发板

    名称:数字频率计Verilog代码Quartus  DE1-SoC开发板(文末获取) 软件:Quartus 语言:Verilog 代码功能: 数字频率计    采用一个标准的基准时钟,在1s里对被测信号的脉冲数进行计数,即为信号频率利用等精度测量法可以测量1hz至99999999Hz信号频率 七段码管显示测量值 本代码已在

    2024年02月03日
    浏览(45)
  • 孩子都能学会的FPGA:第二十五课——用FPGA实现频率计

    (原创声明:该文是 作者的原创 ,面向对象是 FPGA入门者 ,后续会有进阶的高级教程。宗旨是 让每个想做FPGA的人轻松入门 , 作者不光让大家知其然,还要让大家知其所以然 !每个工程作者都搭建了全自动化的仿真环境,只需要双击 top_tb.bat 文件就可以完成整个的仿真(前

    2024年02月02日
    浏览(44)
  • 数字频率计

      电子技术应用实习 目录 1  实习目的、内容和要求 1 1.1 实习目的 1 1.2 实习内容 1 1.3 实习要求 1         1.3.1设计要求..................................................................................................................1 1.3.2实习任务要求 2 2  设计原理及软件简介 3 2.1设计原理 3 2.2M

    2023年04月18日
    浏览(37)
  • VHDL实现数字频率计的设计

    当设计文件加载到目标器件后,拨动开关的K1,使其置为高电平,从输入输出观测模块的输入端输入一个频率大于1Hz的时钟信号,这时在数码管上显示这个时钟信号的频率值。如果使拨动开关置为低电平,数码管上显示的值为系统上的数字信号源的时钟频率。改变数字信号源

    2024年02月02日
    浏览(59)
  • 基于51单片机的频率计

    前言:设计一个能产生固定频率的电路,然后经过单片机处理后显示该固定频率的系统。 1、指标以及功能要求 指标:该系统要能够产生一个31KHz的方波,进过单片机脉冲采集后能够在液晶上显示出该频率。要求:所用的知识要涉及到模拟电路知识和数字电路知识。 2、设计分

    2024年02月09日
    浏览(48)
  • 【单片机】STM32单片机频率计程序,外部脉冲计数程序,基于脉冲计数的频率计程序,STM32F103

    两种方法用于在单片机中实现频率计的功能。 第一种方法是通过定时器来衡量信号的周期,然后将周期转换为频率。在这种方法中,你可以使用单片机的定时器模块来测量输入信号的周期,定时器会产生一个计数值,你可以根据这个计数值来推算出输入信号的周期,并通过简

    2024年02月11日
    浏览(48)
  • 基于51单片机数字频率计的设计与实现

    目录 第一章 系统原理与总体设计 1.1系统组成 1.2系统原理 1.3测量原理 1.4频率测量与总体设计 第二章 硬件电路设计 2.1硬件电路框图 2.2数字频率计原理图 2.3硬件电路设计 第三章 软件程序设计 3.1程序流程图 3.2显示电路程序设计 3.3 定时器初始化程序设计 3.4中断控制程序设计

    2024年02月08日
    浏览(45)
  • 36、基于51单片机频率计 LCD 1602显示系统设计

    数字频率计是一种基本的测量仪器。它被广泛应用于航天、电子、测控等领域,还被应用在计算机及各种数学仪表中。一般采用的是十进制数字,显示被测信号频率。基本功能是测量正弦信号,方波信号以及其他各种单位时间内变坏的物理量。由于其使用十进制数显示,测量

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包