东北大学EDA数字系统设计课件第四章改.ppt
第4章 典型数字系统分析与设计,数字系统概述数码管动态显示扫描电路原理及设计乘法器的原理及设计除法器的原理及设计方法简易CPU工作原理及设计方法交通信号灯控制器原理及设计数字频率计的原理及设计数字信号发生器的原理及设计,4.1 数字系统概述,采用数字电子技术实现数字信息处理、传输、控制的数字逻辑单元集合称为数字系统。,数字系统一般包括数据处理器和控制器两个部分,数据处理器由寄存器和组合电路组成。寄存器用于暂存信息。组合电路实现对数据的加工和处理。在一个操作步骤,控制器发出命令信号给数据处理器,数据处理器完成命令信号所规定的操作。在下一个操作步骤,控制器发出另外一组命令信号,命令数据处理器完成相应的操作。通过多步操作(操作序列),数字系统完成一个操作任务,控制器接收数据处理器的状态信息及外部输入来选择下一个操作步骤。,控制器决定数据处理器的操作和操作序列。控制器决定操作步骤,可以记忆当前步骤,也可以确定下一步骤,因此控制器中包含存储器,用来记忆操作步骤,及时根据外部输入和数据处理器的状态信息来确定下一个操作步骤。,控制器,数据处理器,外输入,控制信息,状态信息,输入数据,输出数据,无论数据处理器还是控制器都是根据其功能特点来划分的,归根结底是由数字电路构成的。一个实际的数字系统可能简单也可能复杂。如果一个数字系统没有控制器,通常称其为子系统,一个复杂数字系统可能由多个子系统构成。,4.2 数码管动态显示扫描电路原理及设计,4.2.1 数码管动态显示扫描电路原理,数码管显示器具有显示直观,亮度好,显示寿命长、控制电路简单等优点,因此,在数字系统中数码管显示器被广泛应用。根据数码管的结构,可分为共阳数码管和共阴数码管。为了驱动相应的数码管需要选择对应的七段译码器。就可以构成显示电路,但是这种电路需要为每一个数码管提供一个七段译码器,这种结构的电路称之为静态显示电路。其优点是显示电路具有结构简单,可以无限扩展的特点。缺点是随着显示位数增加,所需要的七段译码器太多,并且所有的数码管都处于常亮的状态,显示亮度不可控制,这样既增加了显示电路的成本,也增加了显示器的功耗,也降低了显示器的使用寿命。,用一个七段译码器实现多位数码管显示电路的电路,该结构的电路通常称为动态显示电路。优点是节省了七段译码器的使用数量,这种显示电路是根据分时显示的原理设计的。在同一时间,仅有一位数码管处于显示状态,如果在人的视觉暂留时间内,每个数码管都被点亮至少一次,就可以看到全部数码管都同时点亮的效果。只要适当的调整扫描时钟频率,就可以实现这样的功能。缺点是增加了位译码器、扫描计数器和数据选择器。在数码管的数量较多时,该电路要比静态显示电路节省许多硬件资源。,设有n位数码管,人的视觉暂留时间约为20ms,则扫描时钟频率fs为,4.2.2 采用Verilog HDL描述的动态显示扫描电路,module top(clk,x0,x1,x2,x3,x4,x5,x6,x7,segment,y);input clk;/扫描时钟input 3:0 x0,x1,x2,x3,x4,x5,x6,x7;/显示数据output 6:0 segment;/数码管的段码output 7:0 y;/数码管的位码wire 2:0 temp;wire 3:0 muxout;counter u0(.clk(clk),.q(temp);/扫描计数器decoder138 u1(.a(temp0),.b(temp1),.c(temp2),.sel(y);/位码译码器mux32_4 u2(.x0(x0),.x1(x1),.x2(x2),.x3(x3),.x4(x4),.x5(x5),.x6(x6),.x7(x7),.sel(temp),.mux_out(muxout);/输入数据选择器t7_seg u3(.hex(muxout),.segment(segment);/显示段译码器endmodule,顶层模块逻辑图,扫描计数器,位码译码器,输入数据选择器,显示段译码器,module counter(input clk,inout 2:0 q);reg 2:0 qtemp;assign q=qtemp;always(posedge clk)qtemp=qtemp+3d1;endmodule,三位二进制计数器元件,module mux32_4(input 3:0 x0,input 3:0 x1,input 3:0 x2,input 3:0 x3,input 3:0 x4,input 3:0 x5,input 3:0 x6,input 3:0 x7,input 2:0 sel,output 3:0 mux_out);reg 3:0 muxout;assign mux_out=muxout;always(sel,x0,x1,x2,x3,x4,x5,x6,x7)case(sel)3b000:muxout=x0;3b001:muxout=x1;3b010:muxout=x2;3b011:muxout=x3;3b100:muxout=x4;3b101:muxout=x5;3b110:muxout=x6;3b111:muxout=x7;default:muxout=4d0;endcaseendmodule,32选4的数据选择器元件,module decoder138(input a,input b,input c,output 7:0 sel);reg 7:0 seltemp;wire 2:0 d_in;assign sel=seltemp;assign d_in=c,b,a;always(d_in)case(d_in)3b000:seltemp=8b00000010;3b010:seltemp=8b00000100;3b011:seltemp=8b00001000;3b100:seltemp=8b00010000;3b101:seltemp=8b00100000;3b110:seltemp=8b01000000;3b111:seltemp=8b10000000;default:seltemp=8b00000000;endcaseendmodule,3线-8线译码器元件,module t7_seg(input 3:0 hex,output 6:0 segment);reg 6:0 segmenttemp;assign segment=segmenttemp;always(hex)case(hex)4b0001:segmenttemp=7b1111001;4b0010:segmenttemp=7b0100100;4b0011:segmenttemp=7b0110000;4b0100:segmenttemp=7b0011001;4b0101:segmenttemp=7b0010010;4b0110:segmenttemp=7b0000010;4b0111:segmenttemp=7b1111000;4b1000:segmenttemp=7b0000000;4b1001:segmenttemp=7b0010000;default:segmenttemp=7b1000000;endcaseendmodule,七段显示译码器元件,4.3 乘法器的原理及设计,乘法器工作原理,乘法器的一般计算过程,4.3.2 采用Verilog HDL描述的乘法器,其中乘数b被送到串行输出的移位寄存器,被乘数a与等宽的0被送到与积具有相同位宽的并行输出移位寄存器中。状态控制用于控制数据输出时间。,根据上面乘法器结构图,可以编写如下的4x4 乘法器的Verilog HDL程序,module multiplier(a,b,clk,load,p);input 3:0 a,b;input clk;input load;output 7:0 p;reg 7:0 at,pp;reg 3:0 bt;reg 1:0 state;reg 7:0 ptemp;assign p=ptemp;,时序乘法器,always(posedge clk)begin if(load=1b1)begin at=4b0000,a;bt=b;state=2b00;pp=8b00000000;end else begin state=state+2b1;if(bt0=1b1)pp=pp+at;bt=1b0,bt3:1;at=at6:0,1b0;endend,用并置方法对被乘数进行位扩展,状态计数清零,部分积清零,产生位积并累加,乘数左移,被乘数右移,always(state)begin if(state=2b00)ptemp=pp;endendmodule,目前,很多EDA综合系统均支持乘法器的行为描述方式,即直接使用运算符“*”来完成。,module multicom(a,b,p);input 3:0 a;input 3:0 b;output7:0 p;assign p=a*b;endmodule,组合乘法器的描述方式,4.4 除法器的原理及设计方法,4.4.1 除法器的工作原理,从前面的乘法器介绍可知4x4位乘法器的积是一个8位二进制数,因此,4位除法器应该是一个8位二进制数除以一个4位二进制数。采用的方法是依次从被除数的高位中减去除数,如果不够减,除数右移,直到够减为止。当余数小于除数时则完成除法运算。从除法运算过程可以看出,其主要是移位相减的操作。,这里用左移被除数代替右移除数的操作,并把商直接存储到被除数的空余位中,省去了存储商的寄存器。因此被除数寄存器扩展为9位移位寄存器。,Sh是移位信号,在时钟上升沿控制被除数寄存器左移一位;Su是把减法器的结果装入被除数寄存器的X8、X7、X6、X5、X4和时钟的上升沿置商的最低位为“1”的控制信号,St是除法运算启动信号,Ov是除法器溢出标志信号。,除法器控制电路状态图,S0(停止),S1,S2,S5,S4,S3,St/0,St/load,C/OV,C/Sh,C/Su,C/Sh,C/Su,C/Sh,C/Su,C/Sh,C/Su,C/0,当启动信号St=1时,启动除法器工作,产生Load信号,装载被除数寄存器和除数寄存器。如果C=1,除法溢出,除法器停止工作,溢出标志OV输出有效;如果C=0,将发生第一次移位操作,控制电路转到状态S2。然后,如果C=1,执行减法操作,减法操作完成后,C将保持为“0”,保证在下一次时钟有效时产生移位操作。这个过程将直到完成4次移位操作结束,控制状态转到S5。最后,如果C=1,执行最后一次减法运算,否则,不做减法运算。这时没有移位操作要求,控制电路回到停止状态S0。在这里假设启动信号St为高有效,并且仅持续一个时钟周期,在完成全部操作前,启动信号St将一直保持为低电平。,4.4.2 用Verilog HDL描述的除法器,参考程序,module divider(dividend_in,divisor,st,clk,quotient,remainder,overflow);input 7:0 dividend_in;input 3:0 divisor;input st;input clk;output 3:0 quotient;output 3:0 remainder;output overflow;reg 2:0 state,nextstate;reg load,su,sh;wire c;wire 4:0 subout;reg 8:0dividend;reg overflowtemp;assign overflow=overflowtemp;assign subout=dividend8:4-1b0,divisor;assign c=subout4;assign remainder=dividend7:4;assign quotient=dividend3:0;,减法器,分离出余数,分离出商,always(state,st,c)beginload=1b0;overflowtemp=1b0;sh=1b0;su=1b0;case(state)3d0:if(st=1b1)begin load=1b1;nextstate=3d1;end else nextstate=3d0;3d1:if(c=1b1)begin overflowtemp=1b1;nextstate=3d0;end else begin sh=1b1;nextstate=3d2;end,3d2,3d3,3d4:if(c=1b1)beginsu=1b1;nextstate=state;end else beginsh=1b1;nextstate=state+3d1;end3d5:beginif(c=1b1)su=1b1;nextstate=3d0;endendcaseend,启动除法运算,溢出判断,状态2、3、4:实现除法运算,结束运算过程,返回初始态,always(posedge clk)beginstate=nextstate;if(load=1b1)dividend=1b0,dividend_in;if(su=1b1)begindividend8:4=subout;dividend0=1b1;endif(sh=1b1)dividend=dividend7:0,1b0;endendmodule,4.5简易CPU工作原理及设计方法,4.5.1 简易CPU的工作原理,4个n位寄存器R0、R1、R2、R3,ALU算术逻辑单元,控制单元,基本操作,Rx和Ry代表R0-R3的任意寄存器,Rx和Ry代表寄存器Rx和Ry中的内容Load操作是把数据总线输入的数据Data传输到内部寄存器Rx,Move操作完成把寄存器Ry的内容传输到寄存器Rx的操作。,Load操作和Move操作都是单周期指令,仅需一个时钟周期(1个Clock)。加法和减法操作需要三个时钟周期。第一个时钟周期把寄存器Rx的内容传输到寄存器A,第二个时钟周期把寄存器Ry的内容传输到内部总线Bus上,然后ALU执行加法或减法操作,并把结果存储到寄存器G。第三个时钟周期把寄存器G的内容传输到寄存器Rx。,状态控制电路,加法和减法所需的时钟周期最长,因此,设计控制电路至少需要有四个状态T0、T1、T2、T3,其中T0状态表示没有任何操作的状态,即初始状态。T1对应各种操作的第一步,T2、T3则分别对应加法和减法器的第二步和第三步。用4进制计数器实现4个状态转换控制,用2-4译码器对这4个状态进行译码,产生相应的控制信号。,功能编码状态译码器,用6位二进制编码表示的不同操作。这些编码就是功能码,也被称为指令编码,最左边两位二进制数代码F(f1,f0)可以组成4组不同的代码,分别表示4种不同的操作。设f1f0=00,01,10,11分别表示Load,Move,Add,Sub四种操作。Rx1Rx0表示操作数Rx的编码,而Ry1Ry0表示操作数Ry的编码。当功能码输入信号FRin有效时,6位功能码被存储到一个6位功能寄存器中。,4.5.2 采用Verilog HDL描述的ALU,思路:首先需要设计4进制计数器作为状态控制器单元,2-4译码器电路作为状态译码单元,8位寄存器电路作为ALU内部寄存器单元,然后对这些基本单元进行元件例化,在ALU的主程序中引用。,参考程序,module upcount(clock,clear,q);input clock;input clear;inout 1:0 q;reg 1:0 qtemp;assign q=qtemp;always(posedge clock)beginif(clear=1b1)qtemp=2b00;elseqtemp=qtemp+2b01;endendmodule,4进制计数器模块,2-4译码器电路模块,module dec2to4(w,en,y);input 1:0 w;input en;output 0:3 y;reg 3:0 ytemp;reg 2:0 enw;assign y=ytemp;always(en or w)beginenw=en,w;case(enw)3b100:ytemp=4b1000;3b101:ytemp=4b0100;3b110:ytemp=4b0010;3b111:ytemp=4b0001;default:ytemp=4b0000;endcaseendendmodule,ALU内部8位寄存器模块,module regn#(parameter n=8)(r,rin,clock,q);input n-1:0 r;input rin;input clock;inout n-1:0 q reg n-1:0 qtemp;assign q=qtemp;always(posedge clock)beginif(rin=1b1)qtemp=r;endendmodule,ALU顶层模块,module proc#(parameter n=8)(data,reset,w,clock,f,rx,ry,done,buswires);input 7:0 data;input reset;input w;input clock;input 1:0 f;input 1:0 rx;input 1:0 ry;inout done;inout 7:0 buswires;,wire 1:0 zero,t,i;wire high,clear,frin;wire 1:6 func,funcreg,sel;wire 7:0 sum;reg 0:3 x,y,rin,rout;reg addsub;reg extern,ain,gin,gout;reg 1:0 count;reg 7:0 r0,r1,r2,r3;reg 7:0 a,g;reg buswirestemp;reg donetemp;,外部端口,内部信号,assign done=donetemp;assign buswire=buswirestemp;assign zero=2b00;assign high=1b1;assign clear=reset|done|(w,always(t or i or x or y)beginextern=1b0;donetemp=1b0;ain=1b0;gin=1b0;gout=1b0;addsub=1b0;rin=4b0000;rout=4b0000;case(t)2b01:case(i)2b00:begin extern=1b1;rin=x;donetemp=1b1;end 2b01:begin rout=y;rin=x;donetemp=1b1;end default:begin rout=x;ain=1b1;end endcase,2b10:case(i)2b10:begin rout=y;gin=1b1;end 2b11:beginrout=y;addsub=1b1;gin=1b1;enddefault:;endcasedefault:begin gout=1b1;rin=x;donetemp=1b1;endendcaseend,always(sel)case(sel)6b100000:buswirestemp=r0;6b010000:buswirestemp=r1;6b001000:buswirestemp=r2;6b000100:buswirestemp=r3;6b000100:buswirestemp=g;default:buswirestemp=data;endcaseendmodule,4.6 交通信号灯控制器原理及设计,4.6.1 交通信号灯控制器原理,S0主路通行期,S3支路过渡期,S1主路过渡期,S2支路通行期,定时T1未到,定时T1到,定时T2未到,定时T2到,定时T3未到,定时T3到,定时Tm未到,定时Tm到,控制器原理框图,1.状态控制电路,用S0=00表示主路通行状态,用S1=01表示主路过渡状态、用S2=11表示次干道通行状态,用S3=10表示次干道过渡状态。,JK触发器的状态转换表,定时控制信号与控制状态逻辑关系表,用EL、ES、EM表示定时器Tl、Ts、Tm的定时控制信号,2.定时电路,在定时电路中,若输入时钟的频率为1Hz信号,根据定时时间Tl、Ts、Tm的长短,设计相应的计数器既可以实现定时电路,并且每个计数器应该受到状态定时控制电路所控制。,3.译码电路,译码电路真值表,4.6.2 交通信号灯的Verilog HDL描述,参考程序,假设定时器Tl、Ts、Tm的定时时间分别为45s、25s和5s,定时器输入时钟频率为1Hz。此处只给出45s定时器的参考程序。,45s定时器模块,module coun45(clk,el,l);input clk;input el;output l;reg l_buffer;reg 5:0 q;assign l=l_buffer;always(posedge clk)beginif(el=1b1)if(q=6d44)beginq=6d0;l_buffer=1b1;endelsebeginq=q+6d1;l_buffer=1b0;endendendmodule,状态控制器模块,module control_state(clk,l,s,m,el,es,em,q);input clk;input l;input s;input m;output el;output es;output em;output 1:0 q;reg 1:0 state;reg el_buffer,es_buffer,em_buffer;assign q=state;assign el=el_buffer;assign es=es_buffer;assign em=em_buffer;,always(posedge clk)case(state)2b00:if(l=1b1)begin state=2b01;em_buffer=1b1;end else em_buffer=1b0;2b01:if(m=1b1)beginstate=2b11;es_buffer=1b1;end else es_buffer=1b0;,2b11:if(s=1b1)begin state=2b10;em_buffer=1b1;end elseem_buffer=1b0;2b10:if(m=1b1)begin state=2b00;el_buffer=1b1;end else el_buffer=1b0;default:;endcaseendmodule,输出译码器模块,module decoder(qin,m_r_g_y,s_r_g_y);input 1:0 qin;output 2:0 m_r_g_y;output 2:0 s_r_g_y;reg 2:0 mrgy,srgy;assign m_r_g_y=mrgy;assign s_r_g_y=srgy;,主路输出驱动信号,依次为红灯、绿灯、黄灯,支路输出驱动信号,依次为红灯、绿灯、黄灯,always(qin)case(qin)2b00:beginmrgy=3b010;srgy=3b100;end2b01:beginmrgy=3b001;srgy=3b100;end2b10:beginmrgy=3b100;srgy=3b001;end,2b11:beginmrgy=3b100;srgy=3b010;enddefault:;endcaseendmodule,交通信号灯控制器顶层模块,module top(clk,m_r_g_y,s_r_g_y);input clk;output 2:0 m_r_g_y;output 2:0 s_r_g_y;reg tel,tes,tem,tl,ts,tm;reg1:0 state;coun45 u0(.clk(clk),.el(tel),.l(tl);coun25 u1(.clk(clk).es(tes),.s(ts);coun5 u2(.clk(clk),.em(tem),.m(tm);control_state u3(clk(clk),.l(tl),.s(ts),.m(tm),.el(tel),.es(tes),.em(tem),.q(state);decoder u4(.qin(state),.m_r_g_y(m_r_g_y),.s_r_g_y(s_r_g_y);endmodule,实现各个底层模块的例化,4.7 数字频率计的原理及设计,4.7.1 数字频率计的原理,根据频率的定义直接进行测量的。即在确定的闸门时间Tw内,记录被测信号的脉冲数目Nx,则被测信号的频率fx为:,测量方法有直接测频法和等精度测频法,直接测频法原理,波形图,测量电路可以采用一个具有计数使能控制端的计数器即可。用图中的Tw信号作为计数器的计数使能控制,被测信号作为计数器的时钟输入端,假设计数器的计数使能信号为高电平有效,当Tw有效时计数器开始计数,当Tw无效时,计数器停止计数。如果Tw的宽度为1s,则此时计数器的计数值就是被测信号的频率值。由于被测信号与闸门信号的相对独立性,也就是说被测信号不能与闸门信号完全同步,所以这种测量中计数器的计数值存在1的绝对计数误差。当在Tw时间内计数器的计数值较小时,频率计测量的相对误差较大。,等精度测频法原理,等精度测量方法是在直接测频方法的理论基础上加以改进而得出的。在这种方法中,其闸门信号是随着被测信号频率的变化而改变的,不再是固定宽度,而且其恰好是被测信号的整数倍,即与被测信号完全同步,可以消除了1个绝对计数误差。,波形图,在测量过程中,有两个计数器分别对标准信号和被测信号同时计数。首先给出闸门开启信号(预置闸门上升沿)此时计数器不开始计数,等到被测信号的上升沿到来时,计数器才开始计数。当预置闸门关闭信号(下降沿)到时,计数器并不立即停止计数,而是等到被测信号的上升沿到来时才结束计数,完成一次测量过程。可以看出,实际闸门时间Tr与预置闸门时间Tp并不严格相等,但差值不超过被测信号的一个周期。,设在一次实际闸门时间Tr中计数器对被测信号的计数值为Nx,对标准信号的计数值为Ns。标准信号的频率为fs。则被测信号的频率为:,由上式可知,若忽略标准频率的误差,则等精度测频方法可能产生的相对误差为:,fxe为被测信号频率的准确值,在测量中,由于fs计数的起停时间都是由该信号的上升沿触发的,在闸门时间Tr内对fx的计数Nx无误差,对fs的计数Ns最多相差个数的误差,即,其测量频率为:,因此可得:,结论:测量频率的相对误差与被测信号频率的大小无关,仅与闸门时间和标准信号频率有关,即实现了整个测试频段的等精度测量。闸门时间越长,标准频率越高,Ns的计数值越大,测频的相对误差就越小。标准频率可由稳定度好、精度高的高频晶体振荡器产生,在保证测量精度不变的前提下,提高标准信号频率,可使闸门时间缩短,提高测量速度。,一个D触发器实现实际闸门信号与被测信号的上升沿同步,其输出作为实际闸门信号分别控制被测信号计数器(计数器1)和标准信号计数器(计数器2)的计数使能端EN,当闸门信号结束时,两个计数器停止计数,然后运算器对计数结果进行运算,获得测量结果fs。,预置闸门信号需要根据被测信号的频率作相应的调整,以获得满意的测量精度。为此需要设计一个预置闸门信号发生器,用于产生不同宽度的预置闸门信号。三个计数器和三个D触发器,依次对时基信号进行分频,分频后的信号经过数据选择器由用户根据需要选择合适的预置闸门信号输出。实际可以根据需要来选择频率的测量时间,以获得更为精确的测量结果。,4.7.2 数字频率计的Verilog HDL描述,频率计由标准信号单元、预置闸门信号单元、测量单元和计算单元组成。为了便于说明设计过程,选取时基信号的频率为2KHz,标准信号的频率为10MHz。测量预置闸门时间分别选定为0.01S、0.1S和1S。与测量时间的长短相对应的标准信号频率依次为10MHz、1MHz 和100KHz。这样测量的相对误差为:,参考程序,预置闸门时间控制模块,module tp_generator(clk,sel,tp);input clk;input 1:0 sel;output tp;reg tp1,tp2,tp3,high,tp_buffer;assign tp=tp_buffer;assign hign=1b1;counter c1(.clk(clk),.en(hign),.qcc(tp1);counter c2(.clk(clk),.en(tp1),.qcc(tp2);counter c3(.clk(clk),.en(tp2),.qcc(tp3);always(sel or tp1 or tp2 or tp3)case(sel)2b00:tp_buffer=tp1;2b01:tp_buffer=tp2;2b10:tp_buffer=tp3;default:tp_buffer=tp1;endcaseendmodule,分频器,选通信号,计数器模块,module counter(clk,en,qcc);input clk;input en;output qcc;reg qcctemp,qt;reg 3:0 q;assign qcc=qt;always(posedge clk)beginif(en=1b1)if(q=4d9)begin q=4d0;qcctemp=1b1;end else begin q=q+4d1;qcctemp=1b0;endend,always(posedge qcctemp)qt=qt;endmodule,标准信号产生模块,module fs_generator(clk,sel,fs_out);input clk;input 1:0 sel;output fs_out;wire fs1;reg fs_out_buffer,fs2,fs3,high;assign fs1=clk;assign fs_out=fs_out_buffer;assign hign=1b1;counter c1(.clk(clk),.en(high),.qcc(fs2);counter c2(.clk(clk),.en(fs2),.qcc(fs3);always(sel or fs1 or fs2 or fs3)case(sel)2b00:fs_out_buffer=fs1;2b01:fs_out_buffer=fs2;2b10:fs_out_buffer=fs3;default:fs_out_buffer=fs1;endcaseendmodule,该电路由两个十进制计数器和一个3选1的数据选择器构成。其中十进制计数器把输入的高频标准信号fs两次分频,与相应的闸门信号对应。当fs=10MHz时,分别产生1MHz和100KHz信号。当闸门信号为0.01S、0.1S和1S时,分别与10MHz、1MHz和100KHz对应。实现等精度测量。,测量模块,module measure(fs_in,fx_in,tp,clear,Ns,Nx);input fs_in;input fx_in;input tp;input clear;output 19:0 Ns;output 19:0 Nx;reg 19:0 Nstemp,Nxtemp;assign Ns=Nstemp;assign Nx=Nstemp;m_counter c1(.clk(clk),.en(tp),.clr(clear),.q(Nstemp);m_counter c2(.clk(clk),.en(tp),.clr(clear),.q(Nxtemp);endmodule,该模块主要完成闸门信号与被测信号同步和实际闸门信号内被测信号和标准信号的计数功能。计数输出Nx,Ns。,频率计的顶层主程序,module top(sel,fb_in,fs_in,fx_in,clear,Ns,Nx);input 1:0 sel;input fb_in;input fs_in;input fx_in;input clear;output 19:0 Ns;output 19:0 Nx;reg tp,fstemp;tp_generator u0(.clk(fb_in),.tp(tp),.sel(sel);fs_generator u1(.clk(fs_in),.fs_out(fstemp),.sel(sel);measure u2(.fx_in(fx_in),.fs_in(fstemp),.tp(tp),.clear(clear),.Ns(Ns),.Nx(Nx);endmodule,4.8 数字信号发生器的原理及设计,4.8.1 数字信号发生器(DDS)的原理,工作原理是以数控振荡器的方式产生频率、相位可控制的不同波形,用DDS实现的信号发生器电路主要包括时基电路、相位累加器、波形发生器、d/A转换器和滤波器。,每来一个时钟脉冲Fclk,n位加法器将频率控制数据X与累加寄存器输出的累加相位数据相加,把相加后的结果Y送至累加寄存器的输入端。累加寄存器一方面将在上一时钟周期作用后所产生的新的相位数据反馈到加法器的输入端,以使加法器在下一时钟的作用下继续与频率控制数据X相加;另一方面将这个值作为取样地址值送入波形存储器,波形存储器根据这个地址输出相应的波形数据。最后经D/A转换器和滤波器将波形数据转换成所需要频率的模拟波形。相位累加器在基准时钟的作用下,进行线性相位累加,当相位累加器加满量程时就会产生一次溢出,这样就完成了一个波形周期。,存在问题是单个周期的数据抽样越少,会在一定程度上降低输出信号的平滑度。若要产生低频信号时,单个周期的数据抽样太多,会浪费波形存储器的存储空间。,改进后的DDS控制器结构框图,仍然用相位累加器作为频率控制电路,但是不输出其累加结果,而是输出其累加溢出信号,即相位累加器每溢出一次,就在Fout输出一个脉冲。其频率为:,其中n为相位累加器的位宽,X为输入频率控制数据数值,在波形发生器中,用Fout作为地址发生器的时钟输入脉冲。在每个周期的数据抽样点M数目固定的条件下,可以得到的输出信号频率为:,其中M为单周期的数据抽样点数目,4.8.2 数字信号发生器(DDS)的Verilog HDL 描述,顶层文件结构图,相位累加器(宽度为16位)在时基脉冲clk的控制下对频率控制数据x(15:0)进行累加,累加器每溢出一次,在clk_out输出一个脉冲,其频率为:,其中X为频率控制数据x(15:0)所对应的数值,波形数据存储单元中分别存储了正弦波、方波和三角波的数据。这些波形数据用以计数频率为fclk_out的地址发生器读出,然后根据波形选择控制信号sel(1:0)的状态选择一种波形数据输出。,由波形数据存储单元输出的波形数据直接输出到D/A转换器中,经过D/A转换和滤波器就可以获得所需要的波形。,参考程序,相位累加器模块,module fre_control(clk,load,x,clk_out);input clk;input load;input 15:0 x;output clk_out;reg clk_out_buffer;reg 16:0 reg0;reg 16:0 regt;assign clk_out=clk_out_buffer;always(posedge clk or posedge load)beginif(load=1b1)regt=1b0,x;else begin reg0=reg0+regt;if(reg016=1b1)begin clk_out_buffer=1b1;reg0=16b0;end,elseclk_out_buffer=1b0;endendendmodule,正弦波发生器模块,module gen_sin(clk,d);input clk;output 7:0 d;reg 7:0 d_buffer;reg 5:0 temp;assign d=d_buffer;always(posedge clk)begin if(temp=6d63)