《基于Veriloghdl的数字电路设计课件》由会员分享,可在线阅读,更多相关《基于Veriloghdl的数字电路设计课件(127页珍藏版)》请在金锄头文库上搜索。
1、第6章 基于Verilog HDL的 数字电路设计主要内容主要内容 6.1 基本组合电路的设计基本组合电路的设计 6.2 基本时序逻辑电路设计基本时序逻辑电路设计 6.3 状态机逻辑电路设计状态机逻辑电路设计 6.4 多层次结构电路的设计多层次结构电路的设计Verilog HDL设计实例设计实例在数字电路设计中,数字电路可简单归纳为两种要素:线和器件。线是器件管脚之间的物理连线;器件也可简单归纳为组合逻辑器件(如与或非门等)和时序逻辑器件(如寄存器、锁存器、RAM等)。组合逻辑电路在逻辑功能上的特点是任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。而时序逻辑电路在逻辑功能上的特点是
2、任意时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态,或者说,还与以前的输入有关。下面分别用VerilogHDL语言来设计这两种电路。6.1基本组合电路设计基本组合电路设计1、设计一个基本门电路设计一个基本门电路包括一个非门、一个与门、一个与非门、一个或门、一包括一个非门、一个与门、一个与非门、一个或门、一个异或门和一个异或非门。如图个异或门和一个异或非门。如图1所示为基本门电路描述图所示为基本门电路描述图元符号。元符号。图6-1基本门电路描述图元符号【例6-1】门调用实现图6-1所示模块。moduleALLGATE(IN1,IN2,G_INV,G_AND,G_NAND,G_OR
3、,G_XOR,G_NXOR);inputwireIN1,IN2;outputwireG_INV,G_AND,G_NAND,G_OR,G_XOR,G_NXOR;assignG_INV=IN1;assignG_AND=IN1&IN2;assignG_NAND=(IN1&IN2);assignG_OR=IN1|IN2;assignG_XOR=IN1IN2;assignG_NXOR=(IN1IN2);endmodule仿真结果如图6-2所示。图6-2基本门电路仿真结果图6-3基本门电路综合结果综合结果如图6-3所示。2、三态逻辑电路三态逻辑电路在数字系统中,经常要用到三态逻辑电路,三态门是在普通在数字
4、系统中,经常要用到三态逻辑电路,三态门是在普通门的基础上加控制端构成的,在需要信息双向传输的地方,三门的基础上加控制端构成的,在需要信息双向传输的地方,三态门是必需的。下面用三种模式描述图态门是必需的。下面用三种模式描述图4所示的三态门,当所示的三态门,当en控制端为高电平时,输出控制端为高电平时,输出out=in;当;当en控制端为低电平时,控制端为低电平时,输出输出out为高阻态。为高阻态。2、三态逻辑设计三态逻辑设计【例例6-2】行为描述的三态门行为描述的三态门module tristate1(in,en,out);input in,en; output reg out;always (
5、in or en)begin if(en) out=in; else out=1bz; endendmodule【例例6-3】调用门元件调用门元件bufif1描述的三态门描述的三态门module tristate2(in,en,out);input in,en; output out; tri out;bufif1 b1(out,in,en);/注意三态门端口的排列顺序注意三态门端口的排列顺序endmodule【例例6-4】数据流描述的三态门数据流描述的三态门module tristate3(out,in,en);input in,en; output out;assign out=en?in
6、:1bz; /若若en=1,out=in; /若若en=0,out为高阻态为高阻态endmodule【例例6-5】三态双向总线缓冲器三态双向总线缓冲器module ttl245(a,b,oe,dir);input oe,dir; /使能信号和方向控制使能信号和方向控制inout7:0 a,b; /双向数据线双向数据线assign a=(oe,dir=2b00)?b:8bz;assign b=(oe,dir=2b01)?a:8bz;endmodule3、数据选择器、数据选择器以以2选选1数据选择器为例,模块和真值表如图数据选择器为例,模块和真值表如图5所示。所示。从模块图,我们可知从模块图,我们
7、可知2选选1数据选择器输入有数据选择器输入有a,b,s,输出为,输出为y,输入与输出关系如真值表所示,当输入与输出关系如真值表所示,当s为为0时,时,y的值为的值为a的值,的值,当当s为为1时,时,y的值为的值为b的值。的值。逻辑电路卡诺图法法a:使用逻辑方程实现的:使用逻辑方程实现的2选选1MUXmodulemux21a(inputwirea,inputwireb,inputwires,outputwirey);assigny=s&a|s&b;endmodule法法b:使用:使用if语句实现的语句实现的2选选1MUXmodulemux21b(inputwirea,inputwireb,inp
8、utwires,outputregy);always(a,b,s)if(s=0)y=a;elsey=b;endmodule法法c:使用:使用if语句实现的语句实现的2选选1MUXmodulemux21c(inputwirea,inputwireb,inputwires,outputregy);always(*)if(s=0)y=a;elsey=b;endmodule法法d:使用:使用“?”实现的实现的2选选1MUXmodulemux21d(inputwirea,inputwireb,inputwires,outputwirey);assigny=s?b:a;endmodule4选选1多路选择器
9、多路选择器4位位2选选1多路选择器多路选择器4、译码器和编码器、译码器和编码器3-8译码器:译码器:for循环循环/例例:3-8译码器译码器moduledecode38b(inputwire2:0a,outputreg7:0y);integeri;always(*)for(i=0;i=7;i=i+1)if(a=i)yi=1;elseyi=0;endmodule译码器译码器8-3编码器编码器8-3编码器:编码器:for循环循环/8-3编码器:编码器:for循环循环moduleencode83b(inputwire7:0x,outputreg2:0y,);integeri;always(*)beg
10、iny=0;for(i=0;i=7;i=i+1)if(xi=1)beginy=i;endendendmodule优先编码器8-3优先编码器优先编码器/8-3优先编码器优先编码器modulepencode83(inputwire7:0x,outputreg2:0y,);integeri;always(*)beginy=0;for(i=0;i=0;i=i-1)bi=bi+1gi;endendmodule6、七段显示管译码电路七段显示管译码电路七段数码管实际上是由7个长条形的发光二极管组成的(一般用a、b、c、d、e、f、g分别表示7个发光二极管),多用于显示字母、数字.Xabcdefg012345
11、6789ABCDEF共阴极【例6-14】七段数码管显示8421BCD码moduleseg7b(led,a_to_g);outputreg6:0a_to_g;input3:0led;/输入的4位BCD码always(*)begincase(led)4b0000:a_to_g=7b1111110;/显示04b0001:a_to_g=7b0110000;/显示14b0010:a_to_g=7b1101101;/显示24b0011:a_to_g=7b1111001;/显示34b0100:a_to_g=7b0110011;/显示44b0101:a_to_g=7b1011011;/显示54b0110:a_
12、to_g=7b1011111;/显示64b0111:a_to_g=7b1110000;/显示74b1000:a_to_g=7b1111111;/显示84b1001:a_to_g=7b1111011;/显示9default:a_to_g=7b0000000;/其他情况不显示endcaseendendmodule7、移位器、移位器四位移位器模块d0moduleshift4(inputwire3:0d,inputwire2:0s,outputreg3:0y);always(*)case(s)0:y=d;/noshift1:y=1b0,d3:1;/shr2:y=d2:0,1b0;/shl3:y=d0,
13、d3:1;/ror4:y=d2:0,d3;/rol5:y=d3,d3:1;/asr6:y=d1:0,d3:2;/ror27:y=d;/noshiftdefault:y=d;endcaseendmodule【例6-15】4位移位器8、算术运算器、算术运算器【例【例6-16】四位二进制数的乘法、除法、求余运算】四位二进制数的乘法、除法、求余运算modulemult4(a,b,c,d,e);inputsigned3:0a,b;outputsigned7:0c;outputsigned3:0d,e;assignc=a*b;assignd=a/b;assigne=a%b;endmodule算术运算仿真波
14、形u从图中可看出,余数的符号与被除数符号一致。6.2基本时序逻辑电路设计基本时序逻辑电路设计时序逻辑是具有状态记忆的电路,其输出不仅依赖于当前的输入,而且依赖于以前的输入。可以使用always块和连续赋值assign语句实现时序电路。一、锁存器和一、锁存器和触发器触发器在数字电路中除了需要进行各种算术运算和逻辑运算,还需要对数据进行存储,目前在半导体存储器中采用的存储单元有锁存器和触发器两类。 锁存器和触发器区别在于触发方式不一样,锁存器没有锁存器和触发器区别在于触发方式不一样,锁存器没有时钟信号控制,而触发器是在时钟信号触发时才能动作的存储时钟信号控制,而触发器是在时钟信号触发时才能动作的存
15、储单元电路。单元电路。50触发器概述一、用于记忆1位二进制信号1. 有两个能自行保持的状态2. 根据输入信号可以置成0或1二、分类 1. 按触发方式(电平,脉冲,边沿) 2. 按逻辑功能(RS, JK, D, T)触发器在置位与清零信号的作用下置1或是置0。工作方式有同步和异步之分。对于同步置位与清零的触发器,其置位和清零信号是在时钟信号的有效沿发挥作用的,描述这样触发器的always块的敏感信号只有时钟,但是在块内总是首先检查置位和清零信号。对于高电平置位清零的同步触发器,有如下格式:always(posedgeclk)beginif(reset)begin/*触发器清零*/endelsei
16、f(set)begin/*触发器置位*/endelsebegin/*时钟逻辑*/endend在异步置位与清零的触发器中,置位与清零信号的作用与时钟信号无关,但是在同步置位与清零的触发器中,置位与清零信号的作用一定等到时钟的有效边沿出现时起作用。对于高电平异步置位和清零的触发器,一般有如下格式:always(posedgeclkorposedgesetorposedgereset)beginif(reset)begin/*置位输出为0*/endelseif(set)begin/*置位输出为1*/endelsebegin/*时钟逻辑*/endend1、RS触发器可称为可称为RS锁存器锁存器RS触发
17、器的Verilog-HDL描述 module RS_FF ( R, S, CLK, Q, QB ); /模块名及参数定义,范围至endmoduleinput R, S, CLK; /输入端口定义output Q, QB; /输出端口定义reg Q; /寄存器定义 assign QB = Q; /assign语句,QB=/Q。always ( posedge CLK ) /在CLK的上跳沿,执行以下语句。case ( R ,S ) /case语句,至于endcase为止。 0: Q = Q; /当R,S的组合为00,则令Q=0。1:Q = 1; /当R,S的组合为01,则令Q=1。2:Q = 0
18、; /当R,S的组合为10,则令Q=0。3:Q = 1bx; /当R,S的组合为11,则令Q为1bit的数,数值为不定(x)。endcase /case语句结束endmodule /模块结束 逻辑功能表逻辑功能表D000010101111特性方程特性方程Qn+1=D状态转换图状态转换图D触发器工作特点:在触发器工作特点:在CP低电平期间存储信号,低电平期间存储信号, 在在CP的上升沿的上升沿(高电平高电平),状态变化。,状态变化。2、D触发器module dtrif (CP, D, Q); input CP; input D; output Q; reg Q; always (CP) begi
19、n if (CP = 1b1) begin Q = D ; end end endmodulemodule dtrif(D,clk,Q,QB); input D,clk; output Q,QB; reg Q; always (posedge clk) case ( D ) 0: Q=0; 1: Q=1; endcase assign QB=Q;endmodule Q=D;例例6-18同步带置数和清零端的同步带置数和清零端的D触发器触发器moduleDffsc(inputwireclk,inputwireclr,inputwireset,inputwireD,outputregq);alway
20、s(posedgeclk)if(set=1)q=1;elseif(clr=1)q=0;elseq=D;endmodule3、JK触发器6364【例6-17】带异步清0/异步置1的JK触发器modulejkff_rs(clk,j,k,q,rs,set);inputclk,j,k,set,rs;outputregq;always(posedgeclk,negedgers,negedgeset)beginif(!rs)q=1b0;elseif(!set)q=1b1;elsecase(j,k)2b00:q=q;2b01:q=1b0;2b10:q=1b1;2b11:q=q;default:q=1bx;e
21、ndcaseendendmodule6.2基本时序电路设计基本时序电路设计二、寄存器二、寄存器寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。工程中的寄存器一般按计算机中字节的位数设计,所以一般有8位寄存器、16位寄存器等。N位寄存器位寄存器【例例6-19】带有异步清零和加载信号的带有异步清零和加载信号的8位寄存器位寄存器moduleregister#(parameterN=8)(inputwireload,inputwireclk,inputwireclr,inputwireN-1:0d,outputregN-1
22、:0q);always(posedgeclkorposedgeclr)if(clr=1)q=0;elseif(load=1)q=d;endmodule【例例6-20】4位移位寄存器位移位寄存器moduleShiftReg(inputwireclk,inputwireclr,inputwiredata_in,outputreg3:0q);/4位移位寄存器位移位寄存器always(posedgeclkorposedgeclr)beginif(clr=1)q=0;elsebeginq3=data_in;q2:0=q3:1;endendendmodule4位环形寄存器位环形寄存器【例例6-21】环形寄
23、存器环形寄存器modulering4(inputwireclk,inputwireclr,outputreg3:0q);always(posedgeclkorposedgeclr)beginif(clr=1)q=1;elsebeginq3=q0;q2:0=q3:1;endendendmodule6.2基本时序电路设计基本时序电路设计三、计数器三、计数器计数是一种最简单基本的运算,计数器就是实现这种运算的逻辑电路,计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能,同时兼有分频功能,计数器是由基本的计数单元和一些控制门所组成,计数单元则由一系列具有存储信息功能的各类触发器
24、构成,这些触发器有RS触发器、T触发器、D触发器及JK触发器等。计数器在数字系统中应用广泛,如在电子计算机的控制器中对指令地址进行计数,以便顺序取出下一条指令,在运算器中作乘法、除法运算时记下加法、减法次数,又如在数字仪器中对脉冲的计数等等。计数器可以用来显示产品的工作状态,一般来说主要是用来表示产品已经完成了多少份的折页配页工作。它主要的指标在于计数器的位数,常见的有3位和4位的。很显然,3位数的计数器最大可以显示到999,4位数的最大可以显示到9999。3位二进制计数器位二进制计数器modulecount3b(inputwireclr,inputwireclk,outputreg2:0q)
25、;/3位计数器位计数器always(posedgeclkorposedgeclr)beginif(clr=1)q=0;elseq=q+1;endendmodule8位二进制计数器位二进制计数器modulecounter#(parameterN=8)(inputwireclr,inputwireclk,outputregN-1:0q);/N-位计数器位计数器always(posedgeclkorposedgeclr)beginif(clr=1)q=0;elseq=q+1;endendmodule【例例】可变模加法可变模加法/减法减法8位二进制计数器位二进制计数器module updown_cou
26、nt(d,clk,clear,load,up_down,qd);input clk,clear,load,up_down;input7:0 d; output7:0 qd; reg7:0 cnt;assign qd=cnt;always (posedge clk)begin if(!clear) cnt=8h00; /同步清同步清0,低电平有效,低电平有效else if(load) cnt=d;/同步预置同步预置else if(up_down) cnt=cnt+1; /加法计数加法计数else cnt=cnt-1; /减法计数减法计数endendmodule模模-5计数器(计数器(5进制计数器
27、)进制计数器)modulemod5cnt(inputwireclr,inputwireclk,outputreg2:0q);/模模-5计数器计数器always(posedgeclkorposedgeclr)beginif(clr=1)q=0;elseif(q=4)q=0;elseq=q+1;endendmodule【例6-22】设计一个带计数使能,异步复位,同步加载的可逆模24计数器。modulecount24(DATA_L,DATA_H,CLK,RST,DIV,CP);outputreg3:0DATA_L,DATA_H;inputCP,CLK,RST,DIV;always(posedgeCL
28、KorposedgeRST)if(RST)DATA_H,DATA_L=0;elseif(CP)DATA_H,DATA_L=DATA_H,DATA_L;elseif(DIV)beginif(DATA_H,DATA_L=8h23)DATA_H,DATA_L=0;elseif(DATA_L=4h9)beginDATA_H=DATA_H+1;DATA_L=0;endelseDATA_H,DATA_L=DATA_H,DATA_L+1;endelsebeginif(DATA_H,DATA_L=)DATA_H,DATA_L=;elseif(DATA_L=)beginDATA_H=DATA_H-1;DATA_
29、L=4h9;endelseDATA_H,DATA_L=DATA_H,DATA_L-1;endendmodule图6-15 24制计数器仿真波形6.2基本时序电路设计基本时序电路设计四、分频器四、分频器分频器可用来降低信号的频率,是数字系统中常用的电路。分频器的输入信号频率fi和输出信号频率fo之比成为分频比。N进制计数器可实现N分频器。分频器设计要考虑频率(即周期)和占空比。分为偶数倍分频和奇数倍分频,等占空比和非等占空比设计。偶数倍分频偶数倍分频(等占空比)(等占空比)法一:法一:N进制计数器实现进制计数器实现偶数倍偶数倍分频器。分频器。【例例6-23】等占空比的八分频器设计等占空比的八分频
30、器设计modulefp8(clk,rst,clk_8);inputclk,rst;outputclk_8;reg2:0q;always(posedgeclk)if(rst)q=0;elseq=q+1;assignclk_8=q2;endmodule【例【例6-23】等占空比的八分频器设计】等占空比的八分频器设计modulefenpin8(clk,reset,clk_8);inputclk,reset;outputclk_8;integerk;regclk_8;always(posedgeclkorposedgereset)if(reset)begink=0;clk_8=0;endelseif(
31、k=3)begink=0;clk_8=clk_8;endelsek=k+1;endmodule法二:可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。偶数倍分频偶数倍分频(非等占空比)(非等占空比)【例例6-24】占空比占空比为为3/8的八分频器设计的八分频器设计modulefenpin8(clk,reset,clk_8);inputclk,reset;outputclk_8;integerk;regclk_8;always(posedgeclkorposedgereset)if(reset
32、)begink=0;clk_8=0;endelseif(k=7)begink=0;clk_8=clk_8;endelseif(k=4)clk_8=clk_8;elsek=k+1;endmodule奇奇数倍分频数倍分频(等占空比)(等占空比)可采用如下的方法:用两个计数器,一个由输入时钟的上升沿触发,另可采用如下的方法:用两个计数器,一个由输入时钟的上升沿触发,另一个由输入时钟的下降沿触发,最后将两个计数器的输出相或,即可得一个由输入时钟的下降沿触发,最后将两个计数器的输出相或,即可得到占空比为到占空比为50%的方波波形。如的方波波形。如下下例所示,用例所示,用parameter语句定义了语句定
33、义了参数参数NUM,这样只需要改,这样只需要改NUM的赋值(的赋值(NUM应赋奇数值),就可以得应赋奇数值),就可以得到任意模的奇数分频器。到任意模的奇数分频器。【例例6-25】等等占空比的占空比的13分频器设计分频器设计modulecount_num(reset,clk,cout);parameterNUM=13;inputclk,reset;outputwirecout;reg4:0m,n;regcout1,cout2;assigncout=cout1|cout2;always(posedgeclk)beginif(!reset)begincout1=0;m=0;endelsebegini
34、f(m=NUM-1)beginm=0;cout1=cout1;endelseif(m=(NUM-1)/2)cout1=cout1;elsem=m+1;endendalways(negedgeclk)beginif(!reset)begincout2=0;n=0;endelsebeginif(n=NUM-1)beginn=0;cout2=cout2;endelseif(n=(NUM-1)/2)cout2=cout2;elsen=n+1;endendendmodule五五 脉冲信号发生器脉冲信号发生器1、设计并实现一个同步设计并实现一个同步单脉冲发生器单脉冲发生器。2、设计一个设计一个节拍脉冲发生
35、器节拍脉冲发生器,当按下,当按下start键时,循键时,循环产生四个节拍脉冲,当按下环产生四个节拍脉冲,当按下stop键时,停止产生节拍键时,停止产生节拍脉冲,当按下脉冲,当按下step键时,只产生一组四个节拍脉冲。键时,只产生一组四个节拍脉冲。1.理解同步单脉冲发生器理解同步单脉冲发生器同步单脉冲发生器就是能同步单脉冲发生器就是能发出单个同步脉冲的线路发出单个同步脉冲的线路。它的输入是一串连续脉冲它的输入是一串连续脉冲M,它的输出受开关,它的输出受开关PUL的控的控制,每当按一次开关后,制,每当按一次开关后,Q端输出一个与输入脉冲的周端输出一个与输入脉冲的周期和时间期和时间(相位相位)同步的
36、脉冲。同步的脉冲。图 1 无抖动仿真波形图 2 有抖动仿真波形图 3 模块图【例例6-26】同步单脉冲发生器实现方法同步单脉冲发生器实现方法原理图设计原理图设计 【例例6-27】同步单脉冲发生器实现方法同步单脉冲发生器实现方法VerilogHDL语言设计语言设计 module p1(inp,cclk,clr,outp);input inp,cclk,clr;output outp;reg delay1;reg delay2;always(posedge cclk or posedge clr)beginif(clr=1)begin delay1=0; delay2=0;endelsebegin
37、 delay1=inp; delay2=delay1;endendassign outp=delay1&delay2; endmodule u仿真仿真分析分析 仿真时间:仿真时间:010sM周期:周期:1ms,频率:,频率:1khz PUL开关:闭合时间开关:闭合时间0.1s u消抖消抖 当按下当按下FPGA开发板上的任何按钮,在它们稳定下来之前都会有几开发板上的任何按钮,在它们稳定下来之前都会有几毫秒的轻微抖动。这就意味着输入到毫秒的轻微抖动。这就意味着输入到FPGA的并不是清晰的从的并不是清晰的从0到到1的变的变化,而可能是在几毫秒的时间里从化,而可能是在几毫秒的时间里从0到到1来回的抖动
38、。在时序电路中,当来回的抖动。在时序电路中,当在一个时钟信号上升沿到来时发生这种抖动,将是一个严重的问题。因在一个时钟信号上升沿到来时发生这种抖动,将是一个严重的问题。因为时钟信号改变的速度要比开关抖动的速度快,这将可能把错误的值所为时钟信号改变的速度要比开关抖动的速度快,这将可能把错误的值所存到寄存器中。所以,当在时序电路中使用按钮开关时,消除它们的抖存到寄存器中。所以,当在时序电路中使用按钮开关时,消除它们的抖动时非常必要的。动时非常必要的。 u抖动要求抖动要求 (1) 如果有抖动,必须采用至少3级延迟(3个D触发器)消抖;(2) 输入脉冲M频率不应太大,一般小于1Khz ,否则抖动不易消
39、除 2.理解节拍脉冲发生器理解节拍脉冲发生器节拍脉冲发生器用来产生计算机工作所需的节拍脉冲。节拍脉冲发生器用来产生计算机工作所需的节拍脉冲。(1)节拍脉冲发生器的实现方法)节拍脉冲发生器的实现方法【例6-28】节拍脉冲发生器设计moduletime_pluse(clk,start,step,stop,p);inputclk,start,step,stop;outputreg3:0p;reg1:0m;always(posedgeclk)if(start)beginm=2b10;p=4b0001;endelseif(step)beginm=2b01;p=4b0001;endelseif(stop)
40、beginm=0;p=0;endelseif(m=2b10)p=p2:0,p3;elseif(m=2b01)p=p1;elsep=0;endmodule6 脉冲宽度调制器脉冲宽度调制器(PWM)图6-24 PWM信号PWM控制脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要的波形(含形状和幅值), PWM控制技术在逆变电路中应用最广,应用的逆变电路绝大部分是PWM型,广泛应用在从测量、通信到功率控制与变换的许多领域中。1.使用PWM控制一个直流电机的转速PWM可以应用在许多方面,如电机调速、温度控制、压力控制等。在PWM驱动控制的调整系统中,按一个固定的频率来接通和断开电源
41、,并根据需要改变一个周期内“接通”和“断开”时间的长短。通过改变直流电机电枢上电压的“占空比”来改变平均电压的大小,从而控制电动机的转速。因此,PWM又被称为“开关驱动装置”。图6-24所示的PWM信号的平均直流值和占空比是成比例的。100%的占空比将会使得PWM信号的直流值达到最大,50%的占空比将会使得PWM信号的直流值等于最大值的一半。如果通过电动机的电压和PWM信号是成正比的,那么只要简单的更改一下脉冲宽度,则占空比随之改变,从而就可以改变电动机的转速。【例6-29】PWM信号控制直流电机module zl(input clk, input rst, input 1:0sel, out
42、put reg pwm);reg 11:0 cnt,duty;always (posedge clk,posedge rst) if(rst) cnt=0; else cnt=cnt+1; /周期为4028个clk脉冲always (sel) case(sel) 2b00:duty=12d2048; /占空比为1/2 2b01:duty=12d1024; /占空比为1/4 2b10:duty=12d3072; /占空比为3/4 2b11:duty=12d0; /占空比为0,停止转动 endcasealways(*)if(cntAB-B-BC-C-CD-D-DA。十六进制二进制通电状态1H000
43、1A3H0011AB2H0010B6H0110BC4H0100CCH1100CD8H1000D9H1001DA表6-2 电机正转时,FPGA四位I/O口的值【例6-30】PWM信号控制步进电机module bj(clk,rst,dir,dcba); /clk为可控制电机转速input clk,rst,dir; /dir控制电机顺时针转,还是逆时针转动output reg3:0 dcba; /单、双八拍工作方式,四相输出reg 2:0 state;always (posedge clk,posedge rst)if(rst) begin dcba=0; state=0;endelse begin
44、 if(dir) state=state+1; else state=state-3b001;case(state) 3b000:dcba=4b0001; 3b001:dcba=4b0011; 3b010:dcba=4b0010; 3b011:dcba=4b0110; 3b100:dcba=4b0100; 3b101:dcba=4b1101; 3b110:dcba=4b1000; 3b111:dcba=4b1001;endcaseendendmodule6.3有限状态机设计有限状态机设计有限状态机(FiniteStateMachine,FSM)是时序电路设计中经常采用的一种方式,尤其适合设计数
45、字系统的控制模块,在一些需要控制高速器件的场合,用状态机进行设计是一种很好的解决问题的方案,具有速度快、结构简单、可靠性高等优点。有限状态机非常适合用FPGA器件实现,用VerilogHDL的case语句能很好地描述基于状态机的设计,再通过EDA工具软件的综合,一般可以生成性能极优的状态机电路,从而使其在执行时间、运行速度和占用资源等方面优于用CPU实现的方案。108有限状态机可以认为是组合逻辑和寄存器逻辑的特殊组合,它一般包括组合逻辑和寄存器逻辑两部分,寄存器逻辑用于存储状态,组合逻辑用于状态译码和产生输出信号。根据输出信号产生方法的不同,状态机可分为两类:摩尔型(Moore)和米里型(Me
46、aly)。Moore型状态机的输出只和当前状态有关,和输入无关。Mealy型状态机的输出是由当前状态和输入共同决定。如图1和2所示。109图1 摩尔型(Moore)状态机图2 米里型(Mealy)状态机110VerilogHDL描述状态机代码时应该注意约定:(1)每一个模块只描述一个状态机。(2)使用参数定义状态编码,而不是使用宏定义define。(3)在参数定义后,立刻定义现在状态state与次态next信号。(4)所有时序always块使用非阻塞赋值。(5)所有组合always块使用阻塞赋值。(6)组合always块敏感信号列表中的信号为引起状态变化和组合always块的所有输入。(7)在
47、组合always块的顶部应该给出当前次态的缺省值。(8)缺省输出赋值应该优先case语句。111使用VerilogHDL语言设计状态机的步骤:(1)将实际问题抽象成状态图分析实际问题,找出输入信号、输出信号,最好画出一个具有输入和输出的框图,要给输入、输出信号取字母名。取状态机上电的状态为初始状态,并由此状态开始,根据输入条件决定状态机的次态及输出,直至所有情况描绘素完毕,画出完整的状态图。(2)定义变量定义描写次态逻辑、状态寄存器中需要的变量,注意在always块中使用的变量应该定义成寄存器变量,而连续赋值语句中使用的变量应该定义成连线变量。(3)状态编码根据状态图选择状态变量,进行状态编码
48、,虽然有多种编码方式,但可以找一种编码试一试。例如,使用自然二进制码。(4)描写次态逻辑使用always块或是连续赋值语句描写次态逻辑。112(5)描写状态寄存器使用always块描写状态寄存器。(6)描写输出逻辑使用always块或是连续赋值语句描写输出逻辑(输出逻辑可以与次态逻辑在一个块中描述)。(7)仿真根据状态机输入信号的要求,用图形或文本方式编辑输入信号波形,然后进行功能仿真,根据仿真结果的正确与否决定是否修改设计,例如在状态转换时出现不该有的尖峰脉冲,则可以更改状态编码试一试。如果仿真成功,就可以在引脚锁定后,进行编译形成文件下载到芯片中,试一试是否成功。(1)用三个过程描述:即现
49、态()用三个过程描述:即现态(CS)、次态()、次态(NS)、)、输出逻辑(输出逻辑(OL)各用一个)各用一个always过程描述。过程描述。(2)双过程描述()双过程描述(CS+NS、OL双过程描述):使用两双过程描述):使用两个个always过程来描述有限状态机,一个过程描述现态和次过程来描述有限状态机,一个过程描述现态和次态时序逻辑(态时序逻辑(CS+NS);另一个过程描述输出逻辑();另一个过程描述输出逻辑(OL)。)。(3)双过程描述()双过程描述(CS、NS+OL双过程描述):一个过双过程描述):一个过程用来描述现态(程用来描述现态(CS);另一个过程描述次态和输出逻辑);另一个过
50、程描述次态和输出逻辑(NS+OL)。)。(4)单过程描述:在单过程描述方式中,将状态机的现)单过程描述:在单过程描述方式中,将状态机的现态、次态和输出逻辑(态、次态和输出逻辑(CS+NS+OL)放在一个)放在一个always过程过程中进行描述。中进行描述。相应的,在用相应的,在用Verilog HDL描述的有限状态机时,有以下描述的有限状态机时,有以下几种描述方式。几种描述方式。【例【例6-31】“101”序列检测器的序列检测器的Verilog描述(三个过程)描述(三个过程) module fsm1_seq101(clk,clr,x,z);input clk,clr,x; output reg
51、 z; reg1:0 state,next_state;parameter S0=2b00,S1=2b01,S2=2b11,S3=2b10; /*状态编码,采用格雷(状态编码,采用格雷(Gray)编码方式)编码方式*/always (posedge clk or posedge clr) /*该过程定义当前状态该过程定义当前状态*/beginif(clr) state=S0; /异步复位,异步复位,s0为起始状态为起始状态else state=next_state;endalways (state or x) /*该过程定义次态该过程定义次态*/begincase (state)S0:begi
52、n if(x) next_state=S1;else next_state=S0; endS1:beginif(x) next_state=S1;else next_state=S2; end6.3.1 6.3.1 序列检测器设计序列检测器设计S2:beginif(x) next_state=S3;else next_state=S0; endS3:beginif(x) next_state=S1;else next_state=S2; enddefault:next_state=S0; /*default语句语句*/endcaseendalways (state) /*该过程产生输出逻辑该过
53、程产生输出逻辑*/begin case(state)S3: z=1b1;default:z=1b0;endcaseendendmodule“101”序列检测器的序列检测器的Verilog描述(三个过程)描述(三个过程)“101”序列检测器(单过程描述)序列检测器(单过程描述) module fsm4_seq101(clk,clr,x,z);input clk,clr,x; output reg z; reg1:0 state;parameter S0=2b00,S1=2b01,S2=2b11,S3=2b10;/*状态编码,采用格雷(状态编码,采用格雷(Gray)编码方式)编码方式*/alway
54、s (posedge clk or posedge clr)Begin if(clr) state=S0; /异步复位,异步复位,s0为起始状态为起始状态else case(state)S0:begin if(x) begin state=S1; z=1b0;endelse begin state=S0; z=1b0;end endS1:begin if(x) begin state=S1; z=1b0;endelse begin state=S2; z=1b0;end endS2:beginif(x) begin state=S3; z=1b0;endelse begin state=S0;
55、 z=1b0;end endS3:begin if(x) begin state=S1; z=1b1;endelse begin state=S2; z=1b1;end enddefault:begin state=S0; z=1b0;end /*default语句语句*/endcaseendendmodule6.3.2 流水灯控制器设计S0S1S2S3S4S5S6S700000001 00000011 00000111 00001111 00011111 00111111 01111111 11111111图6-33 流水灯状态转移图 根据流水灯的特点,用有限状态机设计方法实现,需要8个状态
56、(S0S7),每个状态表示的灯的状态如表6-4所列。流水灯状态转移图如图6-33所示。表6-4 流水灯各状态取值情况表【例6-32】实现8个LED灯按固定频率依次点亮。(f=1Hz)module led3(input clk, output reg7:0 led);reg state;parameter 2:0 s0=3d0,s1=3d1,s2=3d2,s3=3d4,s4=3d5,s5=3d6,s6=3d7;always (posedge clk)case(state)s0:state=s1;s1:state=s2;s2:state=s3;s3:state=s4;s4:state=s5;s5:
57、state=s6;s6:state=s7;s7:state=s0;default:state=s0;endcasealways (state)s0:led=8b00000001;s1:led=8b00000011;s2: led=8b00000111;s3: led=8b00001111;s4: led=8b00011111;s5: led=8b00111111;s6: led=8b01111111;s7: led=8b11111111;default:led=8b0;endmodule6.3.3 交通灯控制器设计以单通道机动车灯为例,进行交通灯控制器设计。要求南北方向,初始状态为绿灯,绿灯停
58、留6秒变为黄灯,黄灯停留4秒变为红灯,红灯停留6秒变为绿灯,如此反复。以单通道机动车灯为例,进行交通灯控制器设计。要求南北方向,初始状态为绿灯,绿灯停留6秒变为黄灯,黄灯停留4秒变为红灯,红灯停留6秒变为绿灯,如此反复。GREEN绿灯初始状态6sYELLOW黄灯显示状态4sRED红灯显示状态6s表6-5单通道南北方向状态表【例6-33】程序示例module traffic(input clk, input rst, output reg 2:0led);reg 1:0 state;parameter GREEN=2b00,YELLOW=2B01,RED=2B10;reg2:0 i;always
59、 (posedge clk ) /CS+NS,现态和次态用同一个变量state表示 if(rst) begin state=GREEN;i=0;end else case(state) GREEN:if(i5) /6秒内为绿灯 begin state=GREEN;i=i+1;end else begin state=YELLOW;i=0;end /6秒后跳转到黄灯 YELLOW:if(i3) /4秒内为黄灯 begin state=YELLOW;i=i+1;end else begin state=RED;i=0;end /4秒后跳转到红灯 RED:if(i5) /6秒内为红灯 begin s
60、tate=RED;i=i+1;end else begin state=GREEN;i=0;end /6秒后跳转到绿灯 default:state=2b11; endcasealways (state) /OL描述,三个LED灯输出状态 case(state) GREEN:led=3b100; YELLOW:led=3b010; RED:led=3b001;default:led=0; endcaseendmodule图6-37 仿真波形图6.4 多层次结构电路的设计多层次结构电路的设计u如如果果数数字字系系统统比比较较复复杂杂,可可采采用用“Top-down”的的方方法法进进行行设设计计。首
61、首先先把把系系统统分分为为几几个个模模块块,每每个个模模块块再再分分为为几几个个子子模模块块,以以此此类类推推,直直到到易易于于实实现现为为止止。这这种种“Top-down”的的方方法法能能够够把把复复杂杂的的设设计计分分解解为为许许多多简简单单的的逻逻辑辑来来实实现现,同同时时也也适适合合于于多多人人进进行行分分工工合合作作,如如同同用用C语语言言编编写写大大型型软软件件一一样样。Verilog语语言能够很好地支持这种言能够很好地支持这种“Top-down”的设计方法的设计方法u多多层层次次结结构构电电路路的的描描述述既既可可以以采采用用文文本本方方式式,也也可可以以用用图图形形和和文文本本
62、混混合合设设计计的的方方式式。用用一一个个8位位累累加加器器的的设设计计为为例例来来说说明这两种设计方式。明这两种设计方式。1图形与文本混合设计图形与文本混合设计 8位全加器位全加器module add8(sum,cout,b,a,cin);output7:0 sum;output cout;input7:0 a,b;input cin;assign cout,sum=a+b+cin;endmodule8位寄存器位寄存器module reg8(qout,in,clk,clear);output7:0 qout;input7:0 in;input clk,clear;reg7:0 qout;al
63、ways (posedge clk or posedge clear)beginif(clear) qout=0; /异步清异步清0else qout=in;endendmodule2文本设计文本设计module acc(ACCOUT,COUT,ACCIN,CIN,CLK,CLEAR);output7:0 ACCOUT;output COUT;input7:0 ACCIN;input CIN,CLK,CLEAR;wire7:0 SUM;add8 accadd8(SUM,COUT,ACCOUT,ACCIN,CIN); /调用调用add8子模块子模块reg8 accreg8(ACCOUT,SUM,
64、CLK,CLEAR); /调用调用reg8子模块子模块endmodule累加器顶层文本描述累加器顶层文本描述 对对于于上上面面的的模模块块调调用用,可可采采用用位位置置对对应应的的方方式式,即即调调用用时时模模块块端端口口列列表表中中信信号号的的排排列列顺顺序序与与模模块块定定义义时时端端口口列列表表中中的的信信号号排排列列顺顺序序相相同同;也也可可以以采采用用信信号号名名对对应应方方式式,此此时时不不必必按按顺顺序,例如上面对序,例如上面对reg8的调用:的调用:module reg8(qout,in,clk,clear);/reg8的模块声明的模块声明reg8 accreg8(accout
65、,sum,clk,clear); /调用方式调用方式1,位置对应,位置对应reg8 accreg8(.qout(ACCOUT),.clear(CLEAR), .in(SUM),.clk(CLK);/调用方式调用方式2,信号名对应,信号名对应模块调用模块调用习习 题题 66.1 Verilog支持哪几种描述方式,各有什么特点?支持哪几种描述方式,各有什么特点?6.2 分别用结构描述和行为描述方式设计一个基本的分别用结构描述和行为描述方式设计一个基本的D触发器,在此基础上,采用结构描述的方式,用触发器,在此基础上,采用结构描述的方式,用8个个D触发器构成一个触发器构成一个8位移位寄存器。位移位寄存
66、器。6.3 分别用结构描述和行为描述方式设计一个分别用结构描述和行为描述方式设计一个JK触发器,触发器,并进行综合。并进行综合。6.4 试编写同步模试编写同步模5计数器程序,有进位输出和异步复计数器程序,有进位输出和异步复位端。位端。6.5 编写编写4位串位串/并转换程序。并转换程序。6.6 编写编写4位并位并/串转换程序。串转换程序。6.7 编写编写4位除法电路程序。位除法电路程序。6.8用用Verilog编写一个将带符号二进制数的编写一个将带符号二进制数的8位原码位原码转换成转换成8位补码的电路,并基于位补码的电路,并基于Quartus软件进软件进行综合和仿真。行综合和仿真。6.9编写一个编写一个8路彩灯控制程序,要求彩灯有以下路彩灯控制程序,要求彩灯有以下3种种演示花型。演示花型。(1)8路彩灯同时亮灭;路彩灯同时亮灭;(2)从左至右逐个亮(每次只有)从左至右逐个亮(每次只有1路亮);路亮);(3)8路彩灯每次路彩灯每次4路灯亮,路灯亮,4路灯灭,且亮灭相间,路灯灭,且亮灭相间,交替亮灭;交替亮灭;在演示过程中,只有当一种花型演示完毕才能转向其在演示过程中,只有当一种花型演示完毕才能转向其他演示花型。他演示花型。