频率计实验报告_2010011014

数字逻辑与处理器基础

实验三 频率计

实验报告

实验目的:

掌握频率计的原理和设计方法。

实验工具:

1 Verilog语言

2 Quartus II 9.0

3 DE2实验板

实验设计:

1 总体思路以及模块总述

设计的基本思路是按照实验指导书上给出的原理图划分模块。

① 待测信号产生模块signalinput.v :由指导书给出,用于产生待测信号sigin ; ② 1Hz 时钟产生模块clk_1hz.v:通过实验板50MHz 产生1Hz 时钟clk_1hz;

③ 控制信号产生模块control.v :通过1Hz 时钟,产生频率计所需的使能信号en ,同步清零信号reset ,锁存信号la ,生成一个3秒钟的频率计数周期;

④ 十分频模块div_10.v:若量程选择信号sw_2为高电平,则待测信号需进行十分频; ⑤ 计数器模块counter.v :频率计的核心部分,包括四位十进制计数器,以及对应七段译码器的译码器。这里我把实验指导书中的译码模块整合在了里面,原因是认为在这个设计中单做一个译码模块意义不大,整合在里面翻倒方便一些;

⑥ 信号锁存模块lat.v :当锁存信号la 为高电平时,锁存输出持续显示; ⑦ 顶层模块div.v :进行各分立模块的功能综合;

2 模块分述

(1) 待测信号产生模块

代码:

module signalinput(testmode,sysclk,sigin);

input [1:0] testmode;//00,01,10,11分别代表4种频率,分别为3125,6250,50,12500Hz ,使用SW1~SW0来控制

input sysclk;//系统时钟50M

output sigin;//输出待测信号

reg[20:0] state;

reg[20:0] divide;

reg sigin;

initial

begin

sigin=0;

state=21'b[***********]000;

divide=21'b000000_1111_1010_0000000;

end

always@(testmode)

begin

case(testmode[1:0])

2'b00:divide=21'd16000; //3125Hz

2'b01:divide=21'd8000; //6250Hz

2'b10:divide=21'd1000000; //50Hz

2'b11:divide=21'd4000; //12500Hz

endcase

end

always@(posedge sysclk)//按divide 分频

begin

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;

end

endmodule

可以看出大致由两部分构成:频率选择、分频。通过testmode 的值先进行选择所需的频率,然后进行分频。

(2) 1Hz 时钟产生模块

代码:

module clk_1hz(sysclk,clk);

input sysclk;

output clk;

reg clk;

reg [31:0] counter;

initial

begin

counter

clk

end

always@(posedge sysclk)

begin

