第四章verilog...
TRANSCRIPT
武汉大学物理科学与技术学院微电子系 常胜
第四章 Verilog HDL电路设计
武汉大学物理科学与技术学院微电子系 常胜
§4.1 组合逻辑设计e.g. 1全加器(1位)(通
过此简单例子理解思想)① 由真值表门级设计
武汉大学物理科学与技术学院微电子系 常胜
门数多,Verilog成为纯输入工具。
武汉大学物理科学与技术学院微电子系 常胜
② 由逻辑组构设计全加器=半加器+进位电路
稍简,体现了对电路的理解,位操作,仍是门级设计思想
武汉大学物理科学与技术学院微电子系 常胜
module�full_adder(a,b,cin,sum,cout);input�a,b,cin;output�sum,cout;wire��sum,cout;
always@(a�or�b�or�cin)beginsum=a^b^c;cout=(a&b)|(b&cin)|(cin&a);
endendmodule
武汉大学物理科学与技术学院微电子系 常胜
③ 由Verilog加法语句设计module��full_adder(a,b,cin,sum,cout);input�a,b,cin;output�sum,cout;wire�sum,cout;always@(a�or�b�or�cin)begin�sum=a+b+cin;if((a&&b)||(b&&cin)||(cin&&a))cout=1;
else�cout=0;end
endmodule
虽与②在语句上区别不大,但已脱离门级,进入逻辑设计
问题:进位电路不适合多位加法(如a、b均为两位)
武汉大学物理科学与技术学院微电子系 常胜
④ 最优方法module�full_adder(a,b,cin,sum,cout);input�a,b,cin;output�sum,cout;wire�sum,cout;assign�{cout,sum}=a+b+cin;
endmodule
武汉大学物理科学与技术学院微电子系 常胜
多位时module�full_adder(a,b,cin,sum,cout);input�[2:0]�a,b;input�cin;output�cout;output�[2:0]�sum;wire�[2:0]�sum;wire�cout;assign�{cout,sum}=a+b+cin;
endmodule
位的改变只需改变输入,输出信号的位宽,逻辑关系不变。
问题:多位时,随着位宽的加大,由于等待低位进位的结果,运算周期增长,速度降低。如何解决?
提示:根据速度与面积的折中,牺牲面积来提升速度
探索:超前进位加法器的结构与设计
武汉大学物理科学与技术学院微电子系 常胜
小结:注意描述电路的层次!
武汉大学物理科学与技术学院微电子系 常胜
e.g.2�稍复杂的组合电路(带高阻输出的译码器,实现a、b两种方案的译码)
译a1
译b2
en2
data_in
4
temp
4out
en
s_flag2-4译码器a:高电平选
b:低电平选
武汉大学物理科学与技术学院微电子系 常胜
module�decoder(data_in,data_out,s_flag,en);input�[1:0]�data_in;input�s_flag,en;output�[3:0]�data_out;wire�[3:0]�data_out;wire�[3:0]�temp;always@(data_in�or�s_flag)if(s_flag)case�(data_in)2'b00:temp=4'b0001;2'b01:temp=4'b0010;
武汉大学物理科学与技术学院微电子系 常胜
2'b10:temp=4'b0100;2'b11:temp=4'b1000;
endcaseelse
case(data_in)2'b00:temp=4'b1110;2'b01:temp=4'b1101;2'b10:temp=4'b1011;2'b11:temp=4'b0111;
endcaseassign�data_out=(en)?temp:4'bz;
endmodule另外的描述方式??
武汉大学物理科学与技术学院微电子系 常胜
采用HDL描述数字电路的步骤:分析系统要求;划分功能结构;做出结构示意图;采用HDL语言实现结构示意图中各模块;仿真验证逻辑功能;……
小结:画出电路结构图!
武汉大学物理科学与技术学院微电子系 常胜
§4.2 时序电路设计一、分频器A、 20/10偶数分频器
20分频
10分频
选择
control
clk
武汉大学物理科学与技术学院微电子系 常胜
module��div(iclk,oclk,control,rst_);input��iclk,control,rst_;output��oclk;reg��oclk;reg��[3:0]�count;always@(posedge�iclk�or�negedge�rst_)if(!rst_)count<=4'd0;
else�if(count<9)count<=count+1;
elsecount<=4'd0;
武汉大学物理科学与技术学院微电子系 常胜
always@(posedge iclk or�negedge rst_)if(!rst_)oclk<=1'd0;���
else�if�(control)if((count==5)||(count==0))
oclk<=~oclk;else;
elseif(!count)oclk<=~oclk;
else;endmodule 小结:结合电路特点优化设计!
武汉大学物理科学与技术学院微电子系 常胜
B、3奇数分频器module�div3(clk,clk1,clk3,state);input�clk;output�clk1;output�clk3;output�[3:0]�state;parameter��
S1=4'b0001,S2=4'b0010,S3=4'b0100,IDLE=4'b0000;�
reg�clkA;reg�clkB;reg�[3:0]�state;reg�[3:0]�next_state;
武汉大学物理科学与技术学院微电子系 常胜
assign�clk1=~clk;assign�clk3=clkA|clkB;
always�@(negedge�clk)state<=next_state;
always�@(state)case(state)
S1:�next_state=S2;S2:�next_state=S3;S3:�next_state=S1;����������������������IDLE:�next_state=S1;default:�next_state=IDLE;
endcase�
武汉大学物理科学与技术学院微电子系 常胜
always@(negedge�clk)if�((state==S1)|(state==S2))�
clkA<=~clkA;���always@(negedge�clk1)
if�((state==S1)|(state==S2))�clkB<=~clkB;���
endmodule
时钟信号的相位变化及信号的组合操作来构建合适的信号相位
武汉大学物理科学与技术学院微电子系 常胜
二、移位寄存器(序列检测器)(如检测10101010序列侦头探测器)
移位寄存器 比较器
输出
enable
dout
din
武汉大学物理科学与技术学院微电子系 常胜
module��shifter(din,clk,rst_,dout,enable);input��din,clk,rst_;output��dout,enable;reg��dout,enable;reg�[7:0]�temp;�
always@(posedge�clk�or�negedge�rst_)if(!rst_)
temp<=8'd0;else
temp<={temp[6:0],din};always@(posedge�clk�or�negedge�rst_)
if(!rst_)enable<=1'b0;
else�if(temp==8'b10101010)enable<=1'b1;
else;
武汉大学物理科学与技术学院微电子系 常胜
always@(posedge�clk�or�negdge�rst_)if(!rst_)
dout<=1'd0;else��if�((temp==8'b10101010)||enable)
dout<=din;else�
dout<=1'd0;endmodule
!!输出的另外写法
武汉大学物理科学与技术学院微电子系 常胜
小结:逻辑细节的准确控制!
武汉大学物理科学与技术学院微电子系 常胜
三、同步fifo(first in first out)fifo:�先入先出存储器,有缓冲、临时存储作用,是通信芯片中的常用部件。同步fifo:�读写指针都在同一时钟信号的控制下。fifo要求:�不能同时对同一单元进行读写操作,设置empt,full标志,给外界提供信号,避免写满和读空。
rp
wp
武汉大学物理科学与技术学院微电子系 常胜
module�fifo(clk,rst_,din,dout,empt,full);input�clk,rst_;input�[7:0]�din;output�[7:0]�dout;�����output�empt,full;reg�[7:0]�dout;reg�empt,full;reg�[7:0]�rams�[127:0];reg�[6:0]�wp,rp;integer�i;
武汉大学物理科学与技术学院微电子系 常胜
always@(posedge�clk�or�negedge�rst_)if�(!rst_)
wp<=7'b1111111;else�if�(!full)
wp<=wp+1'b1;else;
always@(posedge�clk�or�negedge�rst_)if(!rst_)�rp<=7'b100000;�//与wp差一半
else�if�(!empt)rp<=rp+1'b1;
else;
武汉大学物理科学与技术学院微电子系 常胜
always@(posedge�clk�or�negedge�rst_)if(!rst_)for(i=0;i<=128;i=i+1)rams[i]<=8'd0;
else�if(!full)rams[wp]<=din;
else;always@(posedge�clk�or�negedge�rst_)
if(!rst_)dout<=8'd0;
else�if(!empt)dout<=ram[rp];
else;
武汉大学物理科学与技术学院微电子系 常胜
always@(posedge clk or�negedge rst_)��if(!rst_)empt<=1'b0;
else��if(wp==rp+1)�//读空empt<=1'b1;
else��empt<=1'b0;always@(posedge clk or�negedge rst_)if(!rst_)
full<=1'd0;else�if(rp==wp+1)
full<=1'b1;else
full<=1'b0;endmodule
小结:清晰的变量赋值结构!
武汉大学物理科学与技术学院微电子系 常胜
问题:此同步fifo无实际意义!同频读出写入不会发生空、满问题本不需fifo
发展:1、读出、写入仍同步。同基频但受其它信号控制,这样就
会出现空、满状况。2、异步fifo,读写不同时钟,会出现空满问题。①规则时钟:统一使用快时钟比较是不会出错的,只会出
现空满中的一种情况。②不规则时钟:出现问题-比较出错。因为:rp、wp由
时钟沿控制改变,若两时钟沿接近,比较时rp、wp尚未稳定,出现比较出错,空、满出错,数据出错。
武汉大学物理科学与技术学院微电子系 常胜
解决办法:高位比较,空出位数大于最大频率差的两倍,这样就算出错,也有再次正确的机会(因为连续两次边沿都很接近的比例很小,可以忽略)e.g:wp[6:4]+1;
武汉大学物理科学与技术学院微电子系 常胜
四、有限状态机(FSM,finite States Machine)有限状态机是由寄存器组和组合逻辑构成的硬件时序电路。寄存器组的状态(即由寄存器组的“0”和“1”的组合状态所构成的有限状态。e.g:3位寄存器组共8个状态)只能在同一时钟跳变的情况下才能从一个状态转向另一个状态。有限状态机究竟转向哪个状态,如果只由当前状态决定的称为moore型有限状态机;如还取决于当前的输入值则称为mealy型有限状态机。
武汉大学物理科学与技术学院微电子系 常胜
moore型原则上都可以转化为mealy型
武汉大学物理科学与技术学院微电子系 常胜
e.g.1:用状态机对10101010序列帧头探测器改写module�searcher�(din,clk,rst_,dout,enable);input��din,clk,rst_;output�dout,enable;reg�dout,enable;reg�[3:0]�state,�next_state;parameter�
IDLE=4'b0,FIRST=4'b0001,SECOND=4'b0010,THIRD=4'b0011,FOURTH=4'b0100,FIFTH=4'b0101,SIXTH=4'b0110,SEVENTH=4'b0111,EIGHTH=4'b1000;
武汉大学物理科学与技术学院微电子系 常胜
always@(posedge�clk�or�negedge�rst_)if�(!rst_)state<=IDLE;
elsestate<=next_state;
always@(state�or�din�or�rst_)�//组合逻辑,不生成registerif(!rst_)next_state=IDLE;
elsecase(state)IDLE:if(din==1)�next_state=FIRST;
else�next_state=IDLE;
武汉大学物理科学与技术学院微电子系 常胜
FIRST:�if(din==0)�next_state=SECOND;else��next_state=FIRST;
SECOND:�if(din==1)�next_state=THIRD;else��next_state=IDLE;
THIRD:�if(din==0)�next_state=FOURTH;else��next_state=FIRST;
FOURTH:�if(din==1)�next_state=FIFTH;else��next_state=IDLE;
FIFTH:�if(din==0)�next_state=SIXTH;else��next_state=FIRST;
SIXTH:�if(din==1)�next_state=SEVETH;else�next_state=IDLE;
武汉大学物理科学与技术学院微电子系 常胜
SEVENTH:�if(din==0)�next_state=EIGHTH;else�next_state=FIRST;
EIGHTH:�if(din==1)�next_state=FIRST;else�next_state=IDLE;
default:�next_state=IDLE;endcasealways@(posedge�clk�or�negedge�rst_)if(!rst_)enable<=1'b0;
else�if(state==EIGHTH)enable<=1'b1;
else;
武汉大学物理科学与技术学院微电子系 常胜
always@(posedge�clk�or�negedge�rst_)if(!rst_)dout<=1'b0;
else�if((state==EIGHTH)||(enable==1))dout<=din;
elsedout<=1'b0;
endmodule
小结:有限状态机的标准化描述!
武汉大学物理科学与技术学院微电子系 常胜
e.g.2 三相磁阻式转子步进电机脉冲分配器设计背景说明
步进电机是一种十分重要的自动化执行元件,它和数字系统结合可以把脉冲数转化为角位移,从而实现自动化控制。三相磁阻式转子步进电机在定子上有三个控制绕组,当三相控制绕组轮流接通驱动脉冲信号时,定子上就轮流产生磁场,吸引转子转动。转子每次转动角度称为步距,每给一相绕组通电一次称为一拍。给三相绕组通电的常用方式有:单三拍、双三拍和六拍。三拍方式通电时步距为3°,六拍方式通电时步距为1.5°。控制三相绕组通电的次序,就能使电机正转或反转;控制通电信号的频率,就能控制电机的转速。
武汉大学物理科学与技术学院微电子系 常胜
三种通电方式的绕组通电次序如下:A B C
AB BC CA
A B C
AB BC CA
A AB B BC C CA
A AB B BC C CA
正转 反转
正转
正 转
反转
反 转
武汉大学物理科学与技术学院微电子系 常胜
功能说明设计三相磁阻式转子步进电机控制器产生对A/B/C三相绕组的控制信号在控制信号控制下分别完成三相双三拍正转和三相六拍反转
做出状态跳变图(通电为1,不通电为0)
武汉大学物理科学与技术学院微电子系 常胜
端口说明输入信号:rst_��复位信号,低电平有效
clk��时钟信号mode��控制信号,1三相双三拍正转,0三
相六拍反转输出信号:outa�a绕组驱动信号
outb�b绕组驱动信号outc�c绕组驱动信号
武汉大学物理科学与技术学院微电子系 常胜
代码:module�step_engineer(clk,rst_,mode,outa,outb,outc);input�clk,rst_,mode;output�outa,outb,outc;reg�outa,outb,outc;reg�[2:0]�state,next_state;parameter�IDLE=3'b000,�A=3'b100,�B=3'b010,�C=3'b001,�
AB=3'b110,�BC=3'b011,�CA=3'b101;always@(posedge�clk�or�negedge�rst_)if(!rst_)state<=IDLE;
elsestate<=next_state;
武汉大学物理科学与技术学院微电子系 常胜
always@(state�or�rst_�or�mode)if(!rst_)next_state=IDEL;
else�if(mode)case(state)IDLE:�next_state=AB;AB:�next_state=BC;BC:�next_state=CA;CA:�next_state=AB;default:�next_state=IDLE;
endcase
武汉大学物理科学与技术学院微电子系 常胜
elsecase(state)IDLE:�next_state=A;A:�next_state=CA;CA:�next_state=C;C:�next_state=BC;BC:�next_state=B;B:�next_state=AB;AB:�next_state=A;default:�next_state=IDLE;
endcase
武汉大学物理科学与技术学院微电子系 常胜
always@(posedge�clk�or�negedge�rst_)if(!rst_){outa,outb,outc}<=3'd0;else{outa,outb,outc}<=state;
endmodule
小结:结合需求规划设计结构!
武汉大学物理科学与技术学院微电子系 常胜
§4.3 设计中的规范及约定一、命名的习惯
用有意义而有效的名字:din/dout,�not�a/b用连贯的缩写:addr-address,pntr-pointer,clk-clock,rst-reset最右边字符后添加下划线代表低电平有效,高电平有效的信号不添加下划线表示。rst_大小写原则:信号名一般小写(但Parametor定义的数值名全部用大写)两个词之间要用下划线连接。如packet、addr、data_in、mem_wr避免使用保留字,如:in、out、x、z等不能做为变量、端口或模块名。全局信号名中应包含信号来源的一些信息。 如:d_addr[7:2],这里的“d”指明了地址是解码模块(Decoder�module)中的地址
武汉大学物理科学与技术学院微电子系 常胜
二、Modules顶层模块应只是内部模块间的互连,模块间不再出现逻辑(∵综合是按模块进行,如果出现gloomy逻辑将影响综合结果)。每行应限制在80字以内,以保持代码的清晰,美观和层次感。module名应与文件名保持一致。模块输出寄存器化:即除三态门之外的输出变量均采用寄存器输出方式,可严格控制时序。每个模块应在开始处注明文件名,功能描述,引用模块,设计者,设计时间及版权信息等。
武汉大学物理科学与技术学院微电子系 常胜
///////////////////////////////////////////////////////////////////������������������������������������������������������������������������������////
///�����Priject�Name:��serial�������������������������������������������//////�����Design�Module�Name:�serial.v� //////�����Author:Author�Name���������������������������������������//////�����Version:�1.0�������������� //////�����Updata��Time:� //////�����Design�Group:�Microelectronics�WHU��������������///��������/////////////////////////////////////////////////////////////
在模块中增加明了的注释对信号、参量、引脚、模块、函数及进程等加以说明,便于阅读与维护。在同一模块中最好只采用同一个时钟的上升沿或下降沿采样,便于综合。
武汉大学物理科学与技术学院微电子系 常胜
三、Net��and��register一个reg变量只能在一个always语句中赋值避免多驱动问题∵always为并行结构,若一个reg变量在多个always中赋值,可能在同一时刻赋不同的值造成逻辑混乱。对register的赋值可添加单位延迟parameter�DELAY=1;always@(posedge�clk�or�negedge�rst_)if(!rst_)dout<=#DELAY1'b0;
elsedout<=#DELAY�din;
∵对寄存器赋值是存在延迟的,不可能一赋值就立刻变化,硬件上需要一定的缓冲时间。∴�依据实际电路情况,添加单位延迟,可保证逻辑的正确
武汉大学物理科学与技术学院微电子系 常胜
向量有效位顺序的定义一般是从大数到小数尽管定义有效位的顺序很自由,但如采用毫无规则的定义势必会给阅读者带来困难,如data�[-4:0],data�[0:4],推荐:n位 [n-1:0]输出要作声明,否则Verilog将假定它为一位宽的wire变量output�[4:0]�dout;reg�[4:0]�dou;�//如无,则认为wire�dout;
武汉大学物理科学与技术学院微电子系 常胜
习题二:篮球24秒可控记时器设计功能说明:
具有24秒记时、显示功能;设置外部按键,完成清零、暂停、恢复控制;24s倒记时,时间间隔为1s;时间到后发出报警信号,并在3s后解除。
武汉大学物理科学与技术学院微电子系 常胜
端口说明输入信号:rst_��复位信号,低电平有效
clk_in��10Hz时钟信号clr��清零信号pause��暂停信号,1暂停,0恢复
输出信号:qh��4位,输出高位显示驱动ql��4位,输出低位显示驱动clk_out��1Hz时钟信号warn��报警信号,1报警,0解除
要求:给出设计思路、方案和源代码对源代码做出清晰的说明和注释
武汉大学物理科学与技术学院微电子系 常胜
习题三:序列捕捉器设计功能说明:
捕捉11010110序列在捕捉到每个序列后产生一个1时钟周期的标记信号对捕捉到的序列个数进行计数并输出计数上限为16,计数满后值保持不变,产生计数满的溢出信号允许序列的嵌套
武汉大学物理科学与技术学院微电子系 常胜
端口说明输入信号:rst_��复位信号,低电平有效
clk��时钟信号data_in��输入数据信号
输出信号:flag��发现序列标记信号counter��5位,序列个数计数信号overflow��溢出信号
要求:采用状态机方法设计,给出设计思路、方案和源代码对源代码做出清晰的说明和注释