VerilogHDL语言学习教程.pptx
《VerilogHDL语言学习教程.pptx》由会员分享,可在线阅读,更多相关《VerilogHDL语言学习教程.pptx(234页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本课程主要内容数字系统实例:FIFO异步串行通信接口调制解调器I2C接口的EEPROM读写器CISCCPURISCCPU第1页/共234页第一页,编辑于星期日:七点 三十一分。第2页/共234页第二页,编辑于星期日:七点 三十一分。例1:一个挂在总线上的8位寄存器。module register0(db,nce,nwe);inout7:0 db;input nce,nwe;reg7:0 q;assign db=(nce|(!nwe)?8bzzzzzzzz:q;always(posedge nwe)begin if(nce=0)q=db;endendmodule复习第3页/共234页第三页,编辑
2、于星期日:七点 三十一分。例2:带有异步清零端的同步4位二进制加法计数器module ncounter(rst,clk,q);inputrst,clk;output3:0 q;reg3:0 q;always(posedge clk or negedge rst)if(!rst)q=0;else if(q=15)q=0;else q=q+1;endmodule同步清零?第4页/共234页第四页,编辑于星期日:七点 三十一分。例3:分频器的设计module nfrequency(rst,clk,q);input rst,clk;output3:0 q;reg3:0 q;always(posedge
3、 clk or negedge rst)if(!rst)q=0;else if(q=15)/可以实现16分频q=0;elseq=q+1;endmodule同步清零?其它分频系数?第5页/共234页第五页,编辑于星期日:七点 三十一分。例4:序列检测器module shift(q,s,d,clk);output11:0 q;output s;input d;input clk;reg11:0 q;reg s;always(posedge clk)beginq=q1;q0=d;endalways(posedge clk)s=1;else s=0;endmodule第6页/共234页第六页,编辑于星
4、期日:七点 三十一分。例5:设计一个容量为1kB的RAM。module memory(d,a,we,rd);inout7:0 d;input9:0 addr;input we,rd;wire7:0 q;assign d=rd?q:8hzz;lpm_ram_dp0 ram0(d,a,a,we,rd,q);endmodule第7页/共234页第七页,编辑于星期日:七点 三十一分。1.以结构描述方式实现下列逻辑:Y=ABC+DE+CFG2.试设计一个具有使能端ncs的2-4译码器。3.中断请求有效电平为高电平,中断请求输入线INTR0INTR15中INTR15优先权最高。试设计一个中断优先权编码器。
5、当有中断请求时,INT=1,同时输出中断请求输入线的编码V;否则INT=0,V的输出任意。4.试设计一个4位加减运算器,输入为A、B、CIN、M,输出为OUT和COUT。当M=0时执行加法运算,M=1时,执行减法运算。5.试设计一个14分频器,要求占空比1:1。6.试设计一个具有三态输出缓冲的8位数据寄存器。7.试设计一个具有清0和置数功能的8位二进制加1计数器。8.设计一个8位的加/减计数器。时钟信号为 clk,同步清0信号为rst。clk上升沿时刻,当inc=1计数器加2,当dec=1计数器减1,其它情况时计数器保持不变。9.设计一个16位移位寄存器。10.设计一个16位双向移位寄存器,当
6、d=0时右移,d=1时左移。11.设计一个产生0100100111的序列信号发生器。第8页/共234页第八页,编辑于星期日:七点 三十一分。12.试以调用库函数的方法设计一个容量为8K24bit的RAM。其双向数据线为D 0:23,地址线为A0:12,写信号为new(低电平有效),读信号为nrd(低电平有效)。13.设计一个位宽为8位、深度为8层的堆栈。14.试按下图设计VerilogHDL模型。s0s1s2s3s411/00?/010/101/000/11?/01?/000/001/100/01?/01?/010/100/001/1?1/0第9页/共234页第九页,编辑于星期日:七点 三十一
7、分。第一章 先进先出数据缓冲器设计1.1 FIFO工作原理先进先出数据管理 ph-头指针(指向第一个数据)pe-尾指针(指向第一个空单元)判缓冲器空条件:当pe=ph-空判缓冲器满条件:当pe+1=ph-满第10页/共234页第十页,编辑于星期日:七点 三十一分。clknresetfifo_infifo_outfifo_wrfifo_rdbusyemptyfullFIFO第11页/共234页第十一页,编辑于星期日:七点 三十一分。clknresetfifo_infifo_outfifo_wrfifo_rdbusyemptyfullFIFOfifo_infifo_outrdwrphpe,qrde
8、nwrenwraddressdatardaddressRAM第12页/共234页第十二页,编辑于星期日:七点 三十一分。1.2状态转换图采用同步时序状态机:3个状态stopwritereadfifo_rd=1/rd=1fifo_rd=0/rd=0fifo_wr=1/wr=1fifo_wr=0/wr=0n写操作-需要2个clk完成n读操作-需要2个clk完成第13页/共234页第十三页,编辑于星期日:七点 三十一分。1.3FIFO模型设计之一/FIFO/Size:255Bytesmodulefifo(clk,nreset,pe,ph,fifo_in,fifo_out,fifo_wr,fifo_r
9、d,busy,empty,full,state,wr,rd);inputclk,nreset,fifo_wr,fifo_rd;/input7:0fifo_in;output1:0state;outputempty,full,wr,rd,busy;/output7:0fifo_out,pe,ph;reg1:0state;reg7:0fifo_out;regwr,rd,empty,full;/fifowrite,read,empty,fullreg7:0pe,ph;/fifopoint:P_end,P_headparameterwrite=1,read=2,stop=0;第14页/共234页第十四
10、页,编辑于星期日:七点 三十一分。always(posedgeclk)if(nreset=0)beginpe=0;ph=0;endelsecase(state)stop:if(fifo_wr=1&pe+1!=ph)/writestartbeginrd=0;wr=1;state=write;busy=1;endelseif(fifo_rd=1&pe!=ph)/readstartbeginwr=0;rd=1;state=read;busy=1;endelsebeginwr=0;rd=0;state=stop;busy=0;if(ph=pe)empty=1;elseif(pe+1=ph)full=1
11、;elsebeginempty=0;full=0;endend第15页/共234页第十五页,编辑于星期日:七点 三十一分。write:if(fifo_wr=0)/endofwritebeginpe=pe+1;wr=0;rd=0;state=stop;busy=0;empty=0;if(pe+2=ph)full=1;elsefull=0;endread:if(fifo_rd=0)/endofreadbeginph=ph+1;wr=0;rd=0;state=stop;busy=0;full=0;if(ph+1=pe)empty=1;elseempty=0;endendcaselpm_ram_dp1
12、ram0(fifo_in,pe,ph,wr,rd,fifo_out);/modulelpm_ram_dp0(data,wraddress,rdaddress,wren,rden,q);endmodule第16页/共234页第十六页,编辑于星期日:七点 三十一分。仿真结果:第17页/共234页第十七页,编辑于星期日:七点 三十一分。1.4 FIFO模型设计之二n支持连续写,连续读。n启动写操作,外部单一时钟节拍写,实际完成需滞后一拍n启动读操作,外部单一时钟节拍读,但需等待一拍n读、写不可同时进行第18页/共234页第十八页,编辑于星期日:七点 三十一分。/Fifo of continuous
13、operation /Size:255Bytesmodule fifo_c(clk,nreset,pe,ph,fifo_in,fifo_out,data,fifo_wr,fifo_rd,busy,empty,full,state,wr,rd);input clk,nreset,fifo_wr,fifo_rd;/input7:0 fifo_in;output1:0 state;output empty,full,wr,rd,busy;/output7:0 fifo_out,pe,ph,data;reg1:0 state;reg7:0 fifo_out,data;reg wr,rd,empty,f
14、ull,busy;/fifo write,read,empty,fullreg7:0pe,ph;/fifo point:P_end,P_headparameter write=1,read=2,stop=0;第19页/共234页第十九页,编辑于星期日:七点 三十一分。always(posedge clk)if(nreset=0)begin pe=0;ph=0;endelse case(state)stop:if(fifo_wr=1&pe+8b00000001!=ph)/write start begin rd=0;wr=1;state=write;busy=1;data=fifo_in;end
15、 else if(fifo_rd=1&pe!=ph)/read start begin wr=0;rd=1;state=read;busy=1;end else begin wr=0;rd=0;state=stop;busy=0;if(ph=pe)empty=1;else if(pe+1=ph)full=1;else begin empty=0;full=0;end end 第20页/共234页第二十页,编辑于星期日:七点 三十一分。write:begin pe=pe+8b00000001;data=fifo_in;if(fifo_wr=0)/end of write begin wr=0;r
16、d=0;state=stop;busy=0;empty=0;if(pe+8b00000010=ph)full=1;else full=0;end else /write continue if(pe+8b00000010=ph)begin /buffer is full.not to write.full=1;wr=0;rd=0;state=stop;busy=0;empty=0;end else /write continue begin wr=1;rd=0;state=write;busy=1;empty=0;end end第21页/共234页第二十一页,编辑于星期日:七点 三十一分。re
17、ad:begin ph=ph+8b00000001;if(fifo_rd=0)/end of read begin wr=0;rd=0;state=stop;busy=0;full=0;if(ph+8b00000001=pe)empty=1;else empty=0;end else /read continue if(ph+8b00000001=pe)/empty begin wr=0;rd=0;state=stop;busy=0;full=0;end else/not empty begin wr=0;rd=1;state=read;busy=1;end end endcaselpm_ra
18、m_dp1 ram0(data,pe,ph,wr,rd,clk,fifo_out);endmodule第22页/共234页第二十二页,编辑于星期日:七点 三十一分。实验1FIFO设计与仿真验证要求:缓冲大于100级数据宽度16位第23页/共234页第二十三页,编辑于星期日:七点 三十一分。习题1设计一个产生0100100111的序列信号发生器。习题2试以调用库函数的方法设计一个容量为8K24bit的RAM。其双向数据线为D 0:23,地址线为A0:12,写信号为new(低电平有效),读信号为nrd(低电平有效)。习题3 设计一个8位的加/减计数器。时钟信号为 clk,同步清0信号为rst。cl
19、k上升沿时刻,当inc=1计数器加2,当dec=1计数器减2,其它情况时计数器保持不变。习题4设计一个位宽为8位、深度为8层的堆栈。第24页/共234页第二十四页,编辑于星期日:七点 三十一分。第二章定时器/计数器接口电路设计目的:设计一个与INTEL8253兼容的定时器/计数器2.1定时器/计数器接口电路的功能3通道、6种工作方式16位计数器(每个计数器可按二进制或十进制来计数,时钟脉冲下降沿使计数器进行减1操作)计数器初值寄存器GATECLKiOUTi减1计数器16位计数通道结构:第25页/共234页第二十五页,编辑于星期日:七点 三十一分。可编程可编程地址线地址线:A1A0端口地址端口地
20、址:A1A0=0 0-CN0数据端口 0 1-CN1数据端口 1 0-CN2数据端口 1 1-控制端口数据线:D7-D0控制线:/we,/rd,/cs通道I/O:clk0,out0,gate0 clk1,out1,gate1 clk2,out2,gate2第26页/共234页第二十六页,编辑于星期日:七点 三十一分。2.2 82532.2 8253的内部结构和引脚特性的内部结构和引脚特性第27页/共234页第二十七页,编辑于星期日:七点 三十一分。2.3 8253控制字格式 第28页/共234页第二十八页,编辑于星期日:七点 三十一分。编程步骤:先写控制字(到控制口)再写计数器初值(到相应的通
21、道端口)第29页/共234页第二十九页,编辑于星期日:七点 三十一分。2.4工作方式与工作时序1方式0(单脉冲发生器)计数器只计一遍。控制字写入后,OUT端为低;当计数初值写入后,在下一个CLK脉冲的下降沿将计数初值寄存器内容装入减1计数寄存器,然后计数器开始减1计数,在计数期间,当减1计数器回0之前,输出端OUT维持低电平。当计数值回0时,OUT输出端变为高电平,并保持到重新写入新的控制字或新的计数值为止。可作为中断请求信号。在计数过程中,若GATE信号变为低电平,则在低电平期间暂停计数,减1计数寄存器值保持不变。在计数过程中,若重新写入新的计数初值,则在下一个CLK脉冲的下降沿,减1计数寄
22、存器以新的计数初值重新开始计数过程。第30页/共234页第三十页,编辑于星期日:七点 三十一分。82538253方式方式0 0三种情况的时序波形三种情况的时序波形第31页/共234页第三十一页,编辑于星期日:七点 三十一分。方式2(周期脉冲发生器)可产生周期性的负脉冲信号,负脉冲宽度为一个时钟周期。写入控制字后,OUT端变为高电平,若GATE为高电平,当写入计数初值后,在下一个CLK的下降沿将计数初值寄存器内容装入减1计数寄存器,并开始减1计数。当减1计数寄存器的值为1时,OUT端输出低电平;减1计数寄存器回0时OUT端输出高电平,并开始一个新的计数过程。在减1计数寄存器未减到1时,GATE信
23、号由高变低,则停止计数。但当GATE由低变高时,则重新将计数初值寄存器内容装入减1计数寄存器,并重新开始计数。GATE信号保持高电平,但在计数过程中重新写入计数初值,则当正在计数的一轮结束并输出一个CLK周期的负脉冲后,将以新的初值进行计数。第32页/共234页第三十二页,编辑于星期日:七点 三十一分。8253方式2下的三种情况:第33页/共234页第三十三页,编辑于星期日:七点 三十一分。2.5设计与仿真控制口编程状态机:state0=00-未编程或完毕01-已写控制字(等待输入数据)10-已写1字节数据(等待输入下一数据)第34页/共234页第三十四页,编辑于星期日:七点 三十一分。通道0
24、方式0状态机:cnt0_f=0-未启动(未装入计数初值寄存器内容)1-已装入,作减1计数 2-已回0,不自动装入通道0方式2状态机:cnt0_f=0-未启动或等待装入计数初值寄存器内容 1-已装入,作减1计数 启动标志:启动标志:start0_f=0,不启动不启动=1,启动(当编程启动(当编程完毕)完毕)第35页/共234页第三十五页,编辑于星期日:七点 三十一分。/timer/counter:8253moduletimer(out0,clk0,d,gate0,a0,a1,nwe,nrd,ncs,cnt0,cnt0_f,control0);inputclk0,gate0,a0,a1,nwe,n
25、rd,ncs;inout7:0d;outputout0;output15:0cnt0;output1:0cnt0_f;output7:0control0;reg7:0control0;reg15:0cnt0_b,cnt0;reg1:0state0;reg1:0cnt0_f;regstart0_f,out0;wireclock0;第36页/共234页第三十六页,编辑于星期日:七点 三十一分。assignd=(!nrd&!ncs&!a0&!a1)?cnt07:0:8bzzzzzzzz;/readlow_byteofcnt0assignd=(!nrd&!ncs&a0&!a1)?cnt015:8:8b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VerilogHDL 语言 学习 教程
限制150内