目录蜂鸣器的介绍无源蜂鸣器的设计无源蜂鸣器驱动原理设计目标绘制模块框图及波形图编辑编辑编写模块代码编写仿真代码仿真验证小作业模块代码拓展练习绘制模块框图及波形图编辑编写模块代码编写仿真代码仿真验证编辑蜂鸣器的介绍蜂鸣器按其结构可分为电磁式蜂鸣器和压电式蜂鸣器两种类型。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳组成。其工作原理是利用电磁原理通电时金属振动膜被吸附断电时依靠膜的弹性复位从而产生声音。压电式蜂鸣器则由多谐振荡器、压电蜂鸣片、阻抗匹配器、共鸣箱及外壳等构成。它通过压电陶瓷的压电效应驱动金属片振动发声。两种蜂鸣器因发声原理不同而各具特点压电式结构简单、耐用但音调单一、音色较差多用于报警器等设备。电磁式音色较好常用于语音、音乐等设备。蜂鸣器还可按是否内置信号源分为有源和无源两类有源蜂鸣器内部集成振荡电路仅需直流电源即可发声。无源蜂鸣器需外接音频驱动信号才能工作。下图蜂鸣器左为有源蜂鸣器右为无源蜂鸣器。无源蜂鸣器的设计无源蜂鸣器驱动原理通过控制输入的PWM方波参数即可实现。具体而言频率决定音调高低占空比影响音量大小只需调节PWM方波的频率和占空比就能让无源蜂鸣器发出不同音调的声音。设计目标使用蜂鸣器发出七个基础音调每个音调由特定频率决定且每个音调响0.5s。要实现这些音调我们需要生成七个不同频率的信号。为保持音量一致占空比固定设为50%。以下是七个音调对应的频率绘制模块框图及波形图编写模块代码module beep #( parameter CNT_MAX_500MS 32d24_999_999,//0.5s //7个音符分频数值 parameter DO 32d190839, parameter RE 32d170067, parameter MI 32d151514, parameter FA 32d143265, parameter SO 32d127550, parameter LA 32d113635, parameter SI 32d101213 ) ( input wire clk ,//50Mhz input wire rst_n , output wire beep_out ); //中间变量 reg [31:0] cnt_500ms ; reg [3:0] cnt ; reg [31:0] freq_data ; wire [31:0] duty_data ; reg [31:0] freq_cnt ; //cnt_500ms:0.5s的循环计数器 always(posedge clk or negedge rst_n) begin if(!rst_n) cnt_500ms 32d0; else if(cnt_500ms CNT_MAX_500MS) cnt_500ms 32d0; else cnt_500ms cnt_500ms 1b1; end //cnt:计0.5s的个数,也就是当前该响的音符序号 always(posedge clk or negedge rst_n) begin if(!rst_n) cnt 4d0; else if(cnt 4d6 cnt_500ms CNT_MAX_500MS) cnt 4d0; else if(cnt_500ms CNT_MAX_500MS) cnt cnt 1b1; else cnt cnt; end //freq_data:当前序号要响的音符的分频值(延迟一拍,图上没画) always(posedge clk or negedge rst_n) begin if(!rst_n) freq_data DO; else case(cnt) 4d0: freq_data DO; 4d1: freq_data RE; 4d2: freq_data MI; 4d3: freq_data FA; 4d4: freq_data SO; 4d5: freq_data LA; 4d6: freq_data SI; default:freq_data 0;//不响 endcase end //duty_data:占空比系数,负责控制响度 assign duty_data freq_data 1b1; //freq_cnt:当前音符的分频计数器 always(posedge clk or negedge rst_n) begin if(!rst_n) freq_cnt 32d0; else if(freq_cnt freq_data || cnt_500ms CNT_MAX_500MS)//当切换音符时清0 freq_cnt 32d0;//freq_cnt freq_data也可以 else freq_cnt freq_cnt 1b1; end //beep_out assign beep_out (freq_cnt duty_data) ? 1b0 : 1b1; endmodule编写仿真代码timescale 1ns/1ps module beep_tb(); reg clk ; reg rst_n ; wire beep_out; initial begin clk 1b0; rst_n 1b0; #123 rst_n 1b1; end always #10 clk ~clk; beep #( .CNT_MAX_500MS (32d24_999),//0.5ms .DO (32d190), .RE (32d170), .MI (32d151), .FA (32d143), .SO (32d127), .LA (32d113), .SI (32d101) ) beep_inst ( .clk (clk ),//50Mhz .rst_n (rst_n ), .beep_out(beep_out) ); endmodule仿真验证我抓取的是“Do”音调和“Re”音调的波形图由于我们仿真时把各参数缩小了约1000倍所以其单位波形的时间也缩小了约1000倍而前面说到“Do”音调的单位方波持续时间为3816794ns这里将时间缩小1000倍为3816ns与上述抓取的单位波形持续时间几乎一致说明我们 的设计正确。小作业使用无源蜂鸣器实现播放一首音乐旋律。这里不在绘制模块框图和波形图了使用以上七个基础音符编写一首音乐旋律即可。直接修改模块代码。模块代码随便找了一首音乐旋律编写为代码。仿真代码使用上面的代码即可。module beep #( parameter CNT_MAX_500MS 32d24_999_999,//0.5s //7个音符分频数值 parameter DO 32d190839, parameter RE 32d170067, parameter MI 32d151514, parameter FA 32d143265, parameter SO 32d127550, parameter LA 32d113635, parameter SI 32d101213 ) ( input wire clk ,//50Mhz input wire rst_n , output wire beep_out ); localparam MUSIC_LEN 7d35;//音乐旋律 //中间变量 reg [31:0] cnt_500ms ; reg [7:0] cnt ; reg [31:0] freq_data ; wire [31:0] duty_data ; reg [31:0] freq_cnt ; //cnt_500ms:0.5s的循环计数器 always(posedge clk or negedge rst_n) begin if(!rst_n) cnt_500ms 32d0; else if(cnt_500ms CNT_MAX_500MS) cnt_500ms 32d0; else cnt_500ms cnt_500ms 1b1; end //cnt:计0.5s的个数,也就是当前该响的音符序号 always(posedge clk or negedge rst_n) begin if(!rst_n) cnt 7d0; else if(cnt MUSIC_LEN cnt_500ms CNT_MAX_500MS) cnt 7d0; else if(cnt_500ms CNT_MAX_500MS) cnt cnt 1b1; else cnt cnt; end //freq_data:当前序号要响的音符的分频值(延迟一拍,图上没画) always(posedge clk or negedge rst_n) begin if(!rst_n) freq_data DO; else case(cnt) 7d0 : freq_data DO;//freq_data DO; 7d1 : freq_data RE;//freq_data RE; 7d2 : freq_data MI;//freq_data MI; 7d3 : freq_data DO;//freq_data FA; 7d4 : freq_data DO;//freq_data SO; 7d5 : freq_data RE;//freq_data LA; 7d6 : freq_data MI;//freq_data SI; 7d7 : freq_data DO; 7d8 : freq_data MI; 7d9 : freq_data FA; 7d10: freq_data SO; 7d11: freq_data 0; 7d12: freq_data MI; 7d13: freq_data FA; 7d14: freq_data SO; 7d15: freq_data 0; 7d16: freq_data SO; 7d17: freq_data LA; 7d18: freq_data SO; 7d19: freq_data FA; 7d20: freq_data MI; 7d21: freq_data DO; 7d22: freq_data SO; 7d23: freq_data LA; 7d24: freq_data SO; 7d25: freq_data FA; 7d26: freq_data MI; 7d27: freq_data DO; 7d28: freq_data RE; 7d29: freq_data SO; 7d30: freq_data DO; 7d31: freq_data 0; 7d32: freq_data RE; 7d33: freq_data SO; 7d34: freq_data DO; 7d35: freq_data 0; default:freq_data 0;//不响 endcase end //duty_data:占空比系数,负责控制响度 assign duty_data freq_data 4d9; //freq_cnt:当前音符的分频计数器 always(posedge clk or negedge rst_n) begin if(!rst_n) freq_cnt 32d0; else if(freq_cnt freq_data || cnt_500ms CNT_MAX_500MS)//当切换音符时清0 freq_cnt 32d0;//freq_cnt freq_data也可以 else freq_cnt freq_cnt 1b1; end //beep_out assign beep_out (freq_cnt duty_data) ? 1b0 : 1b1; endmodule下载代码上板验证即可。拓展练习按键按下一次播放下一个音符7个音符一循环按键不按就响当前音符。绘制模块框图及波形图编写模块代码module key_ctrl_beep #( parameter CNT_MAX_20MS 32d999_999, //7个基础音符 parameter DO 32d190839, parameter RE 32d170067, parameter MI 32d151514, parameter FA 32d143265, parameter SO 32d127550, parameter LA 32d113635, parameter SI 32d101213 ) ( input wire clk , input wire rst_n , input wire key_in , output wire beep_out ); reg [31:0] cnt_20ms ; reg key_flag ; reg [3:0] cnt ; reg [31:0] freq_data ; wire[31:0] duty_data ; reg [31:0] freq_cnt ; // cnt_20ms:特定计数器 always(posedge clk or negedge rst_n) begin if(!rst_n) cnt_20ms 32d0; else if(key_in)//高电平 cnt_20ms 32d0; else if(cnt_20ms CNT_MAX_20MS)//低电平,计数满 cnt_20ms CNT_MAX_20MS; else//低电平,计数未满 cnt_20ms cnt_20ms 1b1; end // key_flag:按键标志信号 always(posedge clk or negedge rst_n) begin if(!rst_n) key_flag 1b0; else if(cnt_20ms CNT_MAX_20MS - 1b1) key_flag 1b1; else key_flag 1b0; end // cnt:计按键按了几次,也就是音符序号(0-6) always(posedge clk or negedge rst_n) begin if(!rst_n) cnt 4d0; else if(cnt 4d6 key_flag 1b1) cnt 4d0; else if(key_flag 1b1) cnt cnt 1b1; else cnt cnt; end // freq_data:分频计数值 always(posedge clk or negedge rst_n) begin if(!rst_n) freq_data DO; else case(cnt) 4d0 : freq_data DO; 4d1 : freq_data RE; 4d2 : freq_data MI; 4d3 : freq_data FA; 4d4 : freq_data SO; 4d5 : freq_data LA; 4d6 : freq_data SI; default:freq_data 0;//不响 endcase end // duty_data:占空比,控制响度 assign duty_data freq_data 1b1; // freq_cnt:分频计数器 always(posedge clk or negedge rst_n) begin if(!rst_n) freq_cnt 32d0; else if(freq_cnt freq_data || key_flag 1) freq_cnt 32d0; else freq_cnt freq_cnt 1b1; end //beep_out assign beep_out (freq_cnt duty_data) ? 1b0 : 1b1; endmodule编写仿真代码timescale 1ns/1ps module key_ctrl_beep_tb(); reg clk ; reg rst_n ; reg key_in ; wire beep_out ; initial begin clk 1b0; rst_n 1b0; key_in 1b1; #123 rst_n 1b1; #1000 key_in 1b0; #17 key_in 1b1; #8 key_in 1b0; #29 key_in 1b1; #36 //前抖动 key_in 1b0; #23567 key_in 1b1;//后抖动 #36 key_in 1b0; #29 key_in 1b1; #8 key_in 1b0; #17 key_in 1b1; #1000 //按第一次 key_in 1b0;//按第二次 #17 key_in 1b1; #8 key_in 1b0; #29 key_in 1b1; #36 //前抖动 key_in 1b0; #23567 key_in 1b1;//后抖动 #36 key_in 1b0; #29 key_in 1b1; #8 key_in 1b0; #17 key_in 1b1; #1000 key_in 1b0;//按第三次 #17 key_in 1b1; #8 key_in 1b0; #29 key_in 1b1; #36 //前抖动 key_in 1b0; #23567 key_in 1b1;//后抖动 #36 key_in 1b0; #29 key_in 1b1; #8 key_in 1b0; #17 key_in 1b1; #1000 $stop; end always #10 clk ~clk; key_ctrl_beep #( .CNT_MAX_20MS(32d999),//20us .DO (32d190), .RE (32d170), .MI (32d151), .FA (32d143), .SO (32d127), .LA (32d113), .SI (32d101) ) key_ctrl_beep_inst ( .clk (clk ) , .rst_n (rst_n ) , .key_in (key_in ) , .beep_out(beep_out) ); endmodule仿真验证仿真验证通过绑定引脚下载代码上板验证即可。
基于FPGA的无源蜂鸣器驱动-基础篇
目录蜂鸣器的介绍无源蜂鸣器的设计无源蜂鸣器驱动原理设计目标绘制模块框图及波形图编辑编辑编写模块代码编写仿真代码仿真验证小作业模块代码拓展练习绘制模块框图及波形图编辑编写模块代码编写仿真代码仿真验证编辑蜂鸣器的介绍蜂鸣器按其结构可分为电磁式蜂鸣器和压电式蜂鸣器两种类型。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳组成。其工作原理是利用电磁原理通电时金属振动膜被吸附断电时依靠膜的弹性复位从而产生声音。压电式蜂鸣器则由多谐振荡器、压电蜂鸣片、阻抗匹配器、共鸣箱及外壳等构成。它通过压电陶瓷的压电效应驱动金属片振动发声。两种蜂鸣器因发声原理不同而各具特点压电式结构简单、耐用但音调单一、音色较差多用于报警器等设备。电磁式音色较好常用于语音、音乐等设备。蜂鸣器还可按是否内置信号源分为有源和无源两类有源蜂鸣器内部集成振荡电路仅需直流电源即可发声。无源蜂鸣器需外接音频驱动信号才能工作。下图蜂鸣器左为有源蜂鸣器右为无源蜂鸣器。无源蜂鸣器的设计无源蜂鸣器驱动原理通过控制输入的PWM方波参数即可实现。具体而言频率决定音调高低占空比影响音量大小只需调节PWM方波的频率和占空比就能让无源蜂鸣器发出不同音调的声音。设计目标使用蜂鸣器发出七个基础音调每个音调由特定频率决定且每个音调响0.5s。要实现这些音调我们需要生成七个不同频率的信号。为保持音量一致占空比固定设为50%。以下是七个音调对应的频率绘制模块框图及波形图编写模块代码module beep #( parameter CNT_MAX_500MS 32d24_999_999,//0.5s //7个音符分频数值 parameter DO 32d190839, parameter RE 32d170067, parameter MI 32d151514, parameter FA 32d143265, parameter SO 32d127550, parameter LA 32d113635, parameter SI 32d101213 ) ( input wire clk ,//50Mhz input wire rst_n , output wire beep_out ); //中间变量 reg [31:0] cnt_500ms ; reg [3:0] cnt ; reg [31:0] freq_data ; wire [31:0] duty_data ; reg [31:0] freq_cnt ; //cnt_500ms:0.5s的循环计数器 always(posedge clk or negedge rst_n) begin if(!rst_n) cnt_500ms 32d0; else if(cnt_500ms CNT_MAX_500MS) cnt_500ms 32d0; else cnt_500ms cnt_500ms 1b1; end //cnt:计0.5s的个数,也就是当前该响的音符序号 always(posedge clk or negedge rst_n) begin if(!rst_n) cnt 4d0; else if(cnt 4d6 cnt_500ms CNT_MAX_500MS) cnt 4d0; else if(cnt_500ms CNT_MAX_500MS) cnt cnt 1b1; else cnt cnt; end //freq_data:当前序号要响的音符的分频值(延迟一拍,图上没画) always(posedge clk or negedge rst_n) begin if(!rst_n) freq_data DO; else case(cnt) 4d0: freq_data DO; 4d1: freq_data RE; 4d2: freq_data MI; 4d3: freq_data FA; 4d4: freq_data SO; 4d5: freq_data LA; 4d6: freq_data SI; default:freq_data 0;//不响 endcase end //duty_data:占空比系数,负责控制响度 assign duty_data freq_data 1b1; //freq_cnt:当前音符的分频计数器 always(posedge clk or negedge rst_n) begin if(!rst_n) freq_cnt 32d0; else if(freq_cnt freq_data || cnt_500ms CNT_MAX_500MS)//当切换音符时清0 freq_cnt 32d0;//freq_cnt freq_data也可以 else freq_cnt freq_cnt 1b1; end //beep_out assign beep_out (freq_cnt duty_data) ? 1b0 : 1b1; endmodule编写仿真代码timescale 1ns/1ps module beep_tb(); reg clk ; reg rst_n ; wire beep_out; initial begin clk 1b0; rst_n 1b0; #123 rst_n 1b1; end always #10 clk ~clk; beep #( .CNT_MAX_500MS (32d24_999),//0.5ms .DO (32d190), .RE (32d170), .MI (32d151), .FA (32d143), .SO (32d127), .LA (32d113), .SI (32d101) ) beep_inst ( .clk (clk ),//50Mhz .rst_n (rst_n ), .beep_out(beep_out) ); endmodule仿真验证我抓取的是“Do”音调和“Re”音调的波形图由于我们仿真时把各参数缩小了约1000倍所以其单位波形的时间也缩小了约1000倍而前面说到“Do”音调的单位方波持续时间为3816794ns这里将时间缩小1000倍为3816ns与上述抓取的单位波形持续时间几乎一致说明我们 的设计正确。小作业使用无源蜂鸣器实现播放一首音乐旋律。这里不在绘制模块框图和波形图了使用以上七个基础音符编写一首音乐旋律即可。直接修改模块代码。模块代码随便找了一首音乐旋律编写为代码。仿真代码使用上面的代码即可。module beep #( parameter CNT_MAX_500MS 32d24_999_999,//0.5s //7个音符分频数值 parameter DO 32d190839, parameter RE 32d170067, parameter MI 32d151514, parameter FA 32d143265, parameter SO 32d127550, parameter LA 32d113635, parameter SI 32d101213 ) ( input wire clk ,//50Mhz input wire rst_n , output wire beep_out ); localparam MUSIC_LEN 7d35;//音乐旋律 //中间变量 reg [31:0] cnt_500ms ; reg [7:0] cnt ; reg [31:0] freq_data ; wire [31:0] duty_data ; reg [31:0] freq_cnt ; //cnt_500ms:0.5s的循环计数器 always(posedge clk or negedge rst_n) begin if(!rst_n) cnt_500ms 32d0; else if(cnt_500ms CNT_MAX_500MS) cnt_500ms 32d0; else cnt_500ms cnt_500ms 1b1; end //cnt:计0.5s的个数,也就是当前该响的音符序号 always(posedge clk or negedge rst_n) begin if(!rst_n) cnt 7d0; else if(cnt MUSIC_LEN cnt_500ms CNT_MAX_500MS) cnt 7d0; else if(cnt_500ms CNT_MAX_500MS) cnt cnt 1b1; else cnt cnt; end //freq_data:当前序号要响的音符的分频值(延迟一拍,图上没画) always(posedge clk or negedge rst_n) begin if(!rst_n) freq_data DO; else case(cnt) 7d0 : freq_data DO;//freq_data DO; 7d1 : freq_data RE;//freq_data RE; 7d2 : freq_data MI;//freq_data MI; 7d3 : freq_data DO;//freq_data FA; 7d4 : freq_data DO;//freq_data SO; 7d5 : freq_data RE;//freq_data LA; 7d6 : freq_data MI;//freq_data SI; 7d7 : freq_data DO; 7d8 : freq_data MI; 7d9 : freq_data FA; 7d10: freq_data SO; 7d11: freq_data 0; 7d12: freq_data MI; 7d13: freq_data FA; 7d14: freq_data SO; 7d15: freq_data 0; 7d16: freq_data SO; 7d17: freq_data LA; 7d18: freq_data SO; 7d19: freq_data FA; 7d20: freq_data MI; 7d21: freq_data DO; 7d22: freq_data SO; 7d23: freq_data LA; 7d24: freq_data SO; 7d25: freq_data FA; 7d26: freq_data MI; 7d27: freq_data DO; 7d28: freq_data RE; 7d29: freq_data SO; 7d30: freq_data DO; 7d31: freq_data 0; 7d32: freq_data RE; 7d33: freq_data SO; 7d34: freq_data DO; 7d35: freq_data 0; default:freq_data 0;//不响 endcase end //duty_data:占空比系数,负责控制响度 assign duty_data freq_data 4d9; //freq_cnt:当前音符的分频计数器 always(posedge clk or negedge rst_n) begin if(!rst_n) freq_cnt 32d0; else if(freq_cnt freq_data || cnt_500ms CNT_MAX_500MS)//当切换音符时清0 freq_cnt 32d0;//freq_cnt freq_data也可以 else freq_cnt freq_cnt 1b1; end //beep_out assign beep_out (freq_cnt duty_data) ? 1b0 : 1b1; endmodule下载代码上板验证即可。拓展练习按键按下一次播放下一个音符7个音符一循环按键不按就响当前音符。绘制模块框图及波形图编写模块代码module key_ctrl_beep #( parameter CNT_MAX_20MS 32d999_999, //7个基础音符 parameter DO 32d190839, parameter RE 32d170067, parameter MI 32d151514, parameter FA 32d143265, parameter SO 32d127550, parameter LA 32d113635, parameter SI 32d101213 ) ( input wire clk , input wire rst_n , input wire key_in , output wire beep_out ); reg [31:0] cnt_20ms ; reg key_flag ; reg [3:0] cnt ; reg [31:0] freq_data ; wire[31:0] duty_data ; reg [31:0] freq_cnt ; // cnt_20ms:特定计数器 always(posedge clk or negedge rst_n) begin if(!rst_n) cnt_20ms 32d0; else if(key_in)//高电平 cnt_20ms 32d0; else if(cnt_20ms CNT_MAX_20MS)//低电平,计数满 cnt_20ms CNT_MAX_20MS; else//低电平,计数未满 cnt_20ms cnt_20ms 1b1; end // key_flag:按键标志信号 always(posedge clk or negedge rst_n) begin if(!rst_n) key_flag 1b0; else if(cnt_20ms CNT_MAX_20MS - 1b1) key_flag 1b1; else key_flag 1b0; end // cnt:计按键按了几次,也就是音符序号(0-6) always(posedge clk or negedge rst_n) begin if(!rst_n) cnt 4d0; else if(cnt 4d6 key_flag 1b1) cnt 4d0; else if(key_flag 1b1) cnt cnt 1b1; else cnt cnt; end // freq_data:分频计数值 always(posedge clk or negedge rst_n) begin if(!rst_n) freq_data DO; else case(cnt) 4d0 : freq_data DO; 4d1 : freq_data RE; 4d2 : freq_data MI; 4d3 : freq_data FA; 4d4 : freq_data SO; 4d5 : freq_data LA; 4d6 : freq_data SI; default:freq_data 0;//不响 endcase end // duty_data:占空比,控制响度 assign duty_data freq_data 1b1; // freq_cnt:分频计数器 always(posedge clk or negedge rst_n) begin if(!rst_n) freq_cnt 32d0; else if(freq_cnt freq_data || key_flag 1) freq_cnt 32d0; else freq_cnt freq_cnt 1b1; end //beep_out assign beep_out (freq_cnt duty_data) ? 1b0 : 1b1; endmodule编写仿真代码timescale 1ns/1ps module key_ctrl_beep_tb(); reg clk ; reg rst_n ; reg key_in ; wire beep_out ; initial begin clk 1b0; rst_n 1b0; key_in 1b1; #123 rst_n 1b1; #1000 key_in 1b0; #17 key_in 1b1; #8 key_in 1b0; #29 key_in 1b1; #36 //前抖动 key_in 1b0; #23567 key_in 1b1;//后抖动 #36 key_in 1b0; #29 key_in 1b1; #8 key_in 1b0; #17 key_in 1b1; #1000 //按第一次 key_in 1b0;//按第二次 #17 key_in 1b1; #8 key_in 1b0; #29 key_in 1b1; #36 //前抖动 key_in 1b0; #23567 key_in 1b1;//后抖动 #36 key_in 1b0; #29 key_in 1b1; #8 key_in 1b0; #17 key_in 1b1; #1000 key_in 1b0;//按第三次 #17 key_in 1b1; #8 key_in 1b0; #29 key_in 1b1; #36 //前抖动 key_in 1b0; #23567 key_in 1b1;//后抖动 #36 key_in 1b0; #29 key_in 1b1; #8 key_in 1b0; #17 key_in 1b1; #1000 $stop; end always #10 clk ~clk; key_ctrl_beep #( .CNT_MAX_20MS(32d999),//20us .DO (32d190), .RE (32d170), .MI (32d151), .FA (32d143), .SO (32d127), .LA (32d113), .SI (32d101) ) key_ctrl_beep_inst ( .clk (clk ) , .rst_n (rst_n ) , .key_in (key_in ) , .beep_out(beep_out) ); endmodule仿真验证仿真验证通过绑定引脚下载代码上板验证即可。