📄 第6节 verilog常用程序示例 -与非网专题: fpga开发实用教程.htm
字号:
2'b11: q <= 1'bx;
<BR>
endcase <BR> end <BR>endmodule
<BR><BR>上述程序经过综合Synplify Pro后,其RTL级结构如图2-2所示。 </P>
<P align=center><IMG height=111 alt=""
src="第6节 Verilog常用程序示例 -与非网专题: FPGA开发实用教程.files/1211525074.jpg"
width=410><BR><BR>图2-2 同步RS触发器的RTL结构图</P>
<P><BR>在ModelSim 6.2b中完成仿真,其结果如图2-3所示 </P>
<P align=center><IMG height=83 alt=""
src="第6节 Verilog常用程序示例 -与非网专题: FPGA开发实用教程.files/1211525114.jpg"
width=590><BR><BR>图2-3 同步RS触发器的仿真结果示意图 </P>
<UL>
<LI>同步T触发器 </LI></UL>
<P>T触发器也分为同步触发器和异步触发器,二者的区别在于同步T触发器多了一个时钟端。同步T触发器的逻辑功能为:当时钟clk沿到来时,如果T=0,则触发器状态保持不变;否则,触发器输出端反转。R为复位端,当其为高电平时,输出Q与时钟无关,Q=0。
<BR><BR>例2-16 同步T触发器的Verilog实现。<BR><BR>module sy_t_ff(clk, r, t, q, qb);
<BR> input clk, r, t;
<BR> output q, qb;
<BR> reg q;
<BR><BR> assign qb = ~q;
<BR> always @(posedge clk) begin
<BR>
if(r)
<BR>
q <=
0; <BR>
else
<BR>
q <= ~q; <BR> end <BR>endmodule
<BR><BR> 上述程序经过综合Synplify
Pro后,其RTL级结构如图2-4所示。 </P>
<P align=center><IMG height=144 alt=""
src="第6节 Verilog常用程序示例 -与非网专题: FPGA开发实用教程.files/1211525196.jpg"
width=386><BR><BR>图2-4 同步T触发器电路的RTL结构图</P>
<P><BR>在ModelSim 6.2b中完成仿真,其结果如图2-5所示 </P>
<P align=center><IMG height=98 alt=""
src="第6节 Verilog常用程序示例 -与非网专题: FPGA开发实用教程.files/1211525257.jpg"
width=616><BR><BR>图2-5 同步T触发器的仿真结果示意图</P>
<UL>
<LI> 同步D触发器 </LI></UL>
<P>同步D触发器的功能为: D输入只能在时序信号clk的沿变化时才能被写入到存储器中,替换以前的值,常用于数据延迟以及数据存储模块中。
<BR><BR>例2-17 同步D触发器的Verilog实现。 <BR><BR>module sy_d_ff(clk, d, q, qb);
<BR> input clk, d;
<BR> output q, qb;
<BR> reg q;
<BR><BR> assign qb = ~q;
<BR> always @(posedge clk) begin
<BR>
q <= d; <BR> end <BR>endmodule
<BR><BR>上述程序经过综合Synplify Pro后,其RTL级结构如图2-6所示。 </P>
<P align=center><IMG height=112 alt=""
src="第6节 Verilog常用程序示例 -与非网专题: FPGA开发实用教程.files/1211525295.jpg"
width=429><BR><BR>图2-6 同步D触发器的RTL结构图</P>
<P><BR>在ModelSim 6.2b中完成仿真,其结果如图2-7所示 </P>
<P align=center><IMG height=78 alt=""
src="第6节 Verilog常用程序示例 -与非网专题: FPGA开发实用教程.files/1211525332.jpg"
width=613><BR><BR>图2-7 同步D触发器的仿真结果示意图</P>
<UL>
<LI>同步JK触发器 </LI></UL>
<P>JK触发器是在RS触发器的基础上发展而来的,常用于实现计数器。当clk=0时,触发器不工作,处于保持状态。当时钟clk=1时,触发器的功能如下:当JK为00、01以及10时实现RS触发器的功能;当JK为11时实现T触发器的功能。
<BR><BR>例2-18 同步JK触发器的Verilog实现。 <BR><BR>module sy_jk_ff(clk, j, k, q, qb);
<BR> input clk, i, k;
<BR> output q, qb;
<BR> reg q;
<BR><BR> assign qb = ~q;
<BR> always @(posedge clk) begin
<BR>
case({j, k})
<BR>
2'b00: q <= q;
<BR>
2'b01: q <=
0; <BR> 2'b10:
q <= 1;
<BR>
2'b11: q <=
~q; <BR> endcase <BR> end
<BR>endmodule <BR><BR>上述程序经过综合Synplify Pro后,其RTL级结构如图2-8所示。</P>
<P align=center><IMG height=152 alt=""
src="第6节 Verilog常用程序示例 -与非网专题: FPGA开发实用教程.files/1211525373.jpg"
width=362><BR><BR>图2-8 同步JK触发器的RTL结构图 </P>
<P><BR>在ModelSim 6.2b中完成仿真,其结果如图2-9所示 </P>
<P align=center><IMG height=79 alt=""
src="第6节 Verilog常用程序示例 -与非网专题: FPGA开发实用教程.files/1211525408.jpg"
width=600><BR><BR>图2-9 同步JK触发器的仿真结果示意图</P>
<P><BR><BR>2.三态缓冲器的Verilog实现
<BR><BR>三态缓冲器也称三态门,其典型应用是双向端口,常用于双向数据总线的构建。在数字电路中,逻辑输出有两个正常态:低电平状态(对应逻辑0)和高电平状态(对应逻辑1);此外,电路还有不属于0和1状态的高组态(对应于逻辑Z)。所谓高阻,即输出端属于浮空状态,只有很小的漏电流流动,其电平随外部电平高低而定,门电平放弃对输出电路的控制。或者可以理解为输出与电路是断开的。最基本的三态缓冲器的逻辑符号如图2-10所示。
</P>
<P align=center><IMG height=89 alt=""
src="第6节 Verilog常用程序示例 -与非网专题: FPGA开发实用教程.files/1206063875.jpg"
width=267> <BR><BR>图2-10 三态缓冲器的逻辑符号图 </P>
<P
align=left><BR>当OE为高电平时,Dataout与Datain相连;而OE为低时,Dataout为高阻态,相当于和Datain之间的连线断开。
<BR><BR>例2-19 使用Verilog实现三态缓冲器 <BR><BR>inout a; <BR>wire z, b;
<BR>//当控制信号z为1时,开通三态门,b为输入端口;当z为0时,三态门为高阻, <BR>//a为输出端口 <BR>assign a = (z) ? b :
8'bz; <BR><BR>3.38译码器的Verilog实现
<BR><BR>38译码器是通过3条线来达到控制8条线的状态,就是通过3条控制线不同的高低电平组合,
一共可以组合出23=8种状态。在电路中主要起到扩展IO资源的作用。当然,可根据实际需求将38译码器扩展到更高级数上。 <BR><BR>例2-20
使用Verilog实现38译码器 <BR><BR>module decoder3to8(din, reset, dout);
<BR> input [2:0] din; <BR> input reset;
<BR> output [7:0] dout; <BR><BR> reg [7:0]
dout; <BR> always @(din or reset) begin
<BR> if(!reset)
<BR> dout =
8'b0000_0000; <BR> else
<BR> case(din)
<BR>
3'b000: dout = 8'b0000_0001;
<BR>
3'b001: dout =
8'b0000_0010; <BR> 3'b010:
dout = 8'b0000_0100;
<BR>
3'b011: dout =
8'b0000_1000; <BR> 3'b100:
dout =
8'b0001_0000; <BR> 3'b101:
dout =
8'b0010_0000; <BR> 3'b110:
dout =
8'b0100_0000; <BR> 3'b111:
dout =
8'b1000_0000; <BR> endcase
<BR> end <BR><BR>endmodule <BR><BR>上述程序经过综合Synplify
Pro后,其RTL级结构如图2-11所示。 </P>
<P align=center><IMG height=228 alt=""
src="第6节 Verilog常用程序示例 -与非网专题: FPGA开发实用教程.files/1211525461.jpg"
width=170><BR><BR><BR>图2-11 38译码器的RTL结构图 </P>
<P align=left><BR>在ModelSim 6.2b中完成仿真,其结果如图2-12所示 </P>
<P align=center><IMG height=127 alt=""
src="第6节 Verilog常用程序示例 -与非网专题: FPGA开发实用教程.files/1211525540.jpg"
width=559><BR><BR>图2-12 38译码器的仿真结果示意图</P>
<P align=left><BR><STRONG>2.6.2 基本时序处理模块</STRONG> <BR><BR>1.奇、偶数分频电路
<BR><BR>在数字逻辑电路设计中,分频器是一种基本电路。通常用来对某个给定频率进行分频,以得到所需的频率。 </P>
<UL>
<LI>
<DIV align=left>偶数分频电路</DIV></LI></UL>
<P
align=left>偶数倍分频是最简单的一种分频模式,完全可通过计数器计数实现。如要进行N倍偶数分频,那么可由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数,以此循环下去。这种方法可以实现任意的偶数分频。例2-21给出的是一个16分频电路,其它倍数的分频电路可通过修改计数器的上限值得到。<BR><BR>例2-21
用Verilog实现一个16分频电路。<BR><BR>module clk_div16(clk_in, reset, clk_out);
<BR> input
clk_in; <BR> input reset;
<BR> output
clk_out; <BR><BR> reg
clk_out; <BR> reg [2:0]
cnt; <BR> always @(posedge
clk_in) begin
<BR>
if(!reset) begin
<BR>
cnt <= 0;
<BR>
clk_out <= 0; <BR> end
<BR> else
<BR>
if(cnt == 7)
begin <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -