数字电路的FPGA设计与实现基础篇
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字电路的FPGA设计与实现基础篇杨凡,邮箱lvfanzai@ MSN:lvfanzai@
大家给点意见~~有助于我进一步的学习!谢谢!
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;//利用位拼接实现结果的进位
endmodule
2.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;endmodule
2.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=(A>B);// 当A大于B时FA输出为1
assign FB=(A
assign FE=(A==B);//当A等于B时FE输出为1
endmodule
仿真产生波形如下
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)
begin
if(reset) begin Q<=0;QB<=1;end
else begin Q<=D;QB<=~D;end
//Procedural assignment to a non-register
end
endmodule
仿真过程中遇到了定义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})
2'b00: Q<=0;//当R=0,S=0时输出为0
2'b01: Q<=1;// 当R=0,S=1时置位输出为1
2'b10: Q<=0;// 当R=1,S=0时复位输出为0
2'b11: Q<=1'bx;// 当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; end
else if(!set) begin q<=1; end//实现异步清零同步置位
else case({j,k})
2'b00 : q<=q; //保持2'b01 : q<=1'b0;//清零
2'b10 : q<=1'b1;//置1 2'b11 : q<=~q;//翻转
default :q<=1'bx;//其它的为不确定值
endcase end endmodule
仿真波形: