FPGA4位十进制频率计Word格式.docx

上传人:b****6 文档编号:17041449 上传时间:2022-11-28 格式:DOCX 页数:15 大小:282.70KB
下载 相关 举报
FPGA4位十进制频率计Word格式.docx_第1页
第1页 / 共15页
FPGA4位十进制频率计Word格式.docx_第2页
第2页 / 共15页
FPGA4位十进制频率计Word格式.docx_第3页
第3页 / 共15页
FPGA4位十进制频率计Word格式.docx_第4页
第4页 / 共15页
FPGA4位十进制频率计Word格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

FPGA4位十进制频率计Word格式.docx

《FPGA4位十进制频率计Word格式.docx》由会员分享,可在线阅读,更多相关《FPGA4位十进制频率计Word格式.docx(15页珍藏版)》请在冰豆网上搜索。

FPGA4位十进制频率计Word格式.docx

黄色感叹符号代表有警告,有些警告可以忽略,绿色小勾表示综合成功。

 

5、建立测试文件并进行仿真,验证设计。

图7建立激励文件

为了结合我们的下载板子的时钟信号,在测试文件中设置时钟单位为10ns,精度为1ps,如图:

图8设置时钟单位

仿真文件应验证个端口的正确性。

由于时钟单位为10ns,所以CLK_50M每一个仿真时间单位翻转一次即可产生一个50M的时钟信号。

开始时进行一次复位,使各寄存器初值正确。

control_port端为数码管位扫描端,所以其值一直在1110~1101~1011~0111循环。

data_out端为数码管显示的数字对应的七段数码管的二进制数据,它的值可以与control_port端对应到一起观察,转换为对应的十进制数据即是1110、1101、1011、0111对应的data端的信号由0~9循环。

对测试文件进行检查,出现绿色小勾表示无语法错误,可以进行仿真。

图9

6、根据板子锁定引脚,并生成下载文件。

下载板有两个时钟输出引脚,一个为40M的,一个为50M的。

本设计采用的是50M,所以CLK_50M引脚锁定为引脚P80,即net"

CLK_50M"

loc=p80。

CLR复位端连接一个轻触开关,为P57,即net"

CLR"

loc=p57。

CARRY_OUT溢出标志端用一个LED灯来表示,net"

CARRY_OUT"

loc=p22。

下载板数码管引脚图如图所示:

图10数码管端口图

由图可知data端和control_port端的引脚应该分别锁定为:

net"

data_out[0]"

loc=p102;

data_out[1]"

loc=p99;

data_out[2]"

loc=p107;

data_out[3]"

loc=p109;

data_out[4]"

loc=p112;

data_out[5]"

loc=p100;

data_out[6]"

loc=p106;

data_out[7]"

loc=p108;

control_port[0]"

loc=p127;

control_port[1]"

loc=p128;

control_port[2]"

loc=p129;

control_port[3]"

loc=p132;

control_port[4]"

loc=p120;

control_port[5]"

loc=p122;

四、仿真结果

1、时钟信号

图11验证CLK信号

由图可知,CLK信号周期为20ns,时钟信号正确。

2、control_port信号

图12control_port信号

由图可知,control_port信号在预料的循环之内,所以正确。

3、data信号

图13data信号第二个扫描周期

图14data信号第三个扫描周期

图15data信号第四个扫描周期

图16data信号第五个扫描周期

由上图综合可知,data信号在预料的变化之内,所以正确。

五、体会

本次设计由于有了上一次跑表的设计,所以有了几分心得。

要做得快了不少,但还是有一定难度。

把难度大的设计分为各个难度较小的模块来设计,本就是我们自顶向下设计的一种重要思想。

该设计就用到了这种思想。

在简化的同时,我们应该确保各个模块的正确性,所以各个模块我们都应测试、仿真之后在综合到一起。

有时候分开各个模块都可以,但是综合在一起就有各种错误出现了。

所以我们在综合代码的时候,一点要小心又小心,确保引脚的对应关系无误。

逻辑顺序无误。

六、代码

1、VerilogHDL代码:

/************************4位十进制计数器***********************

//F_in待测频率,CLK_50M系统时钟,CLR复位标志,CARRY_OUT溢出标志

//data_out数码管显示值,control_port数码管位选信号

***********************************************************/

(1)十进制计数器模块

modulecounter_10(CLK,CLR,En,data,CO);

inputCLK,CLR,En;

outputreg[3:

0]data;

