数控分频器设计.docx
《数控分频器设计.docx》由会员分享,可在线阅读,更多相关《数控分频器设计.docx(12页珍藏版)》请在冰点文库上搜索。
数控分频器设计
EDA设计课程实验报告
实验题目:
数控分频器设计
学院名称:
专业:
班级:
姓名:
高胜学号小组成员:
指导教师:
一、实验目的
学习数控分频器的设计、分析和测试方法。
二、设计任务及要求
1、设计总体要求:
在SmartSOPC试验箱上的实现数控分频器的设计。
在clk输入64kHz或更高(要确保分频后落在音频范围)的频率信号(由int_div模块分频得到);输出FOUT接蜂鸣器BUZZ-ER,由KEY1/KEY2控制输入8位预置数,并在数码管1~2上显示(调用key_led模块)。
2、设计基本要求:
(1)能将频率分频。
(2)进行正常的蜂鸣器的蜂鸣功能。
(3)由2个数码管显示预置数。
三、系统设计
1、整体设计方案
数控分频器的输出信号频率为输入数据的函数。
数控分频器的clk为时钟输入端,data是数据输入端,fout是数控频率输出端。
数控分频器的输出频率受数据data的控制,data越大,输出频率越高。
数控分频器就是用计数值可并行预置的加法计数器设计完成的,方法是将计数溢出位与预置数加载输入信号相接即可。
数控分频器是由数码管显示电路、按键控制电路、脉冲发生电路这3个基本电路组成。
数控分频器的系统框图(见图1):
图1数控分频器的系统框图
2、功能模块电路设计
48MHz的脉冲经过分频器分成64KHz,然后输入带数控分频电路当中,按键控制分频电路中的频率变化,数码管显示预置数,蜂鸣器响起。
(1)输入输出模块框图(见图2)
图2数控分频器的输入输出模块框图
(2)算法流程图(见图3)
图3数控分频器的算法流程图
(3)Verilog源代码
按键控制电路代码:
modulekey_led(clock,key,led,hex,bin,seg,dig,ledin,data);
inputclock;//系统时钟(48MHz)
input[7:
0]key;//按键输入(KEY1~KEY8)
output[7:
0]led;//LED输出(LED1~LED8)
output[15:
0]hex;//4位16进制数输出(在数码管1~4显示)
output[3:
0]bin;//4位2进制数输出(在LED1~LED4显示)
output[7:
0]seg;//数码管段码输出
output[7:
0]dig;//数码管位码输出
input[3:
0]ledin;//LED显示输入(在LED5~LED8显示)
input[15:
0]data;//数码管显示输出(在数码管5~8显示)
reg[15:
0]hex_r;
reg[3:
0]bin_r;
reg[7:
0]seg_r;
reg[7:
0]dig_r;
reg[16:
0]count;//时钟分频计数器
reg[7:
0]dout1,dout2,dout3,buff;//消抖寄存器
reg[2:
0]cnt3;//数码管扫描计数器
reg[3:
0]disp_dat;//数码管扫描显存
regdiv_clk;//分频时钟,用于消抖和扫描
wire[7:
0]key_edge;//按键消抖输出
//信号输出
assignhex=hex_r;
assignbin=bin_r;
assignseg=seg_r;
assigndig=dig_r;
assignled=~{ledin,bin_r};
//时钟分频部分
always@(posedgeclock)
begin
if(count<17'd120000)
begin
count<=count+1'b1;
div_clk<=1'b0;
end
else
begin
count<=17'd0;
div_clk<=1'b1;
end
end
//按键消抖部分
always@(posedgeclock)
begin
if(div_clk)
begin
dout1<=key;
dout2<=dout1;
dout3<=dout2;
end
end
//按键边沿检测部分
always@(posedgeclock)
begin
buff<=dout1|dout2|dout3;
end
assignkey_edge=~(dout1|dout2|dout3)&buff;
//4位16进制数输出部分
always@(posedgeclock)//按键1
begin
if(key_edge[0])
hex_r[15:
12]<=hex_r[15:
12]+1'b1;
end
always@(posedgeclock)//按键2
begin
if(key_edge[1])
hex_r[11:
8]<=hex_r[11:
8]+1'b1;
end
always@(posedgeclock)//按键3
begin
if(key_edge[2])
hex_r[7:
4]<=hex_r[7:
4]+1'b1;
end
always@(posedgeclock)//按键4
begin
if(key_edge[3])
hex_r[3:
0]<=hex_r[3:
0]+1'b1;
end
//4位2进制数输出部分
always@(posedgeclock)//按键5
begin
if(key_edge[4])
bin_r[0]<=~bin_r[0];
end
always@(posedgeclock)//按键6
begin
if(key_edge[5])
bin_r[1]<=~bin_r[1];
end
always@(posedgeclock)//按键7
begin
if(key_edge[6])
bin_r[2]<=~bin_r[2];
end
always@(posedgeclock)//按键8
begin
if(key_edge[7])
bin_r[3]<=~bin_r[3];
end
//数码管扫描显示部分
always@(posedgeclock)//定义上升沿触发进程
begin
if(div_clk)
cnt3<=cnt3+1'b1;
end
always@(posedgeclock)
begin
if(div_clk)
begin
case(cnt3)//选择扫描显示数据
3'd0:
disp_dat=hex_r[15:
12];//第一个数码管
3'd1:
disp_dat=hex_r[11:
8];//第二个数码管
3'd2:
disp_dat=hex_r[7:
4];//第三个数码管
3'd3:
disp_dat=hex_r[3:
0];//第四个数码管
3'd4:
disp_dat=data[15:
12];//第五个数码管
3'd5:
disp_dat=data[11:
8];//第六个数码管
3'd6:
disp_dat=data[7:
4];//第七个数码管
3'd7:
disp_dat=data[3:
0];//第八个数码管
endcase
case(cnt3)//选择数码管显示位
3'd0:
dig_r=8'b01111111;//选择第一个数码管显示
3'd1:
dig_r=8'b10111111;//选择第二个数码管显示
3'd2:
dig_r=8'b11011111;//选择第三个数码管显示
3'd3:
dig_r=8'b11101111;//选择第四个数码管显示
3'd4:
dig_r=8'b11110111;//选择第五个数码管显示
3'd5:
dig_r=8'b11111011;//选择第六个数码管显示
3'd6:
dig_r=8'b11111101;//选择第七个数码管显示
3'd7:
dig_r=8'b11111110;//选择第八个数码管显示
endcase
end
end
always@(disp_dat)
begin
case(disp_dat)//七段译码
4'h0:
seg_r=8'hc0;//显示0
4'h1:
seg_r=8'hf9;//显示1
4'h2:
seg_r=8'ha4;//显示2
4'h3:
seg_r=8'hb0;//显示3
4'h4:
seg_r=8'h99;//显示4
4'h5:
seg_r=8'h92;//显示5
4'h6:
seg_r=8'h82;//显示6
4'h7:
seg_r=8'hf8;//显示7
4'h8:
seg_r=8'h80;//显示8
4'h9:
seg_r=8'h90;//显示9
4'ha:
seg_r=8'h88;//显示a
4'hb:
seg_r=8'h83;//显示b
4'hc:
seg_r=8'hc6;//显示c
4'hd:
seg_r=8'ha1;//显示d
4'he:
seg_r=8'h86;//显示e
4'hf:
seg_r=8'h8e;//显示f
endcase
end
endmodule
数控分频电路代码:
modulepulse(clk,data,fout);//数控分频器
inputclk;//时钟输入
input[7:
0]data;//预置分频数
outputfout;//分频输出
regfout_r;//输出寄存器
reg[7:
0]cnt8;//8位计数器
regfull;//溢出标志位
regcnt2;
assignfout=fout_r;//分频输出
always@(posedgeclk)
begin
if(cnt8==8'hff)
begin
cnt8<=data;//当cnt8计数计满时,输入数据Data被同步预置给计数器Cnt8
full<=1'b1;//同时使溢出标志信号full输出为高电平
end
else
begin
cnt8<=cnt8+1'b1;//否则继续作加1计数
full<=1'b0;//且输出溢出标志信号full为低电平
end
end
always@(posedgefull)
begin
if(full==1'b1)
begin
cnt2=~cnt2;//如果溢出标志信号full为高电平,D触发器输出取反
if(cnt2==1'b1)
fout_r=1'b1;
else
fout_r=1'b0;
end
end
endmodule
四、系统调试
1、仿真调试
(1)仿真波形图(见图4)
图4数控分频器仿真波形
(2)波形分析
由波形图可以知道实验成功。
2、实际调试
(1)测试条件、管脚分配
引脚分配(见表一)
表一管脚分配图
(2)测试结果及数据
下载成功后蜂鸣器会开始鸣叫,数码管显示数值,在按下对于的按键后会发现蜂鸣器的鸣叫频率发生改变,同是数码管显示的数据开始变化。
五、实验感想