实用电路设计_第1页
实用电路设计_第2页
实用电路设计_第3页
实用电路设计_第4页
实用电路设计_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章

Verilog设计进阶9.1加法器设计◆

级连加法器◆数据流描述的加法器

◆超前进位加法器◆流水线加法器(1)级连加法器moduleadd_jl(sum,cout,a,b,cin);input[7:0]a,b;inputcin;output[7:0]sum;outputcout;full_add1f0(a[0],b[0],cin,sum[0],cin1);full_add1f1(a[1],b[1],cin1,sum[1],cin2);full_add1f2(a[2],b[2],cin2,sum[2],cin3);full_add1f3(a[3],b[3],cin3,sum[3],cin4);full_add1f4(a[4],b[4],cin4,sum[4],cin5);full_add1f5(a[5],b[5],cin5,sum[5],cin6);full_add1f6(a[6],b[6],cin6,sum[6],cin7);full_add1f7(a[7],b[7],cin7,sum[7],cout);endmodule8位级连加法器代码(2)数据流描述的加法器moduleadd_bx(cout,sum,a,b,cin);parameterWIDTH=8;inputcin;outputcout;input[WIDTH-1:0]a,b;output[WIDTH-1:0]sum;assign{cout,sum}=a+b+cin;endmodule全部由逻辑门实现(3)

8位超前进位加法器moduleadd_ahead(sum,cout,a,b,cin);input[7:0]a,b;inputcin;output[7:0]sum;outputcout;wire[7:0]G,P;wire[7:0]C,sum;assignG[0]=a[0]&b[0];assignP[0]=a[0]|b[0];assignC[0]=cin;assignsum[0]=G[0]^P[0]^C[0];assignG[1]=a[1]&b[1];assignP[1]=a[1]|b[1];assignC[1]=G[0]|(P[0]&cin);assignsum[1]=G[1]^P[1]^C[1];assignG[2]=a[2]&b[2];assignP[2]=a[2]|b[2];assignC[2]=G[1]|(P[1]&C[1]);assignsum[2]=G[2]^P[2]^C[2];assignG[3]=a[3]&b[3]; assignP[3]=a[3]|b[3];assignC[3]=G[2]|(P[2]&C[2]);assignsum[3]=G[3]^P[3]^C[3];assignG[4]=a[4]&b[4]; assignP[4]=a[4]|b[4];assignC[4]=G[3]|(P[3]&C[3]);assignsum[4]=G[2]^P[2]^C[2];assignG[5]=a[5]&b[5];assignP[5]=a[5]|b[5];assignC[5]=G[4]|(P[4]&C[4]);assignsum[5]=G[5]^P[5]^C[5];assignG[6]=a[6]&b[6]; assignP[6]=a[6]|b[6];assignC[6]=G[5]|(P[5]&C[5]);assignsum[6]=G[6]^P[6]^C[6];assignG[7]=a[7]&b[7];assignP[7]=a[7]|b[7];assignC[7]=G[6]|(P[6]&C[6]);assignsum[7]=G[7]^P[7]^C[7];assigncout=G[7]|(P[7]&C[7]);endmodule(4)流水线加法器

moduleadder8(cout,sum,a,b,cin,enable);input[7:0]a,b;inputcin,enable;output[7:0]sum;reg[7:0]sum;outputcout;reg

cout;reg[3:0]tempa,tempb,firsts;reg

firstc;always@(posedgeenable)begin{firstc,firsts}=a[3:0]+b[3:0]+cin;tempa=a[7:4];tempb=b[7:4];endalways@(posedgeenable)begin{cout,sum[7:4]}=tempa+tempb+firstc;sum[3:0]=firsts;endendmodule9.2乘法器◆并行乘法器◆移位相加乘法器◆查找表乘法器◆加法树乘法器modulemult(outcome,a,b);parametersize=8;input[size:1]a,b;output[2*size:1]outcome;assignoutcome=a*b;endmodule(1)并行乘法器利用Verilog语言的乘法操作符,可很容易地实现并行乘法器,并可由EDA综合软件自动转化为电路网表结构8×8并行乘法器的门级综合原理图(2)移位相加乘法器移位相加乘法器将乘法变为加法实现,其设计思路是:乘法通过逐次移位相加实现,每次判断乘数的最低位,若为1则将被乘数移位相加。4×4移位相加乘法操作示意图8位移位相加乘法器顶层设计

