⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 第6节 verilog常用程序示例 -与非网专题: fpga开发实用教程.htm

📁 一百多个例子很好的verilog 学习资料
💻 HTM
📖 第 1 页 / 共 4 页
字号:
2'b11: q <= 1'bx; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
endcase <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input clk, r, t; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output q, qb; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg q; 
<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assign qb = ~q; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; always @(posedge clk) begin 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;if(r) 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
q &lt;= 
0;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
else 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
q &lt;= ~q; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end <BR>endmodule 
<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上述程序经过综合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>&nbsp;同步D触发器 </LI></UL>
<P>同步D触发器的功能为: D输入只能在时序信号clk的沿变化时才能被写入到存储器中,替换以前的值,常用于数据延迟以及数据存储模块中。 
<BR><BR>例2-17 同步D触发器的Verilog实现。 <BR><BR>module sy_d_ff(clk, d, q, qb); 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input clk, d; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output q, qb; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg q; 
<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assign qb = ~q; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; always @(posedge clk) begin 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
q &lt;= d; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input clk, i, k; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output q, qb; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg q; 
<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assign qb = ~q; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; always @(posedge clk) begin 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
case({j, k}) 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
2'b00: q &lt;= q; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
2'b01: q &lt;= 
0;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2'b10: 
q &lt;= 1; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
2'b11: q &lt;= 
~q;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endcase&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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结构图&nbsp; </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>&nbsp;<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>&nbsp;&nbsp;&nbsp; input [2:0] din; <BR>&nbsp;&nbsp;&nbsp; input reset; 
<BR>&nbsp;&nbsp;&nbsp; output [7:0] dout; <BR><BR>&nbsp;&nbsp;&nbsp; reg [7:0] 
dout; <BR>&nbsp;&nbsp;&nbsp; always @(din or reset) begin 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!reset) 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dout = 
8'b0000_0000; <BR>&nbsp;&nbsp;&nbsp; else 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case(din) 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
3'b000: dout = 8'b0000_0001; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
3'b001: dout = 
8'b0000_0010;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3'b010: 
dout = 8'b0000_0100; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
3'b011: dout = 
8'b0000_1000;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3'b100: 
dout = 
8'b0001_0000;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3'b101: 
dout = 
8'b0010_0000;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3'b110: 
dout = 
8'b0100_0000;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3'b111: 
dout = 
8'b1000_0000;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endcase 
<BR>&nbsp;&nbsp;&nbsp; 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结构图&nbsp; </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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input 
clk_in;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input reset; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output 
clk_out;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reg 
clk_out;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reg [2:0] 
cnt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;always @(posedge 
clk_in) begin 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
if(!reset) begin 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
cnt &lt;= 0; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
clk_out &lt;= 0;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
if(cnt == 7) 
begin&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -