基于Verilog的数字频率计的设计包含代码及仿真.docx

上传人:b****5 文档编号:7933192 上传时间:2023-01-27 格式:DOCX 页数:21 大小:270.85KB
下载 相关 举报
基于Verilog的数字频率计的设计包含代码及仿真.docx_第1页
第1页 / 共21页
基于Verilog的数字频率计的设计包含代码及仿真.docx_第2页
第2页 / 共21页
基于Verilog的数字频率计的设计包含代码及仿真.docx_第3页
第3页 / 共21页
基于Verilog的数字频率计的设计包含代码及仿真.docx_第4页
第4页 / 共21页
基于Verilog的数字频率计的设计包含代码及仿真.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

基于Verilog的数字频率计的设计包含代码及仿真.docx

《基于Verilog的数字频率计的设计包含代码及仿真.docx》由会员分享,可在线阅读,更多相关《基于Verilog的数字频率计的设计包含代码及仿真.docx(21页珍藏版)》请在冰豆网上搜索。

基于Verilog的数字频率计的设计包含代码及仿真.docx

基于Verilog的数字频率计的设计包含代码及仿真

一、实验名称

数字频率计的设计

二、实验地点

211楼303

三、实验目的和任务

(1)了解数字电路设计的基本特点

(2)了解数字频率计电路的基本原理

(3)基本掌握ISE软件的使用(设计输入、仿真、实现)

(4)了解可编程逻辑器件(FPGA)的一般情况

(5)基本掌握HDL的使用

四、实验内容

(1)设计出符合设计要求的解决方案

(2)设计出单元电路

(3)利用EDA软件对各单元电路及整体电路进行仿真

(4)利用EDA软件在ELB电子课程设计实验板实现设计

(5)观察实验结果

五、项目需用仪器设备名称以及所需主要元器件

PC机、EDA教学实验系统一台,带有(SPARTAN-3AXC3S200A芯片,LED管,七段数码管等)的实验板一块,跳线、下载电缆一根,函数发生器。

六、实验任务与要求

频率测量范围为10Hz~10MHz,用6只数码管以kHz为单位显示测量结果;有三个带锁按键开关(任何时候都只会有一个被按下)用来选择1S、0.1S和0.01S三个闸门时间中的一个;有一个按钮开关用来使频率计复位;有两只LED,一只用来显示闸门的开与闭,另一只当计数器溢出时做溢出指示。

数字频率计的相关技术指标如下:

1、位数:

测量频率通过LED数码管为六位十进制数显示。

2、测试频率范围为:

10HZ-10MHZ。

3、计数器溢出时要有溢出标志over。

4、需要有闸门标志gate。

5、显示工作方式:

a、用BCD七段共阳极数码管显示读数,只有在读数不发生跳变时才是正确的结果。

b、采用记忆显示方法,即在一次测试结束时,显示测试结果,此显示值一直保留到下次测量显示数到来,才将上次显示更新。

用第二次测试结果,更新显示值。

6、要求被测输入信号应是符合数字电路要求的脉冲波。

七、verilog设计环境介绍

Verilog

VerilogHDL是目前应用最为广泛的硬件描述语言.VerilogHDL可以用来进行各种层次的逻辑设计,也可以进数字系统的逻辑综合,仿真验证和时序分析等。

  VerilogHDL适合算法级,寄存器级,逻辑级,开关级、系统级和版图级等各个层次的设计和描述.  

verilogHDL进行设计最大的优点是其工艺无关性.这使得工程师在功能设计,逻辑验证阶段可以不必过多考虑门级及工艺实现的具体细节,只需根据系统设计的要求施加不同的约束条件,即可设计出实际电路.  

verilogHDL是一种硬件描述语言(hardwaredescriptionlanguage),为了制作数字电路而用来描述ASICS和FPGA的设计之用。

verilogHDL的设计者想要以C编程语言为基础设计一种语言,可以使工程师比较容易学习。

Verilog是由en:

GatewayDesignAutomation公司于大约1984年开始发展。

GatewayDesignAutomation公司后来被CadenceDesignSystems于1990年所购并。

