数控分频器设计.docx

上传人:b****1 文档编号:513708 上传时间:2023-04-29 格式:DOCX 页数:12 大小:217.48KB
下载 相关 举报
数控分频器设计.docx_第1页
第1页 / 共12页
数控分频器设计.docx_第2页
第2页 / 共12页
数控分频器设计.docx_第3页
第3页 / 共12页
数控分频器设计.docx_第4页
第4页 / 共12页
数控分频器设计.docx_第5页
第5页 / 共12页
数控分频器设计.docx_第6页
第6页 / 共12页
数控分频器设计.docx_第7页
第7页 / 共12页
数控分频器设计.docx_第8页
第8页 / 共12页
数控分频器设计.docx_第9页
第9页 / 共12页
数控分频器设计.docx_第10页
第10页 / 共12页
数控分频器设计.docx_第11页
第11页 / 共12页
数控分频器设计.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数控分频器设计.docx

《数控分频器设计.docx》由会员分享,可在线阅读,更多相关《数控分频器设计.docx(12页珍藏版)》请在冰点文库上搜索。

数控分频器设计.docx

数控分频器设计

 

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)测试结果及数据

下载成功后蜂鸣器会开始鸣叫,数码管显示数值,在按下对于的按键后会发现蜂鸣器的鸣叫频率发生改变,同是数码管显示的数据开始变化。

 

五、实验感想

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2