8位移位相加乘法器时序仿真波形(3)加法树乘法器

【例9.7】8位加法树乘法器moduleadd_tree(out,a,b,clk);input[7:0]a,b;inputclk;outputwire[15:0]out;wire[14:0]out1,c1; wire[12:0]out2;wire[10:0]out3,c2;wire[8:0]out4;reg[14:0]temp0;reg[13:0]temp1;reg[12:0]temp2;reg[11:0]temp3;reg[10:0]temp4;reg[9:0]temp5;reg[8:0]temp6; reg[7:0]temp7;function[7:0]mult8x1; //该函数实现8×1乘法input[7:0]operand;inputsel;beginmult8x1=(sel)?(operand):8'b00000000;endendfunctionalways@(posedge

clk) //调用函数实现操作数b各位与操作数a的相乘begintemp7<=mult8x1(a,b[0]);temp6<=((mult8x1(a,b[1]))<<1);temp5<=((mult8x1(a,b[2]))<<2);temp4<=((mult8x1(a,b[3]))<<3);temp3<=((mult8x1(a,b[4]))<<4);temp2<=((mult8x1(a,b[5]))<<5);temp1<=((mult8x1(a,b[6]))<<6);temp0<=((mult8x1(a,b[7]))<<7);endassignout1=temp0+temp1; //加法树运算assignout2=temp2+temp3;assignout3=temp4+temp5;assignout4=temp6+temp7;assignc1=out1+out2;assignc2=out3+out4;assignout=c1+c2;endmodule(4)查找表乘法器查找表乘法器将乘积直接存放在存储器中,将操作数(乘数和被乘数)作为地址访问存储器,得到的输出数据就是乘法运算的结果。查找表方式的乘法器速度只局限于所使用存储器的存取速度。但由于查找表规模随操作数位数增加而迅速增大,因此如用于实现位数宽的乘法操作,需要FPGA器件具有较大的片内存储器模块。比如,要实现8×8乘法,要求存储器的地址位宽为16位,字长为16位,即存储器大小为1M比特。乘累加器的结构框图9.3乘累加器(MAC)乘累加器(MAC)moduleMAC(out,opa,opb,clk,clr);output[15:0]out;input[7:0]opa,opb;inputclk,clr;wire[15:0]sum;reg[15:0]out;function[15:0]mult;//函数定义,mult函数完成乘法操作input[7:0]opa,opb;reg[15:0]result;integeri;beginresult=opa[0]?opb:0;for(i=1;i<=7;i=i+1)beginif(opa[i]==1)result=result+(opb<<(i-1));endmult=result;endendfunction

assignsum=mult(opa,opb)+out;always@(posedge

clkorposedge

clr)beginif(clr)out<=0;elseout<=sum;endendmodule在实际中我们经常会遇到这样的问题,需要进行奇数次分频,同时又要得到占空比是50%的方波波形。可采用如下方法:用两个计数器,一个由输入时钟上升沿触发,一个由输入时钟下降沿触发,最后将两个计数器的输出相或,即可得到占空比为50%的方波波形。

9.4奇数分频与小数分频

(1)奇数分频【例9.10】占空比50%的奇数分频(模7)modulecount7(reset,clk,cout);inputclk,reset;outputwirecout;reg[2:0]m,n;regcout1,cout2;assigncout=cout1|cout2; //两个计数器的输出相或always@(posedge

clk)beginif(!reset)begincout1<=0;m<=0;endelsebegin if(m==6)m<=0; elsem<=m+1;

if(m<3)cout1<=1; elsecout1<=0;endendalways@(negedge

clk)beginif(!reset)begincout2<=0;n<=0;endelsebegin if(n==6)n<=0; elsen<=n+1;

if(n<3)cout2<=1; elsecout2<=0;endendendmodule模7奇数分频器功能仿真波形图(QuartusⅡ)

【例9.11】占空比50%的奇数分频modulecount_num(reset,clk,cout);parameterNUM=13;inputclk,reset;outputwirecout;reg[4:0]m,n;regcout1,cout2;assigncout=cout1|cout2;always@(posedge

clk)beginif(!reset)begincout1<=0;m<=0;endelsebegin if(m==NUM-1)m<=0; elsem<=m+1;

if(m<(NUM-1)/2)cout1<=1;elsecout1<=0;endendalways@(negedge

clk)begin if(!reset)begincout2<=0;n<=0;endelsebeginif(n==NUM-1)n<=0; elsen<=n+1;

