verilog常用例子
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.6.1 Verilog基本模块
1.触发器的Verilog实现
时序电路是高速电路的主要应用类型,其特点是任意时刻电路产生的稳定输出不仅与当前的输入有关,而且还与电路过去时刻的输入有关。时序电路的基本单元就是触发器。下面介绍几种常见同步触发器的Verilog 实现。
同步RS触发器
RS触发器分为同步触发器和异步触发器,二者的区别在于同步触发器有一个时钟端clk,只有在时钟端的信号上升(正触发)或下降(负触发)时,触发器的输出才会发生变化。下面以正触发为例,给出其Verilog 代码实现。
例2-15 正触发型同步RS触发器的Verilog实现。
module sy_rs_ff (clk, r, s, q, qb);
input clk, r, s;
output q, qb;
reg q;
assign qb = ~ q;
always @(posedge clk) begin
case({r, s})
2'b00: q <= 0;
2'b01: q <= 1;
2'b10: q <= 0;
2'b11: q <= 1'bx;
endcase
end
endmodule
上述程序经过综合Synplify Pro后,其RTL级结构如图2-2所示。
图2-2 同步RS触发器的RTL结构图
在ModelSim 6.2b中完成仿真,其结果如图2-3所示
图2-3 同步RS触发器的仿真结果示意图
同步T触发器
T触发器也分为同步触发器和异步触发器,二者的区别在于同步T触发器多了一个时钟端。同步T触发器的逻辑功能为:当时钟clk沿到来时,如果T=0,则触发器状态保持不变;否则,触发器输出端反转。R 为复位端,当其为高电平时,输出Q与时钟无关,Q=0。
例2-16 同步T触发器的Verilog实现。
module sy_t_ff(clk, r, t, q, qb);
input clk, r, t;
output q, qb;
reg q;
assign qb = ~q;
always @(posedge clk) begin
if(r)
q <= 0;
else
q <= ~q;
end
endmodule
上述程序经过综合Synplify Pro后,其RTL级结构如图2-4所示。
图2-4 同步T触发器电路的RTL结构图
在ModelSim 6.2b中完成仿真,其结果如图2-5所示
图2-5 同步T触发器的仿真结果示意图
同步D触发器
同步D触发器的功能为:D输入只能在时序信号clk的沿变化时才能被写入到存储器中,替换以前的值,常用于数据延迟以及数据存储模块中。
例2-17 同步D触发器的Verilog实现。
module sy_d_ff(clk, d, q, qb);
input clk, d;
output q, qb;
reg q;
assign qb = ~q;
always @(posedge clk) begin
q <= d;
end
endmodule
上述程序经过综合Synplify Pro后,其RTL级结构如图2-6所示。
图2-6 同步D触发器的RTL结构图
在ModelSim 6.2b中完成仿真,其结果如图2-7所示
图2-7 同步D触发器的仿真结果示意图
同步JK触发器
JK触发器是在RS触发器的基础上发展而来的,常用于实现计数器。当clk=0时,触发器不工作,处于保持状态。当时钟clk=1时,触发器的功能如下:当JK为00、01以及10时实现RS触发器的功能;当JK为11时实现T触发器的功能。
例2-18 同步JK触发器的Verilog实现。
module sy_jk_ff(clk, j, k, q, qb);
input clk, i, k;
output q, qb;
reg q;
assign qb = ~q;
always @(posedge clk) begin
case({j, k})
2'b00: q <= q;
2'b01: q <= 0;
2'b10: q <= 1;
2'b11: q <= ~q;
endcase
end
endmodule
上述程序经过综合Synplify Pro后,其RTL级结构如图2-8所示。
图2-8 同步JK触发器的RTL结构图
在ModelSim 6.2b中完成仿真,其结果如图2-9所示
图2-9 同步JK触发器的仿真结果示意图
2.三态缓冲器的Verilog实现
三态缓冲器也称三态门,其典型应用是双向端口,常用于双向数据总线的构建。在数字电路中,逻辑输出有两个正常态:低电平状态(对应逻辑0)和高电平状态(对应逻辑1);此外,电路还有不属于0和1状态的高组态(对应于逻辑Z)。所谓高阻,即输出端属于浮空状态,只有很小的漏电流流动,其电平随外部电平高低而定,门电平放弃对输出电路的控制。或者可以理解为输出与电路是断开的。最基本的三态缓冲器的逻辑符号如图2-10所示。
图2-10 三态缓冲器的逻辑符号图
当OE为高电平时,Dataout与Datain相连;而OE为低时,Dataout为高阻态,相当于和Datain之间的连线断开。
例2-19 使用Verilog实现三态缓冲器
inout a;
wire z, b;
//当控制信号z为1时,开通三态门,b为输入端口;当z为0时,三态门为高阻,
//a为输出端口
assign a = (z) ? b : 8'bz;
3.38译码器的Verilog实现
38译码器是通过3条线来达到控制8条线的状态,就是通过3条控制线不同的高低电平组合, 一共可以组合出23=8种状态。在电路中主要起到扩展IO资源的作用。当然,可根据实际需求将38译码器扩展到更高级数上。
例2-20 使用Verilog实现38译码器
module decoder3to8(din, reset, dout);
input [2:0] din;
input reset;
output [7:0] dout;
reg [7:0] dout;
always @(din or reset) begin
if(!reset)
dout = 8'b0000_0000;
else