FPGA4位十进制频率计Word格式.docx
《FPGA4位十进制频率计Word格式.docx》由会员分享,可在线阅读,更多相关《FPGA4位十进制频率计Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
黄色感叹符号代表有警告,有些警告可以忽略,绿色小勾表示综合成功。
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;