现在Cadence对于Gateway公司的Verilog和Verilog-XL模拟器拥有全部的财产权。

选择VHDL还是verilogHDL?

这是一个初学者最常见的问题。

其实两种语言的差别并不大,他们的描述能力也是类似的。

掌握其中一种语言以后,可以通过短期的学习,较快的学会另一种语言。

选择何种语言主要还是看周围人群的使用习惯,这样可以方便日后的学习交流。

当然,如果您是专用集成电路(ASIC)设计人员,则必须首先掌握verilog,因为在IC设计领域,90%以上的公司都是采用verilog进行IC设计。

对于PLD/FPGA设计者而言,两种语言可以自由选择。

八、实验原理

所谓“频率”,就是周期性信号在单位时间(1秒)内变化的次数。

若在一定时间内计得这个周期信号变化的次数为N,则其频率可表达为:

(1)

电子技术器可以严格按公式

(1)所表达的频率的定义进行测频,其原理方框图如图1所示:

图1测频原理图

首先,把被测信号

(以正弦波为例)通过放大整形电路变成脉冲

(实际上变成方波即可)其重复频率等于被测频率

,然后将它加到闸门的一个输入端。

闸门通过门控信号

来控制开、闭时间,只有在闸门开通时间T内,被计数的脉冲

才能通过闸门,被送到十进制电子计数器进行计数。

门控信号的时间T是非常准确的,以它作为时间基准,它由时基发生器提供。

时基信号发生器由一个高稳定的石英振荡器和一系列数字分频器组成,由它输出的标准时间脉冲(时标)去控制门控电路形成门控信号。

比如,时标信号的重复周期为1S,则加到闸门的门控信号作用时间T及闸门时间亦准确的等于1S,及闸门开通时间为1S,这时若计得10000个数,则有

(1)式知,被测频率

从以上讨论可知,电子计数器的测频原理实质上以比较法为基础,它将

和时基信号频率相比,两个频率相比的结果以数字的形式显示出来。

九、

1.原理框图溢出信号

clearlatch

时基

 

2、各模块功能及实现

一.分频模块程序

modulecount(rest,clk,clk_1hz,clk_10hz,clk_100hz,clk_1khz);

inputclk,rest;

outputregclk_1hz,clk_10hz,clk_100hz,clk_1khz;

reg[29:

0]count1,count2,count3,count4;

initial

begin

clk_1hz=0;

clk_10hz=0;

clk_100hz=0;

clk_1khz=0;

count1=0;

count2=0;

count3=0;

count4=0;

end

always@(posedgeclk)

begin

if(!

rest)

begin

count1<=0;count2<=0;count3<=0;count4<=0;

clk_1hz<=0;clk_10hz<=0;clk_100hz<=0;clk_1khz<=0;

end

elsebegin

if(count1==24000000)

begincount1<=0;clk_1hz<=~clk_1hz;end

elsecount1<=count1+1;

if(count2==2400000)

begincount2<=0;clk_10hz<=~clk_10hz;end

elsecount2<=count2+1;

if(count3==240000)

begincount3<=0;clk_100hz<=~clk_100hz;end

elsecount3<=count3+1;

if(count4==24000)

begincount4<=0;clk_1khz<=~clk_1khz;end

elsecount4<=count4+1;

end

end

endmodule

 

仿真图

仿真模块

二,门控电路和清零,锁存,阀门信号产生程序

modulechose(rest,clk_10hz,clk_100hzhz,clk_1khz,key1,key10,key100,

gate_out1,ff,clk_latch,clk_clear);

inputrest,clk_10hz,clk_100hz,clk_1khz,key1,key10,key100;

outputgate_out1,clk_latch,clk_clear;

outputreg[2:

1]ff;

reggate_out1,clk_latch,clk_clear,gate;

reg[4:

1]count;

initialbegingate_out1=0;ff=0;clk_latch=0;clk_clear=0;gate=0;count=0;end

always@(posedgeclk_1khz)

begin

if(!

rest)begingate_out1<=0;ff<=2'b00;end

elsebegin

if(key1==1&&key10==0&&key100==0)begingate<=clk_10hz;ff<=2'b01;end

