频率计实验报告频率计实验报告xx011014Word文件下载.docx
《频率计实验报告频率计实验报告xx011014Word文件下载.docx》由会员分享,可在线阅读,更多相关《频率计实验报告频率计实验报告xx011014Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
![频率计实验报告频率计实验报告xx011014Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-10/10/45a0799a-5e41-4037-a69f-a6c2f562ae8e/45a0799a-5e41-4037-a69f-a6c2f562ae8e1.gif)
③控制信号产生模块control.v:
通过1Hz时钟,产生频率计所需的使能信号en,同步清零信号reset,锁存信号la,生成一个3秒钟的频率计数周期;
④十分频模块div_10.v:
若量程选择信号sw_2为高电平,则待测信号需进行十分频;
⑤计数器模块counter.v:
频率计的核心部分,包括四位十进制计数器,以及对应七段译码器的译码器。
这里我把实验指导书中的译码模块整合在了里面,原因是认为在这个设计中单做一个译码模块意义不大,整合在里面翻倒方便一些;
⑥信号锁存模块lat.v:
当锁存信号la为高电平时,锁存输出持续显示;
⑦顶层模块div.v:
进行各分立模块的功能综合;
2模块分述
(1)待测信号产生模块
代码:
modulesignalinput(testmode,sysclk,sigin);
input[1:
0]testmode;
//00,01,10,11分别代表4种频率,分别为3125,6250,50,12500Hz,使用SW1~SW0来控制
inputsysclk;
//系统时钟50M
outputsigin;
//输出待测信号
reg[20:
0]state;
0]divide;
regsigin;
initial
begin
sigin=0;
state=21"
b[***********]000;
divide=21"
b000000_1111_1010_0000000;
end
always@(testmode)
case(testmode[1:
0])
2"
b00:
divide=21"
d16000;
//3125Hz
b01:
d8000;
//6250Hz
b10:
d1000000;
//50Hz
b11:
d4000;
//12500Hz
endcase
always@(posedgesysclk)//按divide分频
if(state==0)
sigin=~sigin;
state=state+21"
b0_00__0000_0000_0000_0000_10;
if(state==divide)
state=27"
b000_0000_0000_0000_0000_0000_0000;
endmodule
可以看出大致由两部分构成:
频率选择、分频。
通过testmode的值先进行选择所需的频率,然后进行分频。
(2)1Hz时钟产生模块
moduleclk_1hz(sysclk,clk);
outputclk;
regclk;
reg[31:
0]counter;
counter
clk
always@(posedgesysclk)
if(counter==32"
d24999999)
elsecounter
把实验板上的50MHz时钟进行50M倍分频,得到1Hz时钟。
(3)控制信号产生模块
modulecontrol(clk_1hz,en,reset,la);
inputclk_1hz;
outputen,reset,la;
reg[2:
0]state=3"
b000;
regen;
regreset;
regla;
parameters0=3"
b000,s1=3"
b001,s2=3"
b010;
always@(posedgeclk_1hz)
case(state)
s0:
begin
en
reset
la
state
s1:
s2:
通过1Hz时钟产生3个控制信号,用了一个简单的状态转移,在3秒周期内,第一秒使能信号en为高电平进行计数,第二三秒锁存信号为高电平,第三秒清零。
为了验证正确性,单独进行了仿真,波形图如下图
可见功能正确。
(4)十分频模块
modulediv_10(sigin,sw_2,sigout,led);
inputsigin,sw_2;
outputsigout,led;
regsigout;
reg[3:
always@(posedgesigin)begin
if(sw_2)begin
if(counter==4"
d4)begin
sigout
assignled=sw_2?
1:
0;
当sw_2信号为高电平时,对信号进行10分频,并使led信号为1。
(5)计数器模块
modulecounter(sigin,en,reset,clr,hex0,hex1,hex2,hex3);
inputsigin,en,reset,clr;
0]q0;
0]q1;
0]q2;
0]q3;
output[6:
0]hex0;
0]hex1;
0]hex2;
0]hex3;
always@(posedgesiginorposedgeresetornegedgeclr)begin
if(reset||(!
clr))begin
q0
q1
q2
q3
elseif(en)begin
if(q0==4"
d9)begin
if(q1==4"
if(q2==4"
elseq2
elseq1
elseq0
elsebegin{q0,q1,q2,q3}
assignhex0=(q0==4"
d0)?
7"
b1000000:
(q0==4"
d1)?
b1111001:
d2)?
b0100100:
d3)?
b0110000:
d4)?
b0011001:
d5)?
b0010010:
d6)?
b0000010:
d7)?
b1111000:
d8)?
b0000000:
d9)?
b0010000:
b0;
assignhex1=(q1==4"
(q1==4"
assignhex2=(q2==4"
(q2==4"
assignhex3=(q3==4"
(q3==4"