Verilog HDL 程序设计教程Word文件下载.docx
- 文档编号:18614021
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:40
- 大小:24.35KB
Verilog HDL 程序设计教程Word文件下载.docx
《Verilog HDL 程序设计教程Word文件下载.docx》由会员分享,可在线阅读,更多相关《Verilog HDL 程序设计教程Word文件下载.docx(40页珍藏版)》请在冰豆网上搜索。
//设定a的取值
程序文本
-2-
for(j=1;
j<
j=j+1)
#10b=j;
//设定b的取值
initial//定义结果显示格式
$monitor($time,,,"
%d+%d+%b={%b,%d}"
a,b,cin,cout,sum);
#160$finish;
【例3.4】4位计数器的仿真程序
count4.v"
modulecoun4_tp;
regclk,reset;
parameterDELY=100;
count4mycount(out,reset,clk);
always#(DELY/2)clk=~clk;
//产生时钟波形
begin//激励信号定义
clk=0;
reset=0;
#DELYreset=1;
#DELYreset=0;
#(DELY*20)$finish;
//定义结果显示格式
initial$monitor($time,,,"
clk=%dreset=%dout=%d"
clk,reset,out);
【例3.5】“与-或-非”门电路
moduleAOI(A,B,C,D,F);
//模块名为AOI(端口列表A,B,C,D,F)
inputA,B,C,D;
//模块的输入端口为A,B,C,D
outputF;
//模块的输出端口为F
王金明:
《VerilogHDL程序设计教程》
-3-
wireA,B,C,D,F;
//定义信号的数据类型
assignF=~((A&
B)|(C&
D));
//逻辑功能描述
【例5.1】用case语句描述的4选1数据选择器
modulemux4_1(out,in0,in1,in2,in3,sel);
outputout;
inputin0,in1,in2,in3;
input[1:
0]sel;
regout;
always@(in0orin1orin2orin3orsel)//敏感信号列表
case(sel)
2'
b00:
out=in0;
b01:
out=in1;
b10:
out=in2;
b11:
out=in3;
default:
out=2'
bx;
endcase
【例5.2】同步置数、同步清零的计数器
modulecount(out,data,load,reset,clk);
output[7:
input[7:
0]data;
inputload,clk,reset;
reg[7:
always@(posedgeclk)//clk上升沿触发
if(!
reset)out=8'
h00;
//同步清0,低电平有效
elseif(load)out=data;
//同步预置
elseout=out+1;
【例5.3】用always过程语句描述的简单算术逻辑单元
`defineadd3'
d0
`defineminus3'
d1
`defineband3'
d2
`definebor3'
d3
`definebnot3'
d4
-4-
modulealu(out,opcode,a,b);
input[2:
0]opcode;
//操作码
//操作数
always@(opcodeoraorb)//电平敏感的always块
case(opcode)
`add:
out=a+b;
//加操作
`minus:
out=a-b;
//减操作
`band:
out=a&
b;
//求与
`bor:
out=a|b;
//求或
`bnot:
out=~a;
//求反
out=8'
hx;
//未收到指令时,输出任意态
【例5.4】用initial过程语句对测试变量A、B、C赋值
moduletest;
regA,B,C;
A=0;
B=1;
C=0;
#50A=1;
B=0;
#50A=0;
C=1;
#50B=1;
#50B=0;
#50$finish;
【例5.5】用begin-end串行块产生信号波形
`timescale10ns/1ns
modulewave1;
regwave;
parametercycle=10;
-5-
wave=0;
#(cycle/2)wave=1;
#(cycle/2)wave=0;
#(cycle/2)$finish;
wave=%b"
wave);
【例5.6】用fork-join并行块产生信号波形
modulewave2;
parametercycle=5;
fork
#(cycle)wave=1;
#(2*cycle)wave=0;
#(3*cycle)wave=1;
#(4*cycle)wave=0;
#(5*cycle)wave=1;
#(6*cycle)$finish;
join
【例5.7】持续赋值方式定义的2选1多路选择器
moduleMUX21_1(out,a,b,sel);
inputa,b,sel;
assignout=(sel==0)?
a:
//持续赋值,如果sel为0,则out=a;
否则out=b
【例5.8】阻塞赋值方式定义的2选1多路选择器
moduleMUX21_2(out,a,b,sel);
-6-
always@(aorborsel)
if(sel==0)out=a;
//阻塞赋值
elseout=b;
【例5.9】非阻塞赋值
modulenon_block(c,b,a,clk);
outputc,b;
inputclk,a;
regc,b;
b<
=a;
c<
=b;
【例5.10】阻塞赋值
moduleblock(c,b,a,clk);
b=a;
c=b;
【例5.11】模为60的BCD码加法计数器
modulecount60(qout,cout,data,load,cin,reset,clk);
0]qout;
inputload,cin,clk,reset;
always@(posedgeclk)//clk上升沿时刻计数
-7-
if(reset)qout<
elseif(load)qout<
=data;
//同步置数
elseif(cin)
if(qout[3:
0]==9)//低位是否为9,是则
qout[3:
0]<
//回0,并判断高位是否为5
if(qout[7:
4]==5)qout[7:
4]<
else
qout[7:
=qout[7:
4]+1;
//高位不为5,则加1
else//低位不为9,则加1
=qout[3:
0]+1;
assigncout=((qout==8'
h59)&
cin)?
1:
0;
//产生进位输出信号
【例5.12】BCD码—七段数码管显示译码器
moduledecode4_7(decodeout,indec);
output[6:
0]decodeout;
0]indec;
reg[6:
always@(indec)
case(indec)//用case语句进行译码
4'
d0:
decodeout=7'
b1111110;
d1:
b0110000;
d2:
b1101101;
d3:
b1111001;
d4:
b0110011;
d5:
b1011011;
d6:
b1011111;
d7:
b1110000;
d8:
b1111111;
d9:
b1111011;
decodeout=7'
-8-
【例5.13】用casez描述的数据选择器
modulemux_casez(out,a,b,c,d,select);
inputa,b,c,d;
0]select;
always@(selectoraorborcord)
casez(select)
b?
?
out=a;
1?
:
out=b;
out=c;
b1?
out=d;
【例5.14】隐含锁存器举例
moduleburied_ff(c,b,a);
outputc;
inputb,a;
regc;
always@(aorb)
if((b==1)&
&
(a==1))c=a&
【例5.15】用for语句描述的七人投票表决器
modulevoter7(pass,vote);
outputpass;
input[6:
0]vote;
reg[2:
integeri;
regpass;
always@(vote)
sum=0;
-9-
for(i=0;
=6;
i=i+1)//for语句
if(vote[i])sum=sum+1;
if(sum[2])pass=1;
//若超过4人赞成,则pass=1
elsepass=0;
【例5.16】用for语句实现2个8位数相乘
modulemult_for(outcome,a,b);
parametersize=8;
input[size:
1]a,b;
//两个操作数
output[2*size:
1]outcome;
//结果
reg[2*size:
outcome=0;
i<
=size;
i=i+1)//for语句
if(b[i])outcome=outcome+(a<
<
(i-1));
【例5.17】用repeat实现8位二进制数的乘法
modulemult_repeat(outcome,a,b);
1]temp_a,outcome;
reg[size:
1]temp_b;
temp_a=a;
temp_b=b;
repeat(size)//repeat语句,size为循环次数
if(temp_b[1])//如果temp_b的最低位为1,就执行下面的加法
outcome=outcome+temp_a;
temp_a=temp_a<
1;
//操作数a左移一位
-10-
temp_b=temp_b>
>
//操作数b右移一位
【例5.18】同一循环的不同实现方式
moduleloop1;
//方式1
4;
$display(“i=%h”,i);
moduleloop2;
//方式2
initialbegin
i=0;
while(i<
4)//while语句
$display("
i=%h"
i);
i=i+1;
moduleloop3;
//方式3
repeat(4)//repeat语句
【例5.19】使用了`include语句的16位加法器
-11-
adder.v"
moduleadder16(cout,sum,a,b,cin);
parametermy_size=16;
output[my_size-1:
input[my_size-1:
addermy_adder(cout,sum,a,b,cin);
//调用adder模块
//下面是adder模块代码
moduleadder(cout,sum,a,b,cin);
parametersize=16;
output[size-1:
input[size-1:
assign{cout,sum}=a+b+cin;
【例5.20】条件编译举例
modulecompile(out,A,B);
inputA,B;
`ifdefadd//宏名为add
assignout=A+B;
`else
assignout=A-B;
`endif
【例6.1】加法计数器中的进程
modulecount(data,clk,reset,load,cout,qout);
inputclk,reset,load;
-12-
always@(posedgeclk)//进程1,always过程块
reset)qout=4'
elseif(load)qout=data;
elseqout=qout+1;
//加法计数
assigncout=(qout==4'
hf)?
//进程2,用持续赋值产生进位信号
【例6.2】任务举例
modulealutask(code,a,b,c);
0]code;
output[4:
0]c;
reg[4:
taskmy_and;
//任务定义,注意无端口列表
//a,b,out名称的作用域范围为task任务内部
for(i=3;
i>
i=i-1)
out[i]=a[i]&
b[i];
//按位与
endtask
always@(codeoraorb)
case(code)
my_and(a,b,c);
/*调用任务my_and,需注意端口列表的顺序应与任务定义中的一致,这里的a,b,c
分别对应任务定义中的a,b,out*/
c=a|b;
//或
c=a-b;
//相减
c=a+b;
//相加
-13-
【例6.3】测试程序
alutask.v"
modulealu_tp;
reg[1:
wire[4:
parameterDELY=100;
alutaskADD(code,a,b,c);
//调用被测试模块
code=4'
d0;
a=4'
b0000;
b=4'
b1111;
#DELYcode=4'
b0111;
b1101;
d1;
b0001;
b0011;
d2;
b1001;
d3;
#DELY$finish;
code=%ba=%bb=%bc=%b"
code,a,b,c);
【例6.4】函数
function[7:
0]get0;
0]x;
0]count;
count=0;
for(i=0;
=7;
if(x[i]=1'
b0)count=count+1;
get0=count;
endfunction
【例6.5】用函数和case语句描述的编码器(不含优先顺序)
modulecode_83(din,dout);
0]din;
output[2:
0]dout;
-14-
function[2:
//函数定义
//函数只有输入,输出为函数名本身
casex(din)
8'
b1xxx_xxxx:
code=3'
h7;
b01xx_xxxx:
h6;
b001x_xxxx:
h5;
b0001_xxxx:
h4;
b0000_1xxx:
h3;
b0000_01xx:
h2;
b0000_001x:
h1;
b0000_000x:
h0;
assigndout=code(din);
//函数调用
【例6.6】阶乘运算函数
modulefunct(clk,n,result,reset);
output[31:
0]result;
input[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Verilog HDL 程序设计教程 程序设计 教程