elseif(key1==0&&key10==1&&key100==0)begingate<=clk_100hz;ff<=2'b10;end

elseif(key1==0&&key10==0&&key100==1)begingate<=clk_1khz;ff<=2'b11;end

elsebeginff<=0;end

end

end

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

always@(posedgegate)

begin

count<=count+1;

if(count<=9)

begingate_out1<=1;clk_clear<=0;clk_latch<=0;end

elseif(count==11)

begingate_out1<=0;clk_clear<=0;clk_latch<=1;end

elseif(count==13)

begingate_out1<=0;clk_clear<=1;clk_latch<=0;count<=0;end

else

begingate_out1<=0;clk_clear<=0;clk_latch<=0;end

end

endmodule

 

仿真图

仿真模块

 

三,计数器程序

 

modulecounter(rest,start,clk_in,cnt1,cnt2,cnt3,cnt4,cnt5,cnt6,yichu,clk_clear);

inputrest,start,clk_in,clk_clear;

outputyichu;

regyichu;

outputreg[4:

1]cnt1,cnt2,cnt3,cnt4,cnt5,cnt6;

initialbegin

yichu=1;

cnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;cnt4<=4'b0000;

cnt5<=4'b0000;

cnt6<=4'b0000;

end

always@(posedgeclk_in)

begin

if(!

rest)begin

cnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;

cnt4<=4'b0000;cnt5<=4'b0000;cnt6<=4'b0000;

end

elsebegin

if(clk_clear==1)

begin

cnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;

cnt4<=4'b0000;cnt5<=4'b0000;cnt6<=4'b0000;yichu<=1;

end

elseif(start==1)

begin

if((cnt6==4'b1001)&&(cnt5==4'b1001)&&(cnt4==4'b1001)&&(cnt3==4'b1001)&&(cnt2==4'b1001)&&(cnt1==4'b1001))

begin

cnt1<=4'b0000;cnt2<=4'b0000;

cnt3<=4'b0000;cnt4<=4'b0000;

cnt5<=4'b0000;cnt6<=4'b0000;

yichu<=0;

end