if(n<(NUM-1)/2)cout2<=1;elsecout2<=0;endendendmodule模13奇数分频器功能仿真波形图(QuartusⅡ)

【例9.12】5.5半整数分频源代码modulefdiv5_5(clkin,clr,clkout);inputclkin,clr;outputreg

clkout;regclk1;wireclk2;integercount;xorxor1(clk2,clkin,clk1); //异或门always@(posedge

clkoutornegedge

clr) //2分频器beginif(~clr)beginclk1<=1'b0;endelseclk1<=~clk1;endalways@(posedgeclk2ornegedge

clr) //模5分频器beginif(~clr) begin count<=0;clkout<=1'b0;endelseif(count==5) //要改变分频器的模,只需改变count的值

begin count<=0;clkout<=1'b1;endelsebegincount<=count+1;clkout<=1'b0;endendendmodule功能仿真波形5.5倍半整数分频器功能仿真波形图(QuartusⅡ)小数分频

可用下面的方法大致实现小数分频,即先设计两个不同分频比的整数分频器,然后通过控制两种分频比出现的不同次数来获得所需要的小数分频值,从而实现平均意义上的小数分频。

【例9.13】9.1小数分频源代码modulefdiv8_1(clk_in,rst,clk_out);inputclk_in,rst;outputreg

clk_out;reg[3:0]cnt1,cnt2; //cnt1计分频的次数always@(posedge

clk_inorposedge

rst)beginif(rst)begincnt1<=0;cnt2<=0;clk_out<=0;endelseif(cnt1<9) //9次8分频

beginif(cnt2<7)begincnt2<=cnt2+1;clk_out<=0;endelsebegincnt2<=0;cnt1<=cnt1+1;clk_out<=1;end end elsebegin //1次9分频

if(cnt2<8)begincnt2<=cnt2+1;clk_out<=0;endelsebegincnt2<=0;cnt1<=0;clk_out<=1;end endendendmodule9.1小数分频功能仿真波形(QuartusⅡ)

9.5数字跑表

设计一个数字跑表,该跑表具有复位、暂停、秒表计时等功能。

跑表设三个输入端,分别为时钟输入(CLK)、复位(CLR)和启动/暂停(PAUSE)按键。复位信号高电平有效,可对跑表异步清零;当启动/暂停键为低电平时跑表开始计时,为高电平时暂停,变低后在原来的数值基础上继续计数。

9.6实用多功能数字钟用Verilog语言设计一个多功能数字钟,数字钟具有下述功能(1)计时功能:包括时、分、秒的计时。(2)定时与闹钟功能:能在设定的时间发出闹铃音。(3)校时功能:对小时、分钟和秒能手动调整以校准时间。(4)整点报时功能:每逢整点,产生“嘀嘀嘀嘀—嘟”,四短一长的报时音。

9.7字符液晶显示控制

基于DE2-70平台用FPGA控制字符液晶实现字符的显示。字符液晶由液晶显示器和专用的行、列驱动器、控制器及必要的连接件装配而成,可显示数字和英文字符。字符液晶本身具有字符发生器,显示容量大,功能丰富,一般最少可显示1行8个或l行16个字符,每个字符由5×7、5×8或5×11的一组像素点阵排列构成,字符间有一定的间隔,行与行间也有一定的间隔。

用状态机实现字符显示控制H1602B液晶模块的读/写操作、屏幕和光标的操作都是通过指令编程来实现的,为了方便控制,采用状态机实现设计。在设计中设置8个状态,分别是起始状态CLEAR,设置CGRAM状态SETCGRAM,工作方式设置状态SETFUNCTION,显示方式设置状态SWITCHMODE,输入方式设置状态SETMODE,光标归位状态RETURNCURSOR,字符移位状态SHIFT,写RAM状态WRITERAM,状态编码采用One-Hot方式。9.8VGA图像显示控制器设计

VGA显示器采用光栅扫描方式,即轰击荧光屏的电子束在CRT显示器上从左到右、从上到下做有规律的移动,其水平移动受水平同步信号HSYNC控制,垂直移动受垂直同步信号VSYNC控制。扫描方式一般分为逐行扫描和隔行扫描,这里采用逐行扫描。完成一行扫描的时间称为水平扫描时间,其倒数称为行频率,完成一帧(整屏)扫描的时间称为垂直扫描时间,其倒数称为场频,又称刷新率。VGA工业标准要求的时钟频率如下:时钟频率(Clockfrequency) 25.175MHz(像素输出的频率)行频(Linefrequency) 31469Hz场频(Fieldfrequency) 59.94HzVGA行扫描时序VGA场扫描时序VGA时序行扫描时序要求(单位:像素,即输出一个像素Pixel的时间间隔)场扫描时序要求(单位:行,即输出一行Line的时间间隔)场同步头场图像场周期对应位置V_TfV_TaV_TbV_TcV_TdV_TeV_Tg时间(Lines)222584808525行同步头行图像行周期对应位置H_TfH_TaH_TbH_TcH_TdH_TeH_Tg时间(Pixels)8964086408800VGA图像显示控制器设计VGA图像显示控制器结构框图

本例显示的图像选择标准图像LENA,如图9.32所示,图像的尺寸为128×128点,格式为.bmp文件,R,G,B三基色信号分别用5bit,6bit,5bit来表示的LENA图像的显示效果,与用真彩显示的图像效果比较,直观感受没有很大的区别。图像数据由自己编写Matlab程序得到,具体如例9.17所示,该程序从lena.bmp图像中得到R,G,B三基色数据并将数据写入ROM存储器的*.mif文件中(本例中为lena16.mif)。

R,G,B三基色信号分别采用5bit,6bit,5bit表示的LENA图像9.9点阵式液晶显示控制

GDM12864的结构及指令

GDM12864A原理简图

“写数据”时序图

指令名称控制信号控制代码RSR/WD7D6D5D4D3D2D1D0显示开关设置000011111D显示起始行设置0011L5L4L3L2L1L0页面地址设置0010111P2P1P0列地址设置0001C5C4C3C2C1C0读取状态字01busy0on/offreset0000写显示数据10数

据控制指令功能表

用状态机来进行设计。设置5个状态,分别是空闲状态“Idle”,写页面地址状态“Xpage”,写列地址状态“Yline”,写数据状态“Data”,显示状态“Display”。当处于Xpage状态时,rs=0,rw=0,按照前面介绍的命令格式“10111P2P1P0”将页面地址送上数据总线(P2P1P0表示页面地址)。当处于Yline状态时,rs=0,rw=0,将列地址“01C5C4C3C2C1C0”送上数据总线(C5C4C3C2C1C0代表0至63的列地址)。当处于Data状态时,rs=1,rw=0,依次将ROM中的显示数据送上数据总线。将8个页面全部扫描过一遍后,进入Display状态,rs=0,rw=0,将命令“00111111”送上数据总线。

液晶控制

9.10乐曲演奏电路采用FPGA器件驱动小扬声器构成一个乐曲演奏电路,演奏的乐曲选择“梁祝”片段,其曲谱如下。

乐曲演奏的原理组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能连续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号的频率的高低和持续的时间,就可以使扬声器发出连续的乐曲声。

乐曲演奏电路原理框图

9.11异步串行接口(UART)设计

基本的UART通信只需要两条信号线:RXD和TXD,TXD是UART的发送端,RXD是UART的接收端,接收与发送全双工工作。

UART是异步通信方式,发送方和接收方分别有各自独立的时钟,传输的速率由双方约定,使用起至式异步协议。起止式异步协议起止式异步协议的特点是一个字符一个字符地进行传输,字符之间没有固定的时间间隔要求,每个字符都以起始位开始,以停止符结束。每一个字符的前面都有一位起始位(低电平,逻辑值0),字符本身有5到8比特数据位组成,接着是一位校验位(也可以没有校验位),最后是一位(或一位半、二位)停止位,停止位后面是不定长度的空闲位。停止位和空闲位都规定为高电平,这样就保证起始位开始处一定有一个下降沿。数据接收数据接收:接收的首要任务是能够正确找到数据的位置。这主要靠检测数据的起始位和停止位来实现。起始位是一位0,它作为联络信号附加进发送信息,因为空闲位都为高电平,所以当接收数据线的信号突然变为低电平时,告诉接收端数据的到来。一个字符接收完毕后,对数据进行校验(若数据包含奇偶校验位),最后检测停止位,以确认数据接收完毕。

UART接收示意图

由于传输中有可能会产生毛刺,接收端极有可能将毛刺误认为是起始位,所以要对检测到的下降沿进行判别。一般采用如下的方法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论