此次实验目标是产生 计数0.5秒,占空比0.5重复上表频率的产生。
这里时钟周期为50MHz 根据频率对比计算可得:
可得如下的频率波形绘制
分别由时间计数器和频率计数器来确定0.5s的时长,频率计数器来确定系统时钟与信号频率之间的关系,在0.5s时间内保持频率计数器的最大值不变
单取一截时间来看其对应波形如下图所示:
module beep #( parameter CNT_MAX = 25'd24_999_999, // 计时500ms parameter DO = 18'd190839, parameter RE = 18'd170067, parameter MI = 18'd151514, parameter FA = 18'd143265, parameter SO = 18'd127550, parameter LA = 18'd113635, parameter XI = 18'd101213 ) ( input wire sys_clk, input wire sys_res, output reg beep ); reg [24:0] cnt; reg [2:0] cnt_500ms; reg [17:0] freq_cnt; reg [17:0] freq_data; wire [16:0] duty_data; always@(posedge sys_clk or negedge sys_res) if(sys_res == 1'b0) cnt <= 25'd0; else if(cnt == CNT_MAX) cnt <= 25'd0; else cnt <= cnt + 1'b1; always@(posedge sys_clk or negedge sys_res) if(sys_res == 1'b0) cnt_500ms <= 3'd0; else if((cnt_500ms == 3'd6)&&(cnt == CNT_MAX)) //七个频段重复输出 cnt_500ms <= 3'd0; else if(cnt == CNT_MAX) cnt_500ms <= cnt_500ms + 1'b1; else cnt_500ms <= cnt_500ms; always@(posedge sys_clk or negedge sys_res) if(sys_res == 1'b0) freq_cnt <= 18'd0; else if((freq_cnt == freq_data)||(cnt == CNT_MAX)) freq_cnt <= 18'd0; else freq_cnt <= freq_cnt + 1'b1; always@(posedge sys_clk or negedge sys_res) if(sys_res == 1'b0) freq_data <= DO; else case(cnt_500ms) 3'd0 : freq_data <= DO; 3'd1 : freq_data <= RE; 3'd2 : freq_data <= MI; 3'd3 : freq_data <= FA; 3'd4 : freq_data <= SO; 3'd5 : freq_data <= LA; 3'd6 : freq_data <= XI; default:freq_data <= DO; endcase assign duty_data = freq_data >> 1; //右一一位表示除以2 always@(posedge sys_clk or negedge sys_res) if(sys_res == 1'b0) beep <= 1'b0; else if(freq_cnt >= duty_data) beep <= 1'b1; else beep <= 1'b0; endmodule
`timescale 1ns/1ns module tb_beep(); reg sys_clk; reg sys_res; wire beep; initial begin sys_clk = 1'b1; sys_res <= 1'b0; #20 sys_res <= 1'b1; end always #10 sys_clk = ~sys_clk; beep #( .CNT_MAX (25'd24_999_999), // 计时500ms .DO (18'd190839), .RE (18'd170067), .MI (18'd151514), .FA (18'd143265), .SO (18'd127550), .LA (18'd113635), .XI (18'd101213) ) beep_1 ( .sys_clk(sys_clk), .sys_res(sys_res), .beep(beep) ); endmodule
FPGA实验 -- 无源蜂鸣器
最新推荐文章于 2023-11-20 22:28:15 发布
这篇博客介绍了如何使用Verilog设计一个频率发生器模块,该模块在50MHz时钟频率下,能产生0.5秒周期、占空比50%的信号。通过时间计数器和频率计数器来控制信号的产生,并且详细展示了代码实现和波形图。
摘要由CSDN通过智能技术生成