QuartusII:8位16进制频率计设计实验-Verilog(附verilog源码工程)

一、设计题目

                              8位16进制频率计设计

二、设计要求

(1)选择实验电路模式5

(2)设计仿真文件,进行软件验证

(3)用Verilog程序设计方法实现8位16进制频率计设计

(4)通过下载线下载到实验系统上进行硬件测试验证

 三、分析过程  

频率测量原理及 8 位 16 进制频率计各子模块功能分解:

测定信号的频率必须有一个脉宽为 1 秒的输入信号脉冲计数允许的信号;1 秒计数结束后,计数值被锁入锁存器,计数器清0,为下一测频计数周期作好准备。测频控制信号可以由一个独立的发生 器来产生,即图 2-1 中的 FTCTRL1。测频控制模块可以如图 2—1(a)所示。设计要求是:FTCTRL1的计数使能信号 CNT_EN 能产生一个 1 秒脉宽的周期信号,并对频率计中的 32 位二进制计数器 COUNTER32B1(图 2—1 b)的 ENABL 使能端进行同步控制。当 CNT_EN 高电平时允许计数;低电平时 停止计数,并保持其所计的脉冲数。在停止计数期间,首先需要一个锁存信号 LOAD 的上跳沿将计数 器在前 1 秒钟的计数值锁存进锁存器 REG32B1(图 2—1 c)中,并由外部的 16 进制 7 段译码器译出, 显示计数值。设置锁存器的好处是数据显示稳定,不会由于周期性的清 0 信号而不断闪烁。锁存信号后,必须有一清 0 信号 RST_CNT 对计数器进行清零,为下 1 秒的计数操作作准备。根据测频原理,测频控制时序可以如图(图 2—1 d)所示:

caf0645468b144759e16d115a986194c.png

要设计一个8位十六进制频率计,我们需要将之前的各个模块结合起来,并添加一些额外的逻辑以实现频率计的功能。频率计的主要功能是测量输入信号的频率,并将结果以8位十六进制显示。

频率计设计思路:

·  控制信号模块(FTCTRL1) - 控制计数器使能、复位和结果锁存。

·  8位计数器模块(COUNTER8B1) - 计数输入信号的周期数。

·  锁存器模块(REG8B1) - 锁存计数结果。

四、仿真程序
//顶层文件 
module freqtest1 (
    input CLK,
    input FSIN,
    output [31:0] DOUT
);
    wire TSTEN1;
    wire CLR_CNT1;
    wire LOAD1;
    wire [31:0] DTO1;

    FTCTRL FTCTRL (
        .CLKK(CLK),
        .CNT_EN(TSTEN1),
        .RST_CNT(CLR_CNT1),
        .Load(LOAD1)
    );

    REG32B REG32B (
        .LK(LOAD1),
        .DIN(DTO1),
        .DOUT(DOUT)
    );

    COUNTER32B COUNTER32B (
        .FIN(FSIN),
        .CLR(CLR_CNT1),
        .ENABL(TSTEN1),
        .DOUT(DTO1)
    );
endmodule

 //32位计数器模块
module COUNTER32B (
    input FIN,             // 时钟信号
    input CLR,             // 清零信号
    input ENABL,           // 使能信号
    output reg [31:0] DOUT // 计数输出
);
    reg [31:0] CQI;

    always @(posedge FIN or posedge CLR) begin
        if (CLR) 
            CQI <= 32'b0;   // 清零
        else if (ENABL)
            CQI <= CQI + 1; // 计数递增
    end

    always @(*) begin
        DOUT = CQI;
    end
endmodule

 // 32位锁存器模块
module REG32B (
    input LK,
    input [31:0] DIN,
    output reg [31:0] DOUT
);
    always @(posedge LK) begin
        DOUT <= DIN;
    end
endmodule

// 频率控制电路
module FTCTRL (
    input CLKK,            // 1Hz 时钟
    output wire CNT_EN,     // 计数器使能控制
    output reg RST_CNT,    // 计数器清零
    output wire Load        // 输出锁存信号
);
    reg Div2CLK;

    // 分频时钟产生
    always @(posedge CLKK) 
        Div2CLK <= ~Div2CLK; // 1Hz 时钟的2分频
    // 清零信号产生
    always @( CLKK or  Div2CLK) begin
        if (CLKK == 1'b0 & Div2CLK == 1'b0)
            RST_CNT <= 1'b1;   // 产生清零信号
        else
            RST_CNT <= 1'b0;
    end

    // Load 和 CNT_EN 信号产生
    assign
        Load = ~Div2CLK;
    assign    
		  CNT_EN = Div2CLK;
    
endmodule

五、仿真结果

第一次仿真测试:基频信号CLK给10MHZ,待测信号FIN给20MHZ,输出DOUT以十六进制显示,观察波形图

c47d80f516d84bfbaaa1aedcb3b0c42a.png

第二次仿真测试:基频信号CLK给10MHZ,待测信号FIN给40MHZ,输出DOUT以十六进制显示,观察波形图

ac821a7b88b24029aefb9c4a8d5808f4.png

第三次仿真测试:基频信号CLK给10MHZ,待测信号FIN给60MHZ,输出DOUT以十六进制显示,观察波形图

605bfe9039ed467184b3d923a1f6266c.png

结果分析:

