VerilogHDL数字系统设计教程_第1页
VerilogHDL数字系统设计教程_第2页
VerilogHDL数字系统设计教程_第3页
VerilogHDL数字系统设计教程_第4页
VerilogHDL数字系统设计教程_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

2024/7/4本次课主要内容1,组合逻辑、时序逻辑的Verilog语言描述2,锁存器与D触发器及其Verilog语言描述3,设计实例讲解2024/7/4本次课主要内容1,组合逻辑、时序逻辑的Verilog语言描述2,锁存器与D触发器及其Verilog语言描述3,Verilog设计电路实例讲解2024/7/4组合逻辑电路的连续赋值实现以2路选择器为例:modulemux2to1(a,b,sel,out);inputa,b;inputsel;outputout;

assignout=(sel)?b:a;

endmodule

注意:连续赋值语句的被赋值变量只能是线网wire型。2024/7/4组合逻辑电路的always过程块实现仍然以2路选择器为例:modulemux2to1(a,b,sel,out);inputa,b;inputsel;outputout;

regout;

always@(seloraorb)

out=(sel)?b:a;endmodule注意:过程块描述的组合逻辑电路:

1,被赋值变量只能是reg型;

2,触发方式采用电平触发;

3,always@()引导的敏感量要完整。2024/7/4always过程块与连续赋值语句描述的组合逻辑电路效果相同两种方法描述的2路选择器电路均相同,综合工具根据Verilog代码综合自动生成的电路均为下图所示:2024/7/4时序逻辑电路的always过程块实现moduleDFF(clk,rst,d,q);inputclk,rst,d;outputq;

regq;

always@(posedgeclk)if(rst)q<=1'b0;elseq<=d;endmodule注意:1,过程块描述的时序逻辑电路,其敏感量采用边沿触发;

2,为了避免竞争,描述时序电路只能用非阻塞赋值,不能用阻塞赋值。问题:

为什么描述时序逻辑要采用边沿触发的方式?2024/7/4本次课主要内容1,组合逻辑、时序逻辑的Verilog语言描述2,锁存器与D触发器及其Verilog语言描述3,Verilog设计电路实例讲解2024/7/4modulelatch(data,enable,q);inputdata,enable;outputq;regq;

always@(enableordata)if(enable)q<=data;//enable为低电平的情况没有定义endmodule在always过程块所描述的组合逻辑电路中,所使用的条件语句如果没有说明全部条件,将产生latch锁存器,例:Verilog语言中锁存器(latch)的产生2024/7/4综合工具Leonardo所报的Warning信息:Warning,qisnotalwaysassigned.Storagemaybeneeded..锁存器-综合情况注意:锁存器是在敏感量为电平触发方式的组合逻辑电路中产生的。2024/7/4问题:为什么锁存器要在电平触发方式下生成?CMOS工艺下锁存器的电路结构2024/7/4锁存器-工作过程分析分析:因为当CLK为高电平1时,传输门T1导通,输入端D到输出端Q形成通路,所以输出Q能够反映输入端D的信号;而当CLK变为低电平0时,导致传输门T1关断,输出Q就不能反映输入端口D的信号,此时由于传输门T2的导通,输出级有反馈环路,输出端Q能够保持原值。2024/7/4moduleasynrst_DFF(clk,rst,d,q);inputclk,rst,d;outputq;regq;

always@(posedgeclkorposedgerst)if(rst)q<=1'b0;elseq<=d;endmodule注意:D触发器是时序逻辑的基本电路单元。要回答问题:为什么描述时序逻辑要用边沿触发方式即是回答问题:为什么D触发器是边沿触发?D触发器的Verilog描述2024/7/4说明:复位信号rst为高电平时复位,输出Q为0;在复位信号变为低电平后不工作后,红色标示的或非门对数据输入端D而言,等效于反相器,如下页CMOS工艺下D触发器的电路结构D触发器符号D触发器电路图2024/7/4问题:1,为什么说D触发器是边沿触发?

2,为什么当时钟信号CLK变为高电平后,无论输入端D信号如何变化,都不能反映到输出端Q上去?CMOS工艺下D触发器的电路结构(cont.)2024/7/4D触发器-工作过程分析分析:1,因为当CLK为低电平0时,传输门T1导通,输入端D的信号被送到QM_点;而当CLK在由低电平0跳变到高电平1时刻(即CLK上升沿时),T3导通,QM_点的值得以被传到输出端Q去,对外即好像在时钟上升沿触发,完成数据采集。2,在CLK保持高电平1时,由于传输门T1处于关断状态,无论输入端D的信号如何变化,均不能被送到输出端口。2024/7/4锁存器与D触发器问题:锁存器与D触发器的区别?答案要点:从触发方式和电路结构两方面说明。

2024/7/4moduleLATCHorDFF(q,data,enable);inputclk,data,enable;outputq;regq;

endmoduleVerilog语法下的锁存器与D触发器always@(posedgeclk)if(enable)q<=data;//else

//q<=q;always@(enableordata)if(enable)q<=data;//else

//q<=q;问题:1,上面左边描述的电路,如果不加elseq<=q,会生成锁存器吗?

2,上面右边描述的电路,如果不加elseq<=q,会生成锁存器吗?2024/7/4本次课主要内容1,组合逻辑、时序逻辑的Verilog语言描述2,锁存器与D触发器及其Verilog语言描述3,Verilog设计电路实例讲解2024/7/4练习一-16进制计数器的Verilog描述

要求:对时钟信号clk半周期记一次数2024/7/4练习一-16进制计数器的电路结构与波形16进制波形图问题:这种计数器是异步计数器还是同步计数器?电路有什么特点?2024/7/4练习一-(clk半周期计一次数)16进制计数器的Verilog错误表达1modulecounter_error1(clk,rst,counter);inputclk,rst;output[3:0]counter;reg[3:0]counter;always@(clkorrst) if(rst)counter<=4'b0000;elseif(counter==4'b1111) counter<=4'b0000; elsecounter<=counter+4'b0001;endmodule问题:这是时序逻辑还是组合逻辑?2024/7/4练习一-(clk半周期计一次数)16进制计数器的Verilog错误表达1-仿真波形分析:仿真波形满足要求,但是综合结果呢?2024/7/4练习一-(clk半周期计一次数)16进制计数器的Verilog错误表达1-综合结果综合时报告的Warning:1,Warning,inputclkisneverused.2,

Warning,Designcontainscombinatorialloopthroughnetcounter(0),counter(1),counter(2),counter(3).

2024/7/4练习一-(clk半周期计一次数)16进制计数器的Verilog错误表达1-综合结果(cont.)错误原因:过程块使用电平触发方式,在综合时被映射成组合逻辑电路;

描述计数器这样的时序逻辑,其敏感量不能采用电平触发方式!!2024/7/4练习一-(clk半周期计一次数)16进制计数器的Verilog错误表达2modulecounter_error2(clk,rst,counter);inputclk,rst;output[3:0]counter;reg[3:0]counter;always@(posedgeclkornegedgeclkorposedgerst) if(rst)counter<=4'b0000;elseif(counter==4'b1111)

counter<=4'b0000; elsecounter<=counter+4'b0001;endmodule问题:这种描述方式问题出在什么地方?2024/7/4练习一-(clk半周期计一次数)16进制计数器的Verilog错误表达2-仿真波形分析:仿真波形满足要求,但是综合结果呢?2024/7/4综合工具不能映射成电路,报告的错误信息:

Error:

Alwaysblocksensitivetobothpositiveandnegativeedgeofclkandclkcannotbesynthesized!

错误原因分析:

同一个D触发器能够既用时钟信号的上升沿又用下降沿来触发吗?

所以,应改正为:

always@(posedgeclkorposedgerst)

或者

always@(negedgeclkorposedgerst)

练习一-(clk半周期计一次数)16进制计数器的Verilog错误表达22024/7/4练习一-(clk半周期计一次数)16进制计数器的Verilog错误表达3modulecounter_error3(clk,rst,counter);inputclk,rst;output[3:0]counter;reg[3:0]counter;always@(posedgeclkorposedgerst) if(rst)counter<=4'b0000;elseif(counter==4'b1111)

counter<=4'b0000; elsecounter<=counter+4'b0001;always@(negedgeclkorposedgerst) if(rst)counter<=4'b0000;elseif(counter==4'b1111)

counter<=4'b0000; elsecounter<=counter+4'b0001;endmodule问题:这种描述方式问题出在什么地方?2024/7/4练习一-(clk半周期计一次数)16进制计数器的Verilog错误表达3-仿真波形分析:仿真波形满足要求,但是综合结果呢?2024/7/4综合工具不能映射成电路,报告的错误信息:

Error:

