无源蜂鸣器驱动实验

1.原理

计划是,生成不同的7个频率控制蜂鸣器发声,每个音调发声0.5秒。

50MHZ计数0.5秒,50MHZ一个周期20ns,要计数0.5秒 ,0.5/0.000_000_02s=25000_000个时钟周期。因为是从0开始计数,所以计数的最大值是0-2499_999。

用一个计数器计数发音的7个0.5秒,当成是一个循环。

1/262hz=0.0038167938931298s,约等于3816794 ns。因此3816794/20=190,839.7。约等于190840。也就是说要计数0-190839个时钟周期才是262hz。占空比是50%(占空比
是一个脉冲周期内,高电平的时间与整个周期时间的比例)。

注意:

最后一个else在时序逻辑中可以不写,但在组合逻辑中一定要写。

2.1 beep.v

复制代码
module beep #(
	parameter CNT_MAX=25'd24_999_999,
	parameter DO	=18'd190839,
	parameter RE    =18'd170067,
	parameter MI    =18'd151415,
	parameter FA    =18'd143265,
	parameter SO    =18'd127550,
	parameter LA    =18'd113635,
	parameter XI    =18'd101214
)
(
	input wire 		sys_clk,
	input wire 		sys_rst_n,
	
	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;

assign duty_data=freq_data>>1;

always@(posedge sys_clk or negedge sys_rst_n )
	if(sys_rst_n==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_rst_n )
	if(sys_rst_n==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_rst_n )
	if(sys_rst_n==1'b0)
		freq_cnt<=18'd0;
	else if((cnt==CNT_MAX)||(freq_cnt==freq_data))
		freq_cnt<=18'd0;
	else 
		freq_cnt<=freq_cnt+1'b1;
		
always@(posedge sys_clk or negedge sys_rst_n )
	if(sys_rst_n==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
	

always@(posedge sys_clk or negedge sys_rst_n )
	if(sys_rst_n==1'b0)
		beep<=1'b0;
	else if(freq_cnt>=duty_data)
		beep<=1'b1;
	else
		beep<=1'b0;
		
endmodule

tb_beep.v

复制代码
`timescale 1ns/1ns
module tb_beep();

reg sys_clk;
reg sys_rst_n;

wire beep;

initial
	begin
		sys_clk=1'b1;
		sys_rst_n<=1'b0;
		#20
		sys_rst_n<=1'b1;
	end
	
always #10 sys_clk=~sys_clk;
	
beep #(
	.CNT_MAX(25'd24_999_999),
	.DO		(18'd190839)    ,
	.RE     (18'd170067)    ,
	.MI     (18'd151415)    ,
	.FA     (18'd143265)    ,
	.SO     (18'd127550)    ,
	.LA     (18'd113635)    ,
	.XI     (18'd101214)
)
beep_inst(
	.sys_clk  (sys_clk),
	.sys_rst_n(sys_rst_n),
			  
	.beep     (beep)
);
endmodule
相关推荐
明德扬3 小时前
K7+AD9144 多模式实测|8 种 JESD204B 配置全覆盖验证
fpga开发
xyx-3v13 小时前
SOC相对于版上系统的优势是什么?
fpga开发
Aaron15881 天前
RFSOC+VU13P+GPU 在6G互联网中的技术应用
大数据·人工智能·算法·fpga开发·硬件工程·信息与通信·信号处理
stars-he2 天前
基于 Design Compiler 的 UDP Payload 追加控制模块综合与门级后仿真
笔记·fpga开发·udp
尤老师FPGA2 天前
HDMI数据的接收发送实验(十)
fpga开发
逻辑诗篇2 天前
破核拆解:PCIE719——基于Xilinx Zynq UltraScale+的高性能SAS扩展卡设计
fpga开发·架构
逻辑诗篇2 天前
高性能存储扩展利器|PCIE719 基于Zynq UltraScale+的企业级可编程SAS方案
fpga开发
liuluyang5302 天前
SV主要关键词详解
fpga开发·uvm·sv
happyDogg_2 天前
验证环境采样rtl时序数据遇到的问题
fpga开发
unicrom_深圳市由你创科技3 天前
项目分析和FPGA器件选型外包服务包括哪些内容?别让选错芯片毁了整个项目
fpga开发