




已阅读5页,还剩70页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 典型数字系统分析与设计 u数字系统概述 u数码管动态显示扫描电路原理及设计 u乘法器的原理及设计 u除法器的原理及设计方法 u简易CPU工作原理及设计方法 u交通信号灯控制器原理及设计 u数字频率计的原理及设计 u数字信号发生器的原理及设计 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; endcase endmodule 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; endcase endmodule 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; endcase endmodule 七段显示译码器元件 4.3 乘法器的原理及设计 4.3.1乘法器工作原理 乘法器的一般计算过程 1101被乘数 1011乘数 1101位积 1101位积 0000位积 1101位积 10001111积 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; end end 用并置方法对 被乘数进行位 扩展 状态计数清零 部分积清零 产生位积并累加 乘数左移 被乘数右移 always(state) begin if(state=2b00 ) ptemp=pp; end endmodule 目前,很多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 除法器的工作原理 1 0 1 0商 除数 11 0 11 0 0 0 0 1 1 1被除数 1 1 0 1 0 1 1 1 0 0 0 0 1 1 1 1 1 1 0 1 13513 = 10 余 50 1 0 1 0 0 0 0 0 1 0 1余数 从前面的乘法器介绍可知4x4位乘法器的积是一个8位二进制数,因此,4位 除法器应该是一个8位二进制数除以一个4位二进制数。采用的方法是依次从 被除数的高位中减去除数,如果不够减,除数右移,直到够减为止。当余数 小于除数时则完成除法运算。从除法运算过程可以看出,其主要是移位相减 的操作。 这里用左移被除数代替右移除 数的操作,并把商直接存储到 被除数的空余位中,省去了存 储商的寄存器。因此被除数寄 存器扩展为9位移位寄存器。 Sh是移位信号,在时钟上升沿控制被除数寄存器左移一位;Su是把减法器的结果装入被 除数寄存器的X8 、X7 、X6 、X5 、X4和时钟的上升沿置商的最低位为“1”的控制信号,St 是除法运算启动信号,Ov是除法器溢出标志信号。 除法器控制电路状态图 S0 (停止) S1S2 S5S4S3 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) begin load=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) begin su=1b1; nextstate=state; end else begin sh=1b1; nextstate=state+3d1; end 3d5: begin if(c=1b1) su=1b1; nextstate=3d0; end endcase end 启动除法运算 溢出判断 状态2、3、4:实 现除法运算 结束运算过程, 返回初始态 always(posedge clk) begin state=nextstate; if(load=1b1) dividend=1b0,dividend_in; if(su=1b1) begin dividend8:4=subout; dividend0=1b1; end if(sh=1b1) dividend=dividend7:0,1b0; end endmodule 4.5简易CPU工作原理及设计方法 4.5.1 简易CPU的工作原理 4个n位寄存器R0 、R1、R2、R3 ALU算术逻辑单元 控制单元 基本操作 操作功能 Load Rx,dataRxdata Move Rx,RyRxRy Add Rx,RyRxRx+Ry Sub Rx,RyRyRx-Ry 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) begin if(clear=1b1) qtemp=2b00; else qtemp=qtemp+2b01; end endmodule 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) begin enw=en,w; case(enw) 3b100:ytemp=4b1000; 3b101:ytemp=4b0100; 3b110:ytemp=4b0010; 3b111:ytemp=4b0001; default:ytemp=4b0000; endcase end endmodule 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) begin if(rin=1b1) qtemp=r; end endmodule 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 assign t=count; assign func=f,rx,ry; assign frin=w assign i=funcreg1:2; assign sel=rout,gout,extern; assign sum=addsub?(a+buswires):(a-buswires); upcount counter(.clear(clear), .clock(clock), .q(count) ); regn #(6) functionreg( .r(func), .rin(frin), .clock(clock), .q(funcreg) ); dec2to4 decx( .w(funcreg3:4), .en(high), .y(x) ); dec2to4 decy( .w(funcreg5:6), .en(high), .y(y) ); regn reg0( .r(buswirestemp), .rin(rin0), .clock(clock), .q(r0) ); regn reg1( .r(buswirestemp), .rin(rin1), .clock(clock), .q(r1) ); regn reg2( .r(buswirestemp), .rin(rin2), .clock(clock), .q(r2) ); regn reg3( .r(buswirestemp), .rin(rin3), .clock(clock), .q(r3) ); regn rega( .r(buswirestemp), .rin(ain), .clock(clock),.q(a) ); regn regg( .r(sum), .rin(gin), .clock(clock),.q(g) ); always(t or i or x or y)begin extern=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: begin rout=y; addsub=1b1; gin=1b1; end default:; endcase default: begin gout=1b1; rin=x; donetemp =1b1; end endcase end always(sel) case(sel) 6b100000:buswirestemp=r0; 6b010000:buswirestemp=r1; 6b001000:buswirestemp=r2; 6b000100:buswirestemp=r3; 6b000100:buswirestemp=g; default:buswirestemp=data; endcase endmodule 4.6 交通信号灯控制器原理及设计 4.6.1 交通信号灯控制器原理 S0 主路通行 期 S3 支路过 渡期 S1 主路过 渡期 S2 支路通 行期 定时T1未到 定时T1到 定时T2未到 定时T2到 定时T3未到 定时T3到 定时Tm未到 定时Tm到 控制器原理框图 1. 状态控制电路 输入信号输出信号 Q2nQ1nLSMQ2n+1Q1 n+1 0100111 1000100 0010001 1101010 用S0=00表示主路通行状态,用S1=01表示主路过渡状态、用S2=11表示 次干道通行状态,用S3=10表示次干道过渡状态。 JK触发器的状态转换表 定时控制信号与控制状态逻辑关系表 输入信号输出信号 Q2Q1ELESEM 01001 10001 00100 11010 用EL、ES、EM表示定时器Tl、Ts、Tm的定时控制信号 2. 定时电路 在定时电路中,若输入时钟的频率为1Hz信号,根据定时时间Tl、Ts、Tm 的长短,设计相应的计数器既可以实现定时电路,并且每个计数器应该受 到状态定时控制电路所控制。 3. 译码电路 译码电路真值表 控制器 的状态 主干道次干道 Q2Q1 红灯R1黄灯Y1绿灯G1红灯R2黄灯Y2绿灯G2 00001100 01010100 11100001 10100010 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) begin if(el=1b1) if(q=6d44) begin q=6d0; l_buffer=1b1; end else begin q=q+6d1; l_buffer=1b0; end end endmodule 状态控制器模块 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) begin state=2b11; es_buffer=1b1; end else es_buffer=1b0; 2b11: if(s=1b1) begin state=2b10; em_buffer=1b1; end else em_buffer=1b0; 2b10: if(m=1b1) begin state=2b00; el_buffer=1b1; end else el_buffer=1b0; default:; endcase endmodule 输出译码器模块 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: begin mrgy=3b010; srgy=3b100; end 2b01: begin mrgy=3b001; srgy=3b100; end 2b10: begin mrgy=3b100; srgy=3b001; end 2b11: begin mrgy=3b100; srgy=3b010; end default: ; endcase endmodule 交通信号灯控制器顶层模块 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; endcase endmodule 分频器 选通信号 计数器模块 module counter(clk, en, qcc ); input clk; input en; output qcc; reg qcctemp,qt; reg 3:0 q; assign qcc=qt; always(posedge clk) begin if(en=1b1) if(q=4d9) begin q=4d0; qcctemp=1b1; end else begin q=q+4d1; qcctemp=1b0; end end 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; endcase endmodule 该电路由两个十进制计数器和一个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) begin if (load=1b1) regt=1b0,x; else begin reg0=reg0+regt; if(reg016=1b1) begin clk_out_buffer=1b1; reg0=16b0; end else clk_out_buffer=1b0; end end endmodule 正弦波发生器模块 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) temp=6d0; else temp=temp+6d1; case(temp) 6d0:d_buffer=8d255; 6d1:d_buffer=8d254; 6d2:d_buffer=8d252; 6d3:d_buffer=8d249; 6d4:d_buffer=8d245; 6d5:d_buffer=8d239; 6d6:d_buffer=8d233 6d7:d_buffer=8d225; 6d8:d_buffer=8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025江西吉安市泰和县上圯水厂面向社会招聘5人考前自测高频考点模拟试题及答案详解(必刷)
- 2025河南郑州联勤保障中心二季度社会人才招聘132人考前自测高频考点模拟试题及答案详解(夺冠)
- 2025年国家知识产权局知识产权检索咨询中心社会招聘(16人)考前自测高频考点模拟试题及完整答案详解
- 2025快递站点租赁合同
- 2025广东汕头市潮阳区教育局属下学校外出招聘硕士研究生18人模拟试卷及答案详解(新)
- 2025年阜阳颍州区选调区内乡镇在编在岗教师60人模拟试卷附答案详解(典型题)
- 2025年安徽艺术学院高层次人才招聘30人考前自测高频考点模拟试题有完整答案详解
- 2025年临沂市罗庄区兴罗资本投资有限公司公开招聘职业经理人模拟试卷及完整答案详解一套
- 2025北京大学未来技术学院招聘1名劳动合同制工作人员模拟试卷及答案详解(名校卷)
- 2025湖南邵阳市洞口县教育局所属事业单位招聘39人模拟试卷带答案详解
- 头道汤的课件
- 护肤品分析与讲解
- 2025年中国药典培训试题及答案
- Q-JJJ 9002-2025 铁路建设项目安全穿透式管理实施指南
- 2025年新闻记者从业资格证考试题库(附含答案)
- 制药设备改造管理制度
- DB31/T 1013-2016城市轨道交通地下车站环境质量要求
- 【义乌小商品市场出口贸易的现状与对策探析8100字(论文)】
- 沟通的艺术智慧树知到期末考试答案章节答案2024年湖南师范大学
- 城轨专业职业生涯规划
- 高海拔地区常见疾病与适应措施
评论
0/150
提交评论