波形图结果分析:根据频率计的原理,实质就是计数器。在测频控制信号CLK下进行计数,并将数据存到32位的锁存器REG32B1中,第一次仿真测试,基频信号CLK给10MHZ,待测信号FIN给20MHZ,那么应该累计计数2次待测信号FIN,输出结果十六进制为00000002符合期望。第二次仿真测试,基频信号CLK给10MHZ,待测信号FIN给40MHZ,那么应该累计计数4次待测信号FIN,输出结果十六进制为00000004符合期望。

六、实验结果

 第一次测试:1HZ的测频控制信号CLK由CKLB1输入,待测信号输入FIN由主系统上单线连接CLKB0,我们将CLKB0接到16HZ上,如图显示:

129ac5eb3d414207bdbd23b4a01f884b.png

第二次测试:1HZ的测频控制信号CLK由CKLB1输入,待测信号输入FIN由主系统上单线连接CLKB0,我们将CLKB0接到64HZ上,如图显示:

1b2a4138329042a8ae36774c5f3aa3aa.jpeg

第三次测试:1HZ的测频控制信号CLK由CKLB1输入,待测信号输入FIN由主系统上单线连接  CLKB0,我们将CLKB0接到128HZ上,如图显示:     

23ab0a4863b94225844797a1cb12612d.jpeg

 第四次测试:1HZ的测频控制信号CLK由CKLB1输入,待测信号输入FIN由主系统上单线连接  CLKB0,我们将CLKB0接到256HZ上,如图显示:

dd6d84247059496fb205a6feed4a50cf.png

结果分析:

第一次测试:1HZ的测频控制信号CLK由CKLB1输入,待测信号输入FIN由主系统上单线连接CLKB0,频率选择16HZ,结果可以看出数码管对应的数是0000010,...16×1+0×1=16HZ,与待测信号频率相一致,输出频率符合期望。

第二次测试:1HZ的测频控制信号CLK由CKLB1输入,待测信号输入FIN由主系统上单线连接CLKB0,频率选择64HZ,结果可以看出数码管对应的数是0000040,...16×4+0×1=64HZ,与待测信号频率相一致,输出频率符合期望。

第三次测试:1HZ的测频控制信号CLK由CKLB1输入,待测信号输入FIN由主系统上单线连接CLKB0,频率选择128HZ,结果可以看出数码管对应的数是0000010,...16×8+0×1=128HZ,与待测信号频率相一致,输出频率符合期望。

第四次测试:1HZ的测频控制信号CLK由CKLB1输入,待测信号输入FIN由主系统上单线连接CLKB0,频率选择256HZ,结果可以看出数码管对应的数是00000100,...16²×1+16×0+0=256HZ,与待测信号频率相一致,输出频率符合期望。

百度网盘:链接:https://pan.baidu.com/s/1CM9KwnM-29LeFw33E6zoLA?pwd=nn88 
提取码:nn88

http://链接:https://pan.baidu.com/s/1CM9KwnM-29LeFw33E6zoLA?pwd=nn88 提取码:nn88

  • 36
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Verilog代码示例,将两个十进制数用数码管显示。其中使用了一个数字显示模块,该模块接收一个4位的二进制数作为输入,并输出对应的7段数码管显示信息。 ```verilog module display( input clk, input [7:0] num1, // 第一个十进制数 input [7:0] num2, // 第二个十进制数 output reg [3:0] seg1, // 第一个数码管的输出 output reg [3:0] seg2 // 第二个数码管的输出 ); // 数字显示模块 module num_display( input [3:0] num, output reg [6:0] seg ); always @(*) begin case(num) 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 default: seg = 7'b1111111; // 显示空白 endcase end reg [7:0] count = 8'h00; // 计数器,用于取出十进制数的每一位 reg [3:0] digit1 = 4'b0000; // 第一个数码管的当前位数 reg [3:0] digit2 = 4'b0000; // 第二个数码管的当前位数 always @(posedge clk) begin if(count == 8'h08) begin count <= 8'h00; // 重新开始计数 digit1 <= digit1 + 4'b0001; // 切换到下一个数码管位 if(digit1 == 4'b1000) digit1 <= 4'b0000; // 循环回到第一位 digit2 <= digit2 + 4'b0001; if(digit2 == 4'b1000) digit2 <= 4'b0000; end else begin count <= count + 8'h01; // 继续计数,处理下一位 end end num_display disp1(.num(num1[digit1:digit1-4]), .seg(seg1)); // 第一个数码管 num_display disp2(.num(num2[digit2:digit2-4]), .seg(seg2)); // 第二个数码管 endmodule ``` 在主模块中,我们定义了两个8位的输入端口num1和num2,它们将被分别用于显示两个十进制数。我们还定义了两个4位的输出端口seg1和seg2,它们将与数码管的控制电路相连,实现数码管的显示功能。 在always块中,我们定义了一个计数器count,用于取出输入端口中的一位十进制数。对于每个数码管,我们分别定义了一个4位的变量digit1和digit2,它们表示当前显示的位数。我们使用num_display模块将每个十进制数的当前位数传递给数字显示模块,以获取对应的数码管输出。我们通过clk信号控制always块的执行,以实现数码管的动态显示。 请注意,在此Verilog代码示例中使用的数字显示模块是一个简单的示例,仅用于演示目的。在实际应用中,您可能需要使用更复杂的数字显示模块,以实现更广泛的数码管显示功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值