elseif((cnt5==4'b1001)&&(cnt4==4'b1001)&&(cnt3==4'b1001)&&(cnt2==4'b1001)&&

(cnt1==4'b1001))

begin

cnt1<=4'b0000;cnt2<=4'b0000;

cnt3<=4'b0000;cnt4<=4'b0000;

cnt5<=4'b0001;cnt6<=cnt6+4'b0001;

end

elseif((cnt4==4'b1001)&&(cnt3==4'b1001)&&(cnt2==4'b1001)&&(cnt1==4'b1001))begin

cnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;

cnt4<=4'b0000;cnt5<=cnt5+4'b0001;cnt6<=cnt6;

end

elseif((cnt3==4'b1001)&&(cnt2==4'b1001)&&(cnt1==4'b1001))

begin

cnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;

cnt4<=cnt4+4'b0001;cnt5<=cnt5;cnt6<=cnt6;

end

elseif((cnt2==4'b1001)&&(cnt1==4'b1001))

begin

cnt1<=4'b0000;cnt2<=4'b0000;

cnt3<=cnt3+4'b0001;

cnt4<=cnt4;cnt5<=cnt5;cnt6<=cnt6;

end

elseif((cnt1==4'b1001))

begin

cnt1<=4'b0000;cnt2<=cnt2+4'b0001;cnt3<=cnt3;

cnt4<=cnt4;cnt5<=cnt5;cnt6<=cnt6;

end

elsebegin

cnt1<=cnt1+4'b0001;cnt2<=cnt2;cnt3<=cnt3;

cnt4<=cnt4;cnt5<=cnt5;cnt6<=cnt6;

end

end

end

end

endmodule

 

仿真图

 

模块仿真图

四,锁存以及译码扫描显示程序

 

modulev138(rest,clk_1khz,se,in1,in2,in3,in4,in5,in6,segs,ff,dp,led,en,clk_latch);

input[4:

1]in1,in2,in3,in4,in5,in6;

inputclk_1khz,rest;

input[2:

1]ff;

inputclk_latch;

outputregdp,led,en;

outputreg[4:

1]se;

reg[3:

1]count,dig;

outputreg[7:

1]segs;

reg[4:

1]sign_out4;

reg[4:

1]latch1,latch2,latch3,latch4,latch5,latch6;

initialbegincount<=0;dp<=1;segs<=0;

se<=0;sign_out4<=0;led<=0;en<=0;

latch1<=0;latch2<=0;latch3<=0;

latch4<=0;latch5<=0;latch6<=0;

end

 

////////////////////////////////////////////////////////////////////////////////////

 

always@(posedgeclk_latch)

begin

latch1<=in1;latch2<=in2;latch3<=in3;

latch4<=in4;latch5<=in5;latch6<=in6;

end

/////////////////////////////////////////////////////////////////////////////////锁存器。

always@(posedgeclk_1khz)

begin

count<=count+1;

end

/////////////////////////////////////////////////////////////////////////////////位选自加

always@(posedgeclk_1khz)

begin

if(!

rest)

begin

led<=1;

end

else

begin

case(count)

0:

beginsign_out4<=latch1;se<=count;end

1:

beginsign_out4<=latch2;se<=count;end

2:

beginsign_out4<=latch3;se<=count;end

3:

beginsign_out4<=latch4;se<=count;end

4:

beginsign_out4<=latch5;se<=count;end

5:

beginsign_out4<=latch6;se<=count;end

default:

sign_out4<=4'b1111;

endcase

end

end

////////////////////////////////////////////////////////////////////////////////////////////将数据依次译码

always@(posedgeclk_1khz)

begin

if(ff==2'b01&&se==3)begindp<=0;end

elseif(ff==2'b10&&se==2)begindp<=0;end

elseif(ff==2'b11&&se==1)begindp<=0;end

elsebegindp<=1;end

end

//////////////////////////////////////////////////////////////////////////////////档位选择

always@(sign_out4)

begin

if(!

rest)

beginsegs<=0;end

else

begin

case(sign_out4)

0:

segs<=7'b0000001;

1:

segs<=7'b1001111;

2:

segs<=7'b0010010;

3:

segs<=7'b0000110;

4:

segs<=7'b1001100;

5:

segs<=7'b0100100;

6:

segs<=7'b1100000;

7:

segs<=7'b0001111;

8:

segs<=7'b0000000;

9:

segs<=7'b0000100;

default:

segs<=7'b1111111;

endcase

end

end

//////////////////////////////////////////////////////////////////////////////////////译码显示

endmodule

 

仿真图

 

模块仿真图

五,顶层电路程序

moduletop(rest,clk,key1,key2,key3,clk_in,se,segs,led,dp,en,yichu);

inputrest,clk,clk_in,key1,key2,key3;

outputdp,led,en,yichu;

output[3:

1]se;

output[7:

1]segs;

wire[4:

1]out1,out2,out3,out4,out5,out6;

wire[2:

1]ff;

wiregate_out1;

countcount(.clk(clk),.rest(rest),.clk_10hz(clk_10hz),.clk_100hz(clk_100hz),.clk_1khz(clk_1khz));

///////////////////////////////////////////////////////////////////////分频器

chose

chose(.rest(rest),.clk_1khz(clk_1khz),.clk_10hz(clk_10hz),.clk_100hz(clk_100hz),.

ky1(key1),.key10(key2),.key100(key3),

.gate_out1(gate_out1),.ff(ff),.clk_latch(clk_latch),.

clk_cear(clk_clear));

/////////////////////////////////////时基选择模块

countercounter(.start(gate_out1),.rest(rest),.clk_in(clk_in),.cnt1(out1),

.yichu(yichu),.cnt2(out2),.cnt3(out3),.cnt4(out4),.cnt5(out5),.cnt6(out6),.clk_clear(clk_clear));

////////////////////////////////////计数器器

v138v138(.rest(rest),.clk_1khz(clk_1khz),.se(se),

.led(led),.in1(out1),.in2(out2),.in3(out3),.in4(out4),

.in5(out5),.in6(out6),.segs(segs),.ff(ff),.en(en),.dp(dp),.clk_latch(clk_latch));

endmodule

///////////////////////

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

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1