electricalerrorduetomultipleconcurrentassignmentsto‘counter’.

错误原因分析:

两块电路的输出信号直接相连,就是多驱动或者线与逻辑,用一般工艺实现,会使灌电流过大,可能烧坏逻辑门。

要实现这样的逻辑,需要用oc门来实现,同时在输出端口应加一个上拉电阻。

练习一-(clk半周期计一次数)16进制计数器的Verilog错误表达32024/7/4练习一-(clk半周期计一次数)16进制计数器的Verilog正确表达modulecounter_correct(clk,rst,counter);inputclk,rst;output[3:0]counter;

reg[3:0]counter;

reg[3:0]counter1,counter2;always@(posedgeclkorposedgerst) if(rst)counter1<=4'b0000;elseif(counter1==4'b1111)

counter1<=4'b0000; elsecounter1<=counter1+4'b0001;always@(negedgeclkorposedgerst) if(rst)counter2<=4'b0000;elseif(counter2==4'b1111)

counter2<=4'b0000; elsecounter2<=counter2+4'b0001;always@(counter1orcounter2)counter=counter1+counter2;endmodule2024/7/4练习一-(clk半周期计一次数)16进制计数器的Verilog正确表达-仿真波形分析:仿真波形满足要求,综合结果呢?2024/7/4练习一-16进制计数器的Verilog正确描述-综合结果综合分析:综合信息没有任何Warning或者错误信息,能综合成时序电路,说明该描述方法正确。2024/7/4练习二-设计饮料自动投币售卖机的

核心控制电路

要求:简化考虑,假设饮料只有一种价格为2.5元。

硬币有0.5元和1.0元两种,考虑找零,

用Verilog描述其控制电路,并用FPGA实现。2024/7/4练习二-饮料自动投币售卖机控制电路设计设计步骤分解:1,分析输入输出端口信号;2,状态转移图;3,根据状态转移图进行Verilog语言描述;4,测试代码编写,仿真;5,FPGA实现。2024/7/4练习二-自动售饮料机-分析输入输出端口信号

输入信号:clk,rst;输入信号:操作开始:op_start;//定义1开始操作

输入信号:投币币值:coin_val;

//定义2’b01表示0.5元;2’b10表示1元输入信号:取消操作指示:cancel_flag;

//定义1为取消操作输出信号:机器是否占用:hold_ind;//定义0为不占用,可以使用输出信号:取饮料信号:drinktk_ind;//定义1为取饮料

输出信号:找零与退币标志信号:charge_ind;//定义1为找零输出信号:找零与退币币值:charge_val;

//定义3’b001表示找0.5元;3’b010表示找1元//3’b011表示找1.5元;3’b100表示找2.0元;

2024/7/4练习二-自动售饮料机-状态确定设计步骤:2,状态转移图

a)状态确定:

S0:初始态;

S1

:已投币0.5元;

S2

:已投币1.0元;

S3

:已投币1.5元;

S4:已投币2.0元;

S5

:已投币2.5元;

S6

:已投币3.0元;

2024/7/4练习二-自动售饮料机-状态转移图

状态说明:S0:初始态;S1

:已投币0.5元;S2

:已投币1.0元;

S3

:已投币1.5元;S4:已投币2.0元;S5

:已投币2.5元;S6

:已投币3.0元;S0S1S2S3S4S6S5Coin_val=2’b01Coin_val=2’b01Coin_val=2’b10Coin_val=2’b10Coin_val=2’b01Coin_val=2’b10Coin_val=2’b01Coin_val=2’b10Coin_val=2’b01Coin_val=2’b10drinktk_ind=1;charge_ind=0drinktk_ind=0;charge_ind=0drinktk_ind=1;charge_ind=1drinktk_ind=0;charge_ind=0drinktk_ind=0;charge_ind=0drinktk_ind=0;charge_ind=0hold_ind=02024/7/4练习二-自动售饮料机-状态转移图(cont.)说明:1,在S0状态下,如果检测到op_start=1,开始检测是否有投币,如果有,一次新的售货操作开始;

2,在状态S1/S2/S3/S4下,如果检测到cancel_flag=1,则取消操作,状态返回S0,并退回相应的币值;

3,在状态S5下,卖出饮料不找零;在状态S6下,卖出饮料并找零;

4,在状态S5和S6操作完后,都返回状态S0,等待下一轮新的操作开始;

5,只有在S0状态下,hold_ind=0,可以发起新一轮操作,其它状态下都为1;2024/7/4S0S1S4S2S5S6S3coin_val==2'b01coin_val==2'b01coin_val==2'b01coin_val==2'b01coin_val==2'b01coin_val==2'b01coin_val==2'b10coin_val==2'b10coin_val==2'b10coin_val==2'b10workstate=0workstate=1workstate=1workstate=1workstate=1workstate=1workstate=12024/7/4练习二-自动售饮料机-状态机的Verilog描述-softdrinkFSM.v文件里内容module

softdrinkFSM(clk,rst,op_start,cancel_flag,coin_val,hold_ind,charge_ind,drinktk_ind,charge_val);inputclk,rst;inputop_start,cancel_flag;input[1:0]coin_val;outputhold_ind,charge_ind,drinktk_ind;output[2:0]charge_val;reghold_ind,charge_ind,drinktk_ind;reg[2:0]charge_val;reg[2:0]currentstate,nextstate;parameter

S0=3'b000;parameterS1=3'b001;parameterS2=3'b010;parameterS3=3'b011;parameterS4=3'b100;parameterS5=3'b101;parameterS6=3'b101;2024/7/4S0S1S2trafficlight=3'b100trafficlight=3'b001trafficlight=3'b010counter=settimecounter=settimecounter=settime2024/7/4练习二-自动售饮料机-状态机的Verilog描述(cont.)always@(posedgeclkorposedgerst)if(rst)

currentstate<=S0;else currentstate<=nextstate;

always@(currentstateorrstorop_startorcancel_flagorcoin_val) if(rst)nextstate=S0;elsecase(currentstate) S0:if(op_start)if(coin_val==2'b01)nextstate=S1;elseif(coin_val==2'b10)nextstate=S2;2024/7/4练习二-自动售饮料机-状态机的Verilog描述(cont.)

S1:if(cancel_flag)nextstate=S0;elseif(coin_val==2'b01)nextstate=S2;elseif(coin_val==2'b10)nextstate=S3; S2:if(cancel_flag)nextstate=S0;elseif(coin_val==2'b01)nextstate=S3;elseif(coin_val==2'b10)nextstate=S4;S3:if(cancel_flag)nextstate=S0;elseif(coin_val==2'b01)nextstate=S4;elseif(coin_val==2'b10)nextstate=S5;2024/7/4练习二-自动售饮料机-状态机的Verilog描述(cont.) S4:if(cancel_flag)nextstate=S0;elseif(coin_val==2'b01)nextstate=S5;elseif(coin_val==2'b10)nextstate=S6;S5:nextstate=S0;

S6:nextstate=S0;default:nextstate=S0;endcase

2024/7/4练习二-自动售饮料机-状态机的Verilog描述(cont.)always@(currentstate) if(currentstate==S0)

hold_ind

=1'b0;elsehold_ind

=1'b1;always@(currentstate) if((currentstate==S5)||(currentstate==S6))

drinktk_ind

=1'b1;elsedrinktk_ind

=1'b0;

always@(currentstateorcancel_flag)if(currentstate==S0)charge_ind=1'b0;elseif(currentstate==S6)charge_ind=1'b1;elseif(cancel_flag)charge_ind=1'b1;elsecharge_ind=1'b0;2024/7/4练习二-自动售饮料机-状态机的Verilog描述(cont.)always@(currentstateorcancel_flag)if(currentstate==S0)charge_val=3'b000;elseif(currentstate==S6)charge_val=

3'b001;elseif(cancel_flag)begincase(currentstate)S1:charge_val=3'b001;S2:charge_val=3'b010;S3:charge_val=3'b011;S4:charge_val=3'b100;default:charge_val=3'b000;endcaseendelsecharge_val=

3'b000;endmodule2024/7/4练习二-自动售饮料机-测试模块编写-softdrink_testbench.v文件里内容modulesoftdrink_testbench;regrst,clk;regop_start;regcancel_flag;reg[1:0]coin_val;

wirehold_ind;wirecharge_ind;wiredrinktk_ind;wire[2:0]charge_val;

initialclk=0;always#500clk=~clk;2024/7/4练习二-自动售饮料机-测试模块编写(cont.)

initial begin rst=0; op_start=0; cancel_flag=0;coin_val=2'b00; #25 rst=1;#25 rst=0;

//第一次:依次投

温馨提示

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

评论

0/150

提交评论