数字电路的FPGA设计与实现基础篇.doc_第1页
数字电路的FPGA设计与实现基础篇.doc_第2页
数字电路的FPGA设计与实现基础篇.doc_第3页
数字电路的FPGA设计与实现基础篇.doc_第4页
数字电路的FPGA设计与实现基础篇.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

数字电路的FPGA设计与实现基础篇杨凡,邮箱 MSN:大家给点意见有助于我进一步的学习! 谢谢!2、基础篇:2.1 组合逻辑:2.1.1 三态门(总线)三态门有:bufif0,bufif1,notif0,notif1。 总线是运算部件之间数据流通的公共通道,在硬线逻辑构成的运算电路中只要电路的规模允许,可以比较自由地确定总线的宽度,可以提高数据流通的速度。2.1.2 异或门 xor A1(T,A,B);2.1.3 编译码器:利用case进行编程(38译码器和83优先解码器的编程比较简单仿真在这里就就不做说明)2.1.4 全加器:(门级结构实现,数据流,过程语句)数据流描述的4位加法器Module adder4(a,b,cin,cout,s);Input 3:0 a,b;Input cin;Output c;Output 3:0 s;Reg 3;0 s;Assign c,s=a+b+cin;/利用位拼接实现结果的进位endmodule2.1.5 多位串行进位加法器多位串行进位加法器虽然简单但是速度较慢,一般使用超前进位加法器2.1.6 数据选择器:(if else 语句,case语句描述实现) 多位的数据选择器大部分情况下我大部分代码都用case分支选择语句很容易实现,另外还可以利用行为和数据流描述方式简单的组合逻辑编码也是一样的。数据流描述的选择器(2选1)Module mux21(out,a,b,sel);Input a,b,sel; Output out; Assign out=sel?a:b;endmodule2.1.7 数值比较器(直接比较两个数的大小可以利用上面数据选择器使用的数据流描述方法来实现);要具体比较出两者的关系利用以下代码仿真:module cmp(A,B,FA,FB,FE); parameter width=9;input width:0 A,B; output 1:0 FA,FB,FE; assign FA=(AB);/ 当A大于B时FA输出为1 assign FB=(AB);/当A小于B时FB输出为1 assign FE=(A=B);/当A等于B时FE输出为1endmodule仿真产生波形如下2.1.8 奇偶校验器(设计并行输入的6位数据对其进行奇偶校验代码如下)module jiou(ji,ou,indata);input 5:0 indata;output ji,ou;assign ji=indata;/产生奇校验assign ou=ji;/产生偶校验endmodule仿真波形如下2.2 时序逻辑基础2.2.1 触发器(D触发器, 基本RS触发器,JK触发器)D触发器的verilog仿真不带复位端module df(clk,D,Q,QB);input clk,D;output Q,QB;reg Q;assign QB=Q;always (posedge clk)begin Q=D;end endmodule带复位端的D触发器(异步/同步清零异/同步步置1的D触发器)module DFFr(clk,reset,D,Q,QB);input clk,reset,D;output Q,QB;reg Q,QB;always (posedge clk or posedge reset)beginif(reset) begin Q=0;QB=1;endelse begin Q=D;QB=D;end /Procedural assignment to a non-register is not permitted.endendmodule仿真过程中遇到了定义QB的类型的错误问题,错误提示见注释分析:assign语句中不能使用reg类型的变量,在 always语句中每一个信号都必须是reg类型的。仿真波形如下基本RS触发器的verilog仿真module RSF(clk,R,S,D,Q,QB);input R,S,D,clk;output Q,QB;reg Q;assign QB=Q;always (posedge clk)case(R,S)2b00: Q=0;/当R=0,S=0时输出为02b01: Q=1;/ 当R=0,S=1时 置位输出为12b10: Q=0;/ 当R=1,S=0时 复位输出为02b11: Q=1bx;/ 当R=1,S=1时输出为不确定状态endcase endmodule刚开始的时候没有想到用位拼接的方式来处理RS的值,利用if else 语句觉得好麻烦,然后就找到这种方式,仿真波形JK触发器(异步清零同步置1的JK触发器)module jkff(clk,j,k,reset,set,q);input clk,j,k,reset,set;output q ;reg q;always (posedge clk or negedge reset or negedge set)begin if(!reset) begin q=0; endelse if(!set) begin q=1; end/实现异步清零同步置位else case(j,k)2b00 : q=q;/保持2b01 : q=1b0;/清零2b10 : q=1b1;/置12b11 : q=q;/翻转default :q=1bx;/其它的为不确定值endcase end endmodule仿真波形:2.2.2 锁存器(有电平敏感和带置位和复位端的锁存器)电平敏感module latch(q,d,clk);input d,clk;output q;assign q=clk?d:q;/当时钟信号为高电平时,输入端数据锁存endmodule2.2.3 计数器(计数器有递增和递减两种,一般的计数器都利用递增的形式来)另外还有约翰逊计数器的代码实现。计数器的模为计数器能够记忆脉冲的最大数目,要设计模可变的计数器就是能在程序中改变计数的容量。构成计数器的最核心的元件时触发器。下面是可变模加法/减法计数器的代码module updocnt(d,clk,clr,load,updo,q);input clk,clr,load,updo; output 7:0 q;input 7:0 d;reg 7:0 cnt; assign q=cnt;always (posedge clk)begin if(!clr) cnt=8b0;else if(load) cnt=d;else if(updo) cnt=cnt+1;else cnt=cnt-1;endendmodule仿真波形如下:2.2.4 数码寄存器寄存器和前面的锁存器的功能是相同的,但是两者也有区别,锁存器一般是由电平控制的,属于电平敏感型,寄存器由时钟信号控制为边沿敏感型,下面的程序代码改变就可以变化成不同位宽的数据寄存器。module reg8(fout,indata,clk,clr);input clk,clr;input 7:0 indata;output 7:0 fout;reg7:0 fout;always (posedge clk or posedge clr)begin if(!clr) fout=0;else fout=indata; endendmodule 2.2.5 并串转换器(主要涉及的是移位寄存器,另外还有利用位拼接来设计的串并转换核心代码为out=out,in;)module shift8(din,clk,clr,dout);input din,clk,clr;output 7:0 dout;reg 7:0 dout;always (posedge clk)begin if(clr) dout=0;else begin dout=dout1;/让输出左移一位,然后将串行输入的数据存放在dout的最低位构成并行数据dout0=din; endendendmodule仿真波形:2.3 时序设计(状态机)2.3.1 n位码检测器(在此写的是检测五位序列“10010”代码由于序列可能重复分析其总共有8种状态)module xulie5(x,z,clk,rst,state);/检测序列10010input x,clk,rst;output z;output2:0 state;reg 2:0 state;wire z;parameter IDLE=d0,A=d1,B=d2,C=d3,D=d4,E=d5,F=d6,G=d7;/给变量赋值代表8个状态assign z=(state=E&x=0)?1:0;/当来到一个0时,状态已变为E,当状态为D的时候x为1,判断输出条件为state=E&x=0;always (posedge clk) if(!rst) begin state=IDLE; endelse casex(state) IDLE :if(x=1) begin state=A;endA:if(x=0) begin state=B; end B:if(x=0) begin state=C; end else begin state=F; endC:if(x=1) begin state=D; end else begin state=G; endD:if(x=0) begin state=E; end else begin state=A;endE:if(x=0) begin state=C; end else begin state=A;endF:if(x=1) begin state=A;end else begin state=B;endG:if(x=1) begin state=F;enddefault:state=IDLE;缺省时为空闲 endcase endmodule仿真波形为:对于时序设计,在有限状态下可以利用状态机画图来实现上述功能然后生成代码也可以得到正确的结果。利用这种方法可以在比较复杂的电路建模中将复杂的问题简单化。学习和仿真中遇到的问题:刚开始学习的时候主要是看别人写的代码,自己在写代码中仿

温馨提示

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

评论

0/150

提交评论