if(counter==32'd24999999)

begin

clk

counter

end

else counter

end

endmodule

把实验板上的50MHz 时钟进行50M 倍分频,得到1Hz 时钟。

(3) 控制信号产生模块

代码:

module control(clk_1hz,en,reset,la);

input clk_1hz;

output en,reset,la;

reg [2:0] state=3'b000;

reg en;

reg reset;

reg la;

parameter s0=3'b000,s1=3'b001,s2=3'b010;

always@(posedge clk_1hz)

begin

case(state)

s0:begin

en

reset

la

state

end

s1:begin

en

reset

la

state

end

s2:begin

la

reset

en

state

end

endcase

end

endmodule

通过1Hz 时钟产生3个控制信号,用了一个简单的状态转移,在3秒周期内,第一秒使能信号en 为高电平进行计数,第二三秒锁存信号为高电平,第三秒清零。为了验证正确性,单独进行了仿真,波形图如下图

可见功能正确。

(4) 十分频模块

代码:

module div_10(sigin,sw_2,sigout,led);

input sigin,sw_2;

output sigout,led;

reg sigout;

reg [3:0] counter;

always@(posedge sigin) begin

if(sw_2) begin

if(counter==4'd4) begin

sigout

counter

end

else counter

end

end

assign led=sw_2?1:0;

endmodule

当sw_2信号为高电平时,对信号进行10分频,并使led 信号为1。

(5) 计数器模块

代码:

module counter(sigin,en,reset,clr,hex0,hex1,hex2,hex3);

input sigin,en,reset,clr;

reg [3:0] q0;

reg [3:0] q1;

reg [3:0] q2;

reg [3:0] q3;

output [6:0] hex0;

output [6:0] hex1;

output [6:0] hex2;

output [6:0] hex3;

always@(posedge sigin or posedge reset or negedge clr) begin

if(reset||(!clr)) begin

q0

q1

q2

q3

end

else if(en) begin

if(q0==4'd9) begin

if(q1==4'd9) begin

if(q2==4'd9) begin

q3

q2

else q2

q1

else q1

q0

else q0

else begin {q0,q1,q2,q3}

assign hex0=(q0==4'd0)?7'b1000000:

(q0==4'd1)?7'b1111001:

(q0==4'd2)?7'b0100100:

(q0==4'd3)?7'b0110000:

(q0==4'd4)?7'b0011001:

(q0==4'd5)?7'b0010010:

(q0==4'd6)?7'b0000010:

(q0==4'd7)?7'b1111000:

(q0==4'd8)?7'b0000000:

(q0==4'd9)?7'b0010000:7'b0;

assign hex1=(q1==4'd0)?7'b1000000:

(q1==4'd1)?7'b1111001:

(q1==4'd2)?7'b0100100:

(q1==4'd3)?7'b0110000:

(q1==4'd4)?7'b0011001:

(q1==4'd5)?7'b0010010:

(q1==4'd6)?7'b0000010:

(q1==4'd7)?7'b1111000:

(q1==4'd8)?7'b0000000:

(q1==4'd9)?7'b0010000:7'b0;

assign hex2=(q2==4'd0)?7'b1000000:

(q2==4'd1)?7'b1111001:

(q2==4'd2)?7'b0100100:

(q2==4'd3)?7'b0110000:

(q2==4'd4)?7'b0011001:

(q2==4'd5)?7'b0010010:

(q2==4'd6)?7'b0000010:

(q2==4'd7)?7'b1111000:

(q2==4'd8)?7'b0000000:

(q2==4'd9)?7'b0010000:7'b0;

assign hex3=(q3==4'd0)?7'b1000000:

(q3==4'd1)?7'b1111001:

(q3==4'd2)?7'b0100100:

(q3==4'd3)?7'b0110000:

(q3==4'd4)?7'b0011001:

(q3==4'd5)?7'b0010010:

(q3==4'd6)?7'b0000010:

(q3==4'd7)?7'b1111000:

(q3==4'd8)?7'b0000000:

(q3==4'd9)?7'b0010000:7'b0;

endmodule

包含一个四位十进制计数部分,和译码器电路,同时包含同步清零reset 和异步清零clr 。

(6) 信号锁存模块

代码:module lat(la,h0,h1,h2,h3,hex0,hex1,hex2,hex3);

input la;

input [6:0] h0;

input [6:0] h1;

input [6:0] h2;

input [6:0] h3;

output [6:0] hex0;

output [6:0] hex1;

output [6:0] hex2;

output [6:0] hex3;

reg [6:0]hex0;

reg [6:0]hex1;

reg [6:0]hex2;

reg [6:0]hex3;

always@(la) begin

if(la) begin

hex0

hex1

hex2

hex3

end

else begin

hex0

hex1

hex2

hex3

end

end

endmodule

锁存信号la 低电平时输出透明,高电平时输出锁存。

(7) 顶层模块

代码:

module div(clock_50,clr,sw_0,sw_1,sw_2,led,hex0,hex1,hex2,hex3,led_1hz); input clock_50,clr,sw_0,sw_1,sw_2;

output led,led_1hz;

output [6:0] hex0;

output [6:0] hex1;

output [6:0] hex2;

output [6:0] hex3;

wire [1:0] a;

wire sigin,sigout,clk_1hz,en,reset,la;

wire [6:0] h0;

wire [6:0] h1;

wire [6:0] h2;

wire [6:0] h3;

wire x;

assign a = {sw_1,sw_0};

assign led_1hz=la;

signalinput sig_top(.testmode(a),.sysclk(clock_50),.sigin(sigin));

div_10 div_top(.sigin(sigin),.sw_2(sw_2),.sigout(x),.led(led));

clk_1hz clk_top(.sysclk(clock_50),.clk(clk_1hz));

assign sigout=sw_2?x:sigin;

control

control_top(.clk_1hz(clk_1hz),.en(en),.reset(reset),.la(la));

counter

counter_top(.sigin(sigout),.en(en),.reset(reset),.clr(clr),.hex0(h0),.hex1(h1),.hex2(h2),.hex3(h3));

lat

lat_top(.la(la),.h0(h0),.h1(h1),.h2(h2),.h3(h3),.hex0(hex0),.hex1(hex1),.hex2(hex2),.hex3(hex3));

endmodule

把所有模块进行串联,中间根据sw_2选择是否进行十分频。

顶层模块的RTL 级电路图如下:

问题及解决办法

1 十分频判断问题

待测信号是否需要十分频依据sw_2信号的判断,我开始把判断语句写在了十分频always 语句的里面,如:

always@(posegdge sigin) begin

if(!sw_2) sigout

else 十分频...

end

这样导致输出信号无变化,后来发现原因是sigout 每次被sigin 赋值时,均在sigin 上升沿,所以无变化。解决办法是在十分频模块中增加一个wire 信号进行判断,或者把判断放在顶层模块中,我选择后者。

2 十进制问题

十进制数是4位二进制代表1位十进制,我开始把十进制数写成了1’d1,使十进制数只有1位被表示出来,故十进制变成了二进制。

3 reg 声明问题

声明寄存器时需要写上位数如:reg [6:0] hex1; 没有带位数时,只给hex1赋了最低位,导致七段译码器前两位为无输入状态“88”。并且此时变异不报错,只能从警告中查出,经老师指出改正后正常。

心得收获

本次实验涉及了之前实验中的内容并且进行了综合,我在开始设计时并没有仔细分析信号的变化过程,导致出现了很多低级错误,如问题1,在以后的设计中需要更加稳健。

数字逻辑与处理器基础

实验三 频率计

实验报告

实验目的:

掌握频率计的原理和设计方法。

实验工具:

1 Verilog语言

2 Quartus II 9.0

3 DE2实验板

实验设计:

1 总体思路以及模块总述

设计的基本思路是按照实验指导书上给出的原理图划分模块。

① 待测信号产生模块signalinput.v :由指导书给出,用于产生待测信号sigin ; ② 1Hz 时钟产生模块clk_1hz.v:通过实验板50MHz 产生1Hz 时钟clk_1hz;

③ 控制信号产生模块control.v :通过1Hz 时钟,产生频率计所需的使能信号en ,同步清零信号reset ,锁存信号la ,生成一个3秒钟的频率计数周期;

④ 十分频模块div_10.v:若量程选择信号sw_2为高电平,则待测信号需进行十分频; ⑤ 计数器模块counter.v :频率计的核心部分,包括四位十进制计数器,以及对应七段译码器的译码器。这里我把实验指导书中的译码模块整合在了里面,原因是认为在这个设计中单做一个译码模块意义不大,整合在里面翻倒方便一些;

⑥ 信号锁存模块lat.v :当锁存信号la 为高电平时,锁存输出持续显示; ⑦ 顶层模块div.v :进行各分立模块的功能综合;

2 模块分述

(1) 待测信号产生模块

代码:

module signalinput(testmode,sysclk,sigin);

input [1:0] testmode;//00,01,10,11分别代表4种频率,分别为3125,6250,50,12500Hz ,使用SW1~SW0来控制

input sysclk;//系统时钟50M

output sigin;//输出待测信号

reg[20:0] state;

reg[20:0] divide;

reg sigin;

initial

begin

sigin=0;

state=21'b[***********]000;

divide=21'b000000_1111_1010_0000000;

end

always@(testmode)

begin

case(testmode[1:0])

2'b00:divide=21'd16000; //3125Hz

2'b01:divide=21'd8000; //6250Hz

2'b10:divide=21'd1000000; //50Hz

2'b11:divide=21'd4000; //12500Hz

endcase

end

always@(posedge sysclk)//按divide 分频

begin

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;

end

endmodule

可以看出大致由两部分构成:频率选择、分频。通过testmode 的值先进行选择所需的频率,然后进行分频。

(2) 1Hz 时钟产生模块

代码:

module clk_1hz(sysclk,clk);

input sysclk;

output clk;

reg clk;

reg [31:0] counter;

initial

begin

counter

clk

end

always@(posedge sysclk)

begin

if(counter==32'd24999999)

begin

clk

counter

end

else counter

end

endmodule

把实验板上的50MHz 时钟进行50M 倍分频,得到1Hz 时钟。

(3) 控制信号产生模块

代码:

module control(clk_1hz,en,reset,la);

input clk_1hz;

output en,reset,la;

reg [2:0] state=3'b000;

reg en;

reg reset;

reg la;

parameter s0=3'b000,s1=3'b001,s2=3'b010;

always@(posedge clk_1hz)

begin

case(state)

s0:begin

en

reset

la

state

end

s1:begin

en

reset

la

state

end

s2:begin

la

reset

en

state

end

endcase

end

endmodule

通过1Hz 时钟产生3个控制信号,用了一个简单的状态转移,在3秒周期内,第一秒使能信号en 为高电平进行计数,第二三秒锁存信号为高电平,第三秒清零。为了验证正确性,单独进行了仿真,波形图如下图

可见功能正确。

(4) 十分频模块

代码:

module div_10(sigin,sw_2,sigout,led);

input sigin,sw_2;

output sigout,led;

reg sigout;

reg [3:0] counter;

always@(posedge sigin) begin

if(sw_2) begin

if(counter==4'd4) begin

sigout

counter

end

else counter

end

end

assign led=sw_2?1:0;

endmodule

当sw_2信号为高电平时,对信号进行10分频,并使led 信号为1。

(5) 计数器模块

代码:

module counter(sigin,en,reset,clr,hex0,hex1,hex2,hex3);

input sigin,en,reset,clr;

reg [3:0] q0;

reg [3:0] q1;

reg [3:0] q2;

reg [3:0] q3;

output [6:0] hex0;

output [6:0] hex1;

output [6:0] hex2;

output [6:0] hex3;

always@(posedge sigin or posedge reset or negedge clr) begin

if(reset||(!clr)) begin

q0

q1

q2

q3

end

else if(en) begin

if(q0==4'd9) begin

if(q1==4'd9) begin

if(q2==4'd9) begin

q3

q2

else q2

q1

else q1

q0

else q0

else begin {q0,q1,q2,q3}

assign hex0=(q0==4'd0)?7'b1000000:

(q0==4'd1)?7'b1111001:

(q0==4'd2)?7'b0100100:

(q0==4'd3)?7'b0110000:

(q0==4'd4)?7'b0011001:

(q0==4'd5)?7'b0010010:

(q0==4'd6)?7'b0000010:

(q0==4'd7)?7'b1111000:

(q0==4'd8)?7'b0000000:

(q0==4'd9)?7'b0010000:7'b0;

assign hex1=(q1==4'd0)?7'b1000000:

(q1==4'd1)?7'b1111001:

(q1==4'd2)?7'b0100100:

(q1==4'd3)?7'b0110000:

(q1==4'd4)?7'b0011001:

(q1==4'd5)?7'b0010010:

(q1==4'd6)?7'b0000010:

(q1==4'd7)?7'b1111000:

(q1==4'd8)?7'b0000000:

(q1==4'd9)?7'b0010000:7'b0;

assign hex2=(q2==4'd0)?7'b1000000:

(q2==4'd1)?7'b1111001:

(q2==4'd2)?7'b0100100:

(q2==4'd3)?7'b0110000:

(q2==4'd4)?7'b0011001:

(q2==4'd5)?7'b0010010:

(q2==4'd6)?7'b0000010:

(q2==4'd7)?7'b1111000:

(q2==4'd8)?7'b0000000:

(q2==4'd9)?7'b0010000:7'b0;

assign hex3=(q3==4'd0)?7'b1000000:

(q3==4'd1)?7'b1111001:

(q3==4'd2)?7'b0100100:

(q3==4'd3)?7'b0110000:

(q3==4'd4)?7'b0011001:

(q3==4'd5)?7'b0010010:

(q3==4'd6)?7'b0000010:

(q3==4'd7)?7'b1111000:

(q3==4'd8)?7'b0000000:

(q3==4'd9)?7'b0010000:7'b0;

endmodule

包含一个四位十进制计数部分,和译码器电路,同时包含同步清零reset 和异步清零clr 。

(6) 信号锁存模块

代码:module lat(la,h0,h1,h2,h3,hex0,hex1,hex2,hex3);

input la;

input [6:0] h0;

input [6:0] h1;

input [6:0] h2;

input [6:0] h3;

output [6:0] hex0;

output [6:0] hex1;

output [6:0] hex2;

output [6:0] hex3;

reg [6:0]hex0;

reg [6:0]hex1;

reg [6:0]hex2;

reg [6:0]hex3;

always@(la) begin

if(la) begin

hex0

hex1

hex2

hex3

end

else begin

hex0

hex1

hex2

hex3

end

end

endmodule

锁存信号la 低电平时输出透明,高电平时输出锁存。

(7) 顶层模块

代码:

module div(clock_50,clr,sw_0,sw_1,sw_2,led,hex0,hex1,hex2,hex3,led_1hz); input clock_50,clr,sw_0,sw_1,sw_2;

output led,led_1hz;

output [6:0] hex0;

output [6:0] hex1;

output [6:0] hex2;

output [6:0] hex3;

wire [1:0] a;

wire sigin,sigout,clk_1hz,en,reset,la;

wire [6:0] h0;

wire [6:0] h1;

wire [6:0] h2;

wire [6:0] h3;

wire x;

assign a = {sw_1,sw_0};

assign led_1hz=la;

signalinput sig_top(.testmode(a),.sysclk(clock_50),.sigin(sigin));

div_10 div_top(.sigin(sigin),.sw_2(sw_2),.sigout(x),.led(led));

clk_1hz clk_top(.sysclk(clock_50),.clk(clk_1hz));

assign sigout=sw_2?x:sigin;

control

control_top(.clk_1hz(clk_1hz),.en(en),.reset(reset),.la(la));

counter

counter_top(.sigin(sigout),.en(en),.reset(reset),.clr(clr),.hex0(h0),.hex1(h1),.hex2(h2),.hex3(h3));

lat

lat_top(.la(la),.h0(h0),.h1(h1),.h2(h2),.h3(h3),.hex0(hex0),.hex1(hex1),.hex2(hex2),.hex3(hex3));

endmodule

把所有模块进行串联,中间根据sw_2选择是否进行十分频。

顶层模块的RTL 级电路图如下:

问题及解决办法

1 十分频判断问题

待测信号是否需要十分频依据sw_2信号的判断,我开始把判断语句写在了十分频always 语句的里面,如:

always@(posegdge sigin) begin

if(!sw_2) sigout

else 十分频...

end

这样导致输出信号无变化,后来发现原因是sigout 每次被sigin 赋值时,均在sigin 上升沿,所以无变化。解决办法是在十分频模块中增加一个wire 信号进行判断,或者把判断放在顶层模块中,我选择后者。

2 十进制问题

十进制数是4位二进制代表1位十进制,我开始把十进制数写成了1’d1,使十进制数只有1位被表示出来,故十进制变成了二进制。

3 reg 声明问题

声明寄存器时需要写上位数如:reg [6:0] hex1; 没有带位数时,只给hex1赋了最低位,导致七段译码器前两位为无输入状态“88”。并且此时变异不报错,只能从警告中查出,经老师指出改正后正常。

心得收获

本次实验涉及了之前实验中的内容并且进行了综合,我在开始设计时并没有仔细分析信号的变化过程,导致出现了很多低级错误,如问题1,在以后的设计中需要更加稳健。


相关内容

  • 波形发生实验报告
  • 苏州科技学院实验报告 课程名称: 模拟电子技术 实验项目名称: 运放应用----波形发生器 学生姓名: 专业班级: 学号: 实验日期: 2012.12.13 一.实验目的 1.学习用集成运放构成方波.三角波和文氏正弦波发生器 2.学习波形发生器的调整和主要性能指标的测试方法 二.实验内容 1.方波发 ...

  • 实验3 频率测量及其误差分析实验报告
  • 电子测量实验报告 实验三 频率测量及其误差分析 院系:信息工程学院 班级:08电子信息工程一班 学号:2008550406 姓名:陈茜茜 实验三 频率测量及其误差分析 一.实验目的 1 掌握数字式频率计的工作原理: 2 熟悉并掌握各种频率测量方法: 3 理解频率测量误差的成因和减小测量误差的方法. ...

  • [电磁场微波技术与天线]实验指导书
  • 自编教材 <电磁场微波技术与天线>实验指导书 长沙学院电子与通信工程系 二0一一年九月 实验一 谐振腔法测量微波频率(3学时) 一.实验目的 1.熟悉和了解微波测试系统的基本组成和工作原理. 2.掌握微波测试系统各组件的调整和使用方法. 3.掌握谐振腔法测频率的原理. 二.实验框图及器材 ...

  • 通信原理实验报告
  • 北京联合大学 通信原理实验报告 学 院: 信息学院 专 业: 通信工程 课 程: 通信原理 班 级: 姓 名: 学 号: 年 月 日 成 绩: 实验一 滤波器使用及参数设计 FIR低通滤波器 ㈠ 实验电路图 ㈡ 参数设置 输入信号(部件0,1,2):幅度1V,频率10Hz,1000Hz,2000Hz ...

  • 射频实验报告
  • 射频电路实验报告 学 专 学 生指 导 学年第学期 院: 信息与通信工程学院 业: 电子信息科学与技术 姓 名: 学 号: 教 师: 李永红 日期: 2012 年10 月28日 实验一 滤波器设计 一. 实验目的 (1) 掌握基本的低通和带通滤波器的设计方法. (2) 学会使用微波软件对低通和高通滤 ...

  • 信号实验报告
  • 信号调理电路--有源滤波器的设计 一.实验目的 1.掌握信号调理电路--有源滤波电路的快速设计方法. 2.掌握信号调理电路--有源滤波电路的调试及其频率特性.频谱特性的测试.分析方法. 二.设计任务 1.在一工程现场进行信号检测时,对现场采集的信号要进行滤波调理,只需要其中频率为1KHz 的信号,其 ...

  • 通信电子电路实验报告
  • 实验二 振幅调制器 一.实验目的: 1.掌握用集成模拟乘法器实现全载波调幅和抑止载波双边带调幅的方法. 2.研究已调波与调制信号及载波信号的关系. 3.掌握调幅系数测量与计算的方法. 4.通过实验对比全载波调幅和抑止载波双边带调幅的波形. 二.实验内容: 1.调测模拟乘法器MC1496正常工作时的静 ...

  • 核磁共振实验报告
  • 核 磁 共 振 实验仪器 FD-CNMR-I型核磁共振实验仪,包括永久磁铁.射频边限振荡器.探头.样品.频率计.示波器 实验原理 FD-CNMR-I型核磁共振实验仪采用永磁铁,B0是定值,所以对不同的样品,通过扫频法调节射频场的频率使之达到共振频率0,满足共振条件,核即从低能态跃迁至高能态,同时吸 ...

  • 浙江大学实验报告模板
  • 实验报告 课程名称:材料科学与工程基础实验 指导老师: 李雷 成绩:__________________ 实验名称: 介电材料电学性能 实验类型: 同组学生姓名: 13组 一.实验目的和要求(必填) 三.主要仪器设备(必填) 五.实验数据记录和处理 七.讨论.心得 二.实验内容和原理(必填) 四.操 ...