VerilogHDL实例.docx
- 文档编号:3082669
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:35
- 大小:72.09KB
VerilogHDL实例.docx
《VerilogHDL实例.docx》由会员分享,可在线阅读,更多相关《VerilogHDL实例.docx(35页珍藏版)》请在冰豆网上搜索。
VerilogHDL实例
本文档含有很多VerilogHDL例子:
//与门
modulezxhand2(c,a,b);
inputa,b;
outputc;
assignc=a&b;
endmodule
//或门
modulezxhor2(c,a,b);
inputa,b;
outputc;
assignc=a|b;
endmodule
//非门
modulezxhnot2(c,b);
inputb;
outputc;
assignc=~b;
endmodule
////异或门
modulezxhxro2(c,a,b);
inputb;
outputc;
assignc=a^b;
endmodule
两选一电路
moduledata_scan(d0,d1,sel,q);
outputq;
inputd0,d1,sel;
wiret1,t2,t3;
n1zxhand2(t1,d0,sel);
n2zxhnot2(t4,sel);
n3zxhand2(t2,d1,t4);
n4zxhor2(t3,t1,t2);
assignq=t1;
endmodule
verilogHDL实例〔一〕
练习一.简单的组合逻辑设计目的:
掌握根本组合逻辑电路的实现方法。
这是一个可综合的数据比拟器,很容易看出它的功能是比拟数据a与数据b,如果两个数据一样,那么给出结果1,否那么给出结果0。
在VerilogHDL中,描述组合逻辑时常使用assign构造。
注意equal=(a==b)?
1:
0,这是一种在组合逻辑实现分支判断时常使用的格式。
模块源代码:
//---------------pare.v-----------------
modulepare(equal,a,b);
inputa,b;
outputequal;
assignequal=(a==b)?
1:
0;//a等于b时,equal输出为1;a不等于b时,
//equal输出为0。
endmodule
测试模块用于检测模块设计得正确与否,它给出模块的输入信号,观察模块的部信号和输出信号,如果发现结果与预期的有所偏差,那么要对设计模块进展修改。
测试模块源代码:
`timescale1ns/1ns//定义时间单位。
moduleparetest;
rega,b;
wireequal;
initial//initial常用于仿真时信号的给出。
begina=0;
b=0;
#100a=0;
b=1;
#100a=1;
b=1;
#100a=1;
b=0;
#100$stop;//系统任务,暂停仿真以便观察仿真波形。
end
parepare1(.equal(equal),.a(a),.b(b));//调用模块。
Endmodule
【例3.1】4位全加器
moduleadder4(cout,sum,ina,inb,cin);
output[3:
0]sum;
outputcout;
input[3:
0]ina,inb;
inputcin;
assign{cout,sum}=ina+inb+cin;
endmodule
【例3.2】4位计数器
modulecount4(out,reset,clk);
output[3:
0]out;
inputreset,clk;
reg[3:
0]out;
always(posedgeclk)
begin
if(reset)out<=0;//同步复位
elseout<=out+1;//计数
end
endmodule
09.04.07
【例5.11】模为60的BCD码加法计数器
modulecount60(qout,cout,data,load,cin,reset,clk);
output[7:
0]qout;
outputcout;
input[7:
0]data;
inputload,cin,clk,reset;
reg[7:
0]qout;
always(posedgeclk)//clk上升沿时刻计数
begin
if(reset)qout<=0;//同步复位
elseif(load)qout<=data;//同步置数
elseif(cin)
begin
if(qout[3:
0]==9)//低位是否为9,是那么
begin
qout[3:
0]<=0;//回0,并判断高位是否为5
if(qout[7:
4]==5)qout[7:
4]<=0;
else
qout[7:
4]<=qout[7:
4]+1;//高位不为5,那么加1
end
else//低位不为9,那么加1
qout[3:
0]<=qout[3:
0]+1;
end
end
assigncout=((qout==8'h59)&cin)?
1:
0;//产生进位输出信号
endmodule
【例9.10】奇偶校验位产生器
moduleparity(even_bit,odd_bit,input_bus);
outputeven_bit,odd_bit;
input[7:
0]input_bus;
assignodd_bit=^input_bus;//产生奇校验位
assigneven_bit=~odd_bit;//产生偶校验位
endmodule
∙VerilogHDL实例〔二〕
练习二.简单时序逻辑电路的设计目的:
掌握根本时序逻辑电路的实现。
在VerilogHDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。
在可综合的VerilogHDL模型,我们通常使用always块和(posedgeclk)(上升沿)或(negedgeclk)(下降沿)的构造来表述时序逻辑。
下面是一个1/2分频器的可综合模型。
//half_clk.v:
modulehalf_clk(reset,clk_in,clk_out);
inputclk_in,reset;
outputclk_out;
regclk_out;
always(posedgeclk_in)
begin
if(!
reset) clk_out=0;
else clk_out=~clk_out;
end
endmodule
在always块中,被赋值的信号都必须定义为reg型,这是由时序逻辑电路的特点所决定的。
对于reg型数据,如果未对它进展赋值,仿真工具会认为它是不定态。
为了能正确地观察到仿真结果,在可综合风格的模块中我们通常定义一个复位信号reset,当reset为低电平时,对电路中的存放器进展复位。
测试模块的源代码:
//------------------- clk_Top.v-----------------------------
`timescale1ns/100ps
`defineclk_cycle50
moduleclk_Top.v;
regclk,reset;
wireclk_out;
always #`clk_cycle clk=~clk;
initial
begin
clk=0;
reset=1;
#100reset=0;
#100reset=1;
#10000$stop;
end
half_clkhalf_clk(.reset(reset),.clk_in(clk),.clk_out(clk_out));
endmodule
∙VerilogHDL实例〔三〕
练习三.利用条件语句实现较复杂的时序逻辑电路目的:
掌握条件语句在VerilogHDL中的使用。
与常用的高级程序语言一样,为了描述较为复杂的时序关系,VerilogHDL提供了条件语句供分支判断时使用。
在可综合风格的VerilogHDL模型中常用的条件语句有if…else和case…endcase两种构造,用法和C程序语言中类似。
两者相较,if…else用于不很复杂的分支关系,实际编写可综合风格的模块、特别是用状态机构成的模块时,更常用的是case…endcase风格的代码。
这一节我们给的是有关if…else的例,有关case…endcase构造的代码已后会经常用到。
下面给出的例也是一个可综合风格的分频器,是将10M的时钟分频为500K的时钟。
根本原理与1/2分频器是一样的,但是需要定义一个计数器,以便准确获得1/20分频
模块源代码:
//---------------fdivision.v-----------------------------
modulefdivision(reset,f10m,f500k);
inputf10m,reset;
outputf500k;
regf500k;
reg[7:
0]j;
always(posedgef10m)
if(!
RESET)//低电平复位。
begin
f500k<=0;
j<=0;
end
else
begin
if(j==19)//对计数器进展判断,以确定F500K信号是否反转。
begin
j<=0;
f500k<=~f500k;
end
else
j<=j+1;
end
endmodule测试模块源代码:
//--------------- fdivision_Top.v------------------------
`timescale1ns/100ps
`defineclk_cycle50
moduledivision_Top;
regf10m=0,reset;
wiref500k;
always#`clk_cyclef10m=~f10m;
initial
begin
reset=1;
#100reset=0;
#100reset=1;
#10000$stop;
end
fdivisionfdivision(.reset(reset),.f10m(f10m),.f500k(f500k));
endmodule
∙VerilogHDL实例〔四〕
练习四.设计时序逻辑时采用阻塞赋值与非阻塞赋值的区别目的:
1.明确掌握阻塞赋值与非阻塞赋值的概念和区别;
2.了解阻塞赋值的使用情况。
阻塞赋值与非阻塞赋值,在教材中我们已经了解了它们之间在语法上的区别以及综合后所得到的电路构造上的区别。
在always块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的。
实际的时序逻辑设计中,一般的情况下非阻塞赋值语句被更多地使用,有时为了在同一周期实现相互关联的操作,也使用了阻塞赋值语句。
〔注意:
在实现组合逻辑的assign构造中,无一例外地都必须采用阻塞
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VerilogHDL 实例