EDA简易数字频率计
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
湖北师范学院电工电子实验教学省级示范中心电子版实验报告
简易数字频率计的设计 一(实验
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
根据我们已经学习的有关Verilog的有关知识,如计数器、锁存器、扫
描器、译码器、分频器等,再根据频率的定义,我们来设计一个简易的数字
频率计,它的计数范围在0~99999999Hz之间,并让误差尽可能的小,因为
我们知道频率就是一秒内信号所重复的次数,所以根据这个定义我们很容易
想到它所用到的核心原理与模块。
二(方案设计
下面是简易数字频率计的设计思想框图:
这次设计的关键程序是0~99999999计数器,计数器对输入信号进行计数,然后通过1Hz精密时钟的控制,每1秒钟向显示数据缓冲Buffer(实质上是一个寄存器)中传一次数据,1Hz精密时钟又通过对Buffer的控制,让Buffer每隔1秒向扫描显示模块传输一次数据,扫描时钟控制显示模块的输出。此程序的1Hz精密时钟应做到十分准确,该时钟对门控电路(此实验中用与非门)的控制是与计数器的控制正好相反的,当计数器计数的数据传向Buffer时,门控电路因时钟
第2页,共11页
对与非门输入“1时”,输入被隔,输出为“0”,此时计数器不计数;当时钟对与非门输入“0时”,被测信号输入计数器,且在计数前,精密时钟已对计数器清零。这样不断反复,便可及时更新显示数据。
时钟频率为1Hz,即周期为1秒,使计数器在1秒内计数的次数即为被测信号的频率。
整体设计实现的方框图:
三(实验步骤
本实验我给出实验当中关键的几个模块的设计,它们分别如下所述:
1)my_99999999模块
此程序实现的方法一:
module my_99999999_2(clk,clr,q);
input clk,clr;
output [31:0]q;
reg [31:0]q;
always @(posedge clk or negedge clr)
begin
if(!clr) q=0;
else begin
if(q[3:0]<9) q[3:0]=q[3:0]+1;
else begin q[3:0]=0;
if(q[7:4]<9) q[7:4]=q[7:4]+1;
else begin q[7:4]=0;
if(q[11:8]<9) q[11:8]=q[11:8]+1;
else begin q[11:8]=0;
if(q[15:12]<9) q[15:12]=q[15:12]+1;
else begin q[15:12]=0;
if(q[19:16]<9) q[19:16]=q[19:16]+1;
else begin q[19:16]=0;
if(q[23:20]<9) q[23:20]=q[23:20]+1;
else begin q[23:20]=0;
if(q[27:24]<9) q[27:24]=q[27:24]+1;
else begin q[27:24]=0;
if(q[31:28]<9) q[31:28]=q[31:28]+1;
else q[31:28]=0;
end
end
end
end
end
end
end
end
end
endmodule
方法一仿真波形如下所示:
方法二:
module my_99999999(clk,clr,q);
input clk,clr;
output [31:0]q;
reg[31:0]q;
always@(posedge clk or negedge clr)
begin
if(!clr) q=0;
else if(q[3:0]<9) q[3:0]=q[3:0]+1;
else if (q[7:4]<9)begin q[7:4]=q[7:4]+1; q[3:0]=0;end else if (q[11:8]<9)begin q[11:8]=q[11:8]+1;q[7:4]=0;end else if (q[15:12]<9)begin q[15:12]=q[15:12]+1; q[11:8]=0;end else if (q[19:16]<9)begin q[19:16]=q[19:16]+1; q[15:12]=0;end else if (q[23:20]<9)begin q[23:20]=q[23:20]+1; q[19:16]=0;end else if (q[27:24]<9)begin q[27:24]=q[27:24]+1; q[23:20]=0;end else if (q[31:28]<9)begin q[31:28]=q[31:28]+1; q[27:24]=0;end
else q[31:28]=0;
end
endmodule
方法二仿真波形如下所示:
对比发现,方法二的程序显得更简单一些,但实际给出一样的仿真时间的时
而且方法一的思想显得很清晰,很候,方法二的编译比方法一的时间要长的多,
容易理解一些,总体思想就是,如果相邻低位小于9,则低位在每个时钟的上升沿
进行加1,而高位不变;反之,低位清0,高位加1.
2)分频器
24MHz分频为400Hz模块:
module zhuan24m_400hz(clk24m,clko); input clk24m;
output clko;
reg clko;
reg [15:0]count;
always@(posedge clk24m)
begin
if(count==60000) begin count=0;clko=1;end
else begin count=count+1; clko=0;end
end
endmodule
400Hz分频为1Hz 模块:
module zhuan400_1hz(clk400,clko); input clk400;
output clko;
reg clko;
reg [15:0]count;
always@(posedge clk400) begin
if(count==400) begin count=0;clko=1;end
else begin count=count+1; clko=0;end
end
endmodule
3)寄存器buffer模块
module buffer(qo,din,load); input[31:0] din;
input load;
output[31:0] qo;
reg[31:0] qo;
always @(posedge load) begin qo=din; end
endmodule
该模块的作用就是锁存每次99999999计数器送过来的数据,只在时钟的上升
沿将数据送到8选一数据选择器,然后再通过译码器进行输出。 4)8选一数据选择器模块:
module mux_8(m,sel,out);
input [2:0]sel;
input [31:0]m;
output [3:0]out;
wire [3:0]out;
assign out= (sel==0)? m[3:0]:
(sel==1)? m[7:4]:
(sel==2)? m[11:8]:
(sel==3)? m[15:12]:
(sel==4)? m[19:16]:
(sel==5)? m[23:20]:
(sel==6)? m[27:24]:
m[31:28]; endmodule
该8选一数据选择器的功能就是将输进来的数据Q按比特由高到底每4位送
个一个数码管,数码管也是由高到底进行显示的
5)译码模块:
module deled(in,a,b,c,d,e,f,g,dp); input [3:0]in;
output a,b,c,d,e,f,g,dp;
wire a,b,c,d,e,f,g,dp;
assign {dp,a,b,c,d,e,f,g} =
(in==4'b0000)? 8'b01111110 :
(in==4'b0001)? 8'b00110000 :
(in==4'b0010)? 8'b01101101 :
(in==4'b0011)? 8'b01111001 :
(in==4'b0100)? 8'b00110011 :
(in==4'b0101)? 8'b01011011 :
(in==4'b0110)? 8'b01011111 :
(in==4'b0111)? 8'b01110000 :
(in==4'b1000)? 8'b01111111 :
(in==4'b1001)? 8'b01111011 :
8'b00000000; Endmodule
6)扫描模块:
module scan(clr,clk,q);
input clk,clr;
output [2:0]q;
reg [2:0]q;
always @(posedge clk or negedge clr)
begin
if(!clr) q=0;
else q=q+1;
end
endmodule
7)消零模块
module myq_p(q,p);
input [31:0]q;
output [31:0]p;
reg [31:0]p;
always@(1)
begin
if(q[31:28]==0)begin p[31:28]=4'b1111;
if(q[27:24]==0)begin p[27:24]=4'b1111;
if(q[23:20]==0)begin p[23:20]=4'b1111;
if(q[19:16]==0)begin p[19:16]=4'b1111;
if(q[15:12]==0)begin p[15:12]=4'b1111;
if(q[11:8]==0)begin p[11:8]=4'b1111;
if(q[7:4]==0)begin p[7:4]=4'b1111;
if(q[3:0]==0) p[3:0]=4'b1111;
else p[3:0]=q[3:0];
end
else p[7:0]=q[7:0];
end
else p[11:0]=q[11:0];
end
else p[15:0]=q[15:0];
end
else p[19:0]=q[19:0];
end
else p[23:0]=q[23:0];
end
else p[27:0]=q[27:0];
end
else p=q;
end
endmodule
该程序是从高位到低位依次进行判断,凡是高位的0都把它灭掉,数据中间的0和尾部的0都照常显示。
四(结果分析
本实验所设计的简易数字频率计只能测量大于1Hz的方波信号,小于1的只能按1或0显示,这个频率计在测量达到十万Hz以上是会有20~30Hz的误差,而且只能测量方波,对于需要测量其它的波(如正弦波,三角波等)已不能满足,所以我们还有更多的功能有待改进。
五(
经验
班主任工作经验交流宣传工作经验交流材料优秀班主任经验交流小学课改经验典型材料房地产总经理管理经验
总结
我们需要对一些常见的测量仪器的一些简单的、基本的原理掌握清楚,然后根据我们已经学习的Verilog HDL 语言把它描述出来才是我们的能力,从这次实验当中,我觉得我们首先需要的是一种把所做的实验的原理框图转变成我们的verilog 语言,然后需要的一种能力就是把我们想到的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
画成一张原理框图,之后根据这个原理框图设计出我们的作品,只有熟练地做到这两步,我们才能创造出一些属于我们自己的东西。