outputregCO=1'

b0;

always@(posedgeCLKorposedgeCLR)

begin

if(CLR)

begin

data<

=4'

CO<

=1'

end

elseif(En)

if(data==4'

b1001)

begin

data<

CO<

b1;

end

else

=data+1'

end

endmodule

(2)分频模块

/*********************

分频模块,用于产生测试

用的频率,以及控制信号。

**********************/

modulediv_fre(CLK_50M,CLR,F_in,clk_1s,clk_100us);

inputCLK_50M,CLR;

outputregF_in,clk_1s,clk_100us;

reg[12:

0]cnt,cnt1,cnt2;

parameterdiv_num=13'

h1;

//13'

h1387;

//改变阈值即可调节F_in的频率范围

always@(posedgeCLK_50MorposedgeCLR)//分频模块

begin

cnt<

=13'

h0;

clk_100us<

end

elseif(cnt==13'

h1387)//每0.1ms产生一个脉冲信号

clk_100us<

cnt<

else

begin

=cnt+1'

always@(posedgeclk_100usorposedgeCLR)

if(CLR)

cnt1<

F_in<

elseif(cnt1==div_num)

=~F_in;

else

cnt1<

=cnt1+1'

cnt2<

clk_1s<

//elseif(cnt2==13'

h1387)

elseif(cnt2==13'

ha)

=~clk_1s;

cnt2<

=cnt2+1'

(3)测频控制模块

moduletest_ctl(clk_1s,cnt_en,clr_cnt);

inputclk_1s;

//1HZ

outputcnt_en;

outputclr_cnt;

//outputload;

regdiv2clk=0;

wirecnt_en;

regclr_cnt,i;

//wireload;

always@(negedgeclk_1s)

begin

for(i=10;

i>

0;

i=i-1)

div2clk<

div2clk<

always@(clk_1sordiv2clk)

if(!

clk_1s&

&

!

div2clk)

clr_cnt<

else

//assignload=~div2clk;

assigncnt_en=div2clk;

endmodule

(4)锁存器模块

modulelatch(clk,data_in,data_out);

inputclk;

input[3:

0]data_in;

0]data_out=4'

always@(posedgeclk)

data_out<

=data_in;

(5)数码管显示模块

moduleseg_display(CLK_50M,CLR,data_in_1,data_in_2,data_in_3,data_in_4,data_out,control_port);

0]data_in_1,data_in_2,data_in_3,data_in_4;

outputreg[7:

0]data_out;

0]control_port;

reg[15:

0]scan_cnt;

reg[1:

0]seg;

always@(posedgeCLK_50MorposedgeCLR)//数码管的动态扫描显示,每1ms显示下一位

scan_cnt<

=16'

seg<

=2'

b00;

if(scan_cnt==16'

hc34f)

scan_cnt<

=scan_cnt+1;

h0)

if(seg==2'

b11)

seg<

else

=seg+1'

always@(posedgeCLK_50MorposedgeCLR)

data_out<

=8'

control_port<

b1110;

case(seg)//数码管显示选择

2'

b00:

{control_port,data_out}<

={4'

b1110,seg_data(data_in_1)};

b01:

b1101,seg_data(data_in_2)};

b10:

b1011,seg_data(data_in_3)};

b11:

b0111,seg_data(data_in_4)};

default:

=12'

hec0;

endcase

function[7:

0]seg_data;

//数码管值的选择

0]x;

case(x)

0:

seg_data=8'

hc0;

1:

hf9;

2:

ha4;

3:

hb0;

4:

h99;

5:

h92;

6:

h82;

7:

hf8;

8:

h80;

9:

h90;

default:

hff;

endcase

endfunction

2、测试代码:

`timescale10ns/1ps

modulecym_cym_sch_tb();

//Inputs

regCLR;

regCLK_50M;

//Output

wireCARRY_OUT;

wire[7:

wire[3:

//Bidirs

//InstantiatetheUUT

cymUUT(

.CLR(CLR),

.CARRY_OUT(CARRY_OUT),

.CLK_50M(CLK_50M),

.data_out(data_out),

.control_port(control_port)

);

//InitializeInputs

initialbegin

CLK_50M=0;

forever#1CLK_50M=~CLK_50M;

CLR=1;

#10CLR=0;

3、引脚锁定:

loc=p80;

loc=p57;

loc=p22;

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

当前位置:首页 > 初中教育 > 政史地

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

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