西安邮电大学verilog HDL 实验报告.docx
- 文档编号:18599583
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:19
- 大小:20.93KB
西安邮电大学verilog HDL 实验报告.docx
《西安邮电大学verilog HDL 实验报告.docx》由会员分享,可在线阅读,更多相关《西安邮电大学verilog HDL 实验报告.docx(19页珍藏版)》请在冰点文库上搜索。
西安邮电大学verilogHDL实验报告
西安邮电大学
verilog课程实验报告
院系:
电子工程学院
专业班级:
电子10班
学号:
(17)
姓名:
222
2013年6月8日
实验一门级建模
1.实验内容
(1)使用nand门编写双输入端的与门,或门及非门my_or,my_and和my_not门构造一个双输入端
的xor门,其功能是计算z=x’y+xy’,其中x和y为输入,z为输出;编写激励模块对x和y的四种输入组合进行测试仿真。
(2)本章中的一位全加器使用乘积项之和的形式可以表示为:
Sum=a*b*c_in+a’b*c_in’+a’b’*c_in+a*b’*c_in’
C_out=a*b+b*c_in+a*c_in
其中a,b和c_in为输入,sum和c_out为输出;只使用与门、或门、非门实现一个一位全加器,写出Verilog描述,限制是每个门最多有四个输入端。
编写激励模块对功能进行检查,并对全部的输入组合进行测试。
2.实验目的
(1)掌握门基本类型,并学习Verilog提供的门级原语
(2)理解门的实例引用
(3)熟悉门级建模的一般步骤
(4)熟悉编程软件
3.实验步骤
(1)先根据题目要求构建my_or,my_and,my_not;其次根据所设计的门来设计my_xor,并且编写激励对所设计的进行验证
实验代码及仿真激励代码如下
modulemyxor(out,x,y);
outputout;
inputx,y;
wirex,y;
wirey0,y1,y2,y3;
my_notmynot0(y0,x,1);
my_notmynot1(y1,y,1);
my_andmyand0(y2,y,y0);
my_andmyand1(y3,y1,x);
my_ormyor0(out,y2,y3);
endmodule
modulemy_or(out,in0,in1);
outputout;
inputin0,in1;
wirey0,y1;
nand(y0,in0,1);
nand(y1,in1,1);
nand(out,y0,y1);
endmodule
modulemy_and(out,in0,in1);
outputout;
inputin0,in1;
wirey0;
nand(y0,in0,in1);
nand(out,y0,1);
endmodule
modulemy_not(out,in0,);
outputout;
inputin0;
nand(out,in0,1);
endmodule
modulestimulus;
regin0,in1;
wireOUT;
myxormyxor1(OUT,in0,in1);
initial
begin
in0=0;in1=0;
#1$display("in0=%b,in1=%b,OUT=%b\n",in0,in1,OUT);
in0=0;in1=1;
#1$display("in0=%b,in1=%b,OUT=%b\n",in0,in1,OUT);
in0=1;in1=0;
#1$display("in0=%b,in1=%b,OUT=%b\n",in0,in1,OUT);
in0=1;in1=1;
#1$display("in0=%b,in1=%b,OUT=%b\n",in0,in1,OUT);
end
endmodule
其仿真结果及波形图如下:
(2)实验二的代码如下
modulefulladd(sum,c_out,a,b,c_in);
outputsum,c_out;
inputa,b,c_in;
wirey0,y1,y2,y3,y4,y5,y6,y7,y8,y9;
not(y0,a);
not(y1,b);
not(y2,c_in);
and(y3,a,b,c_in);
and(y4,y0,b,y2);
and(y5,y0,y1,c_in);
and(y6,a,y2,y1);
or(sum,y3,y4,y5,y6);
and(y7,a,b);
and(y8,b,c_in);
and(y9,a,c_in);
or(c_out,y7,y8,y9);
endmodule
modulestimulus;
regin0,in1,in2;
wiresum,c_out;
fulladdfulladd1(sum,c_out,in0,in1,in2);
initial
begin
in0=0;in1=0;in2=0;
#1$display("in0=%bin1=%bin2=%bsum=%bc_out=%b\n",in0,in1,in2,sum,c_out);
in0=0;in1=0;in2=1;
#1$display("in0=%bin1=%bin2=%bsum=%bc_out=%b\n",in0,in1,in2,sum,c_out);
in0=0;in1=1;in2=0;
#1$display("in0=%bin1=%bin2=%bsum=%bc_out=%b\n",in0,in1,in2,sum,c_out);
in0=0;in1=1;in2=1;
#1$display("in0=%bin1=%bin2=%bsum=%bc_out=%b\n",in0,in1,in2,sum,c_out);
in0=1;in1=0;in2=0;
#1$display("in0=%bin1=%bin2=%bsum=%bc_out=%b\n",in0,in1,in2,sum,c_out);
in0=1;in1=0;in2=1;
#1$display("in0=%bin1=%bin2=%bsum=%bc_out=%b\n",in0,in1,in2,sum,c_out);
in0=1;in1=1;in2=0;
#1$display("in0=%bin1=%bin2=%bsum=%bc_out=%b\n",in0,in1,in2,sum,c_out);
in0=1;in1=1;in2=1;
#1$display("in0=%bin1=%bin2=%bsum=%bc_out=%b\n",in0,in1,in2,sum,c_out);
end
endmodule
仿真结果及波形如下:
4.实验中遇到的问题及解决方法
(1)因为是第一次做实验,所以首先得熟悉编程软件modesim的使用的过程中就出现了问题,简单的编程之后进行仿真的时候找不到work文件,最后发觉自己使用软件时出现了错误,在整个过程中要遵循以下流程:
新建工程——新建Verilog文件——编程——保存——编译——仿真。
(2)端口定义的时候和后面实例化的过程端口顺序一定要一一对应
5.心得体会
在该实验中我第一次接触到了Verilog语言的应用,并且基本掌握了modesim的基本应用,第一次实验后,我发觉这样的实验是很重要的,这是课本知识和实际相结合的过程,所以这个非常具有使用价值,从正面来让我们了解和验证我们的思想是否正确。
同时将课本所学知识引用到实验中也用一定的差距,过程中一定要细心才能完成这些,是一种对课本知识的最直接的理解。
实验二数据流建模
1.实验内容
一个同步计数器可以使用JK触发器来设计。
设计一个同步计数器,其逻辑图和JK触发器的逻辑图已给,清零信号clear低电平有效,输入数据在时钟信号clock的上升沿被锁存,触发器在clock的下降沿输出;当count_enable信号为低电平时停止计数。
写出同步计数器的Verilog描述和激励模块,在激励模块中使用clear和count_enable对计数器进行测试,并显示输出数Q[3:
0].
2.实验目的
(1)学习连续赋值语句assign的使用,了解对于连续赋值语句的限制以及隐式连续赋值语句。
(2)掌握数据流结构对实际的数字电路建模。
3.实验步骤
(1)实验代码如下
modulecounter(Q,clear,clock,count_enable);
output[3:
0]Q;
inputclear,clock,count_enable;
wirey0,y1,y2;
assigny0=Q[0]&count_enable;
assigny1=y0&Q[1];
assigny2=y1&Q[2];
JK_FFjk1(Q[0],clock,clear,count_enable,count_enable);
JK_FFjk2(Q[1],clock,clear,y0,y0);
JK_FFjk3(Q[2],clock,clear,y1,y1);
JK_FFjk4(Q[3],clock,clear,y2,y2);
endmodule
moduleJK_FF(q,clock,clear,J,K);
outputq;
inputclock,clear,J,K;
wirea,b,c,abar,ybar,y,d,cbar,qbar;
assigncbar=~clock;
assigna=~(qbar&J&clock&clear);
assignb=~(clock&K&q);
assigny=~(a&ybar);
assignybar=~(clear&y&b);
assignc=~(y&cbar);
assignd=~(cbar&ybar);
assignq=~(c&qbar);
assignqbar=~(q&clear&d);
endmodule
//`timescale1ns/1ps
modulestimulus;
regclock,clear,count_enable;
wire[3:
0]Q;
initial
$monitor($time,"Q=%bclear=%dclock=%dcount_enable=%d",Q[3:
0],clear,clock,count_enable);
counterc1(Q,clear,clock,count_enable);
initial
begin
clear=1'b0;
#5clear=1'b1;
end
initial
begin
count_enable=1'b1;
end
initial
begin
clock=1'b0;
forever#5clock=~clock;
end
endmodule
实验结果及波形:
4.实验中遇到的问题及解决方法
(1)连续赋值语句的左值必须是一个标量或向量线网,或者是标量或向量线网的并接,而不能是向量或向量寄存器。
同时为了保证其使用的正确性,最好将每一个每一个连续赋值语句都用assign,虽然一个assign可以连续赋值多个。
(2)对于在自己所写的实例引用中未使用到的端口有两中处理方法:
a.在定义端口变量的时候可以将未用到的端口不进行定义;b.在实例引用的时候将其悬空。
一般用第二种方法,在这里为了保持电路的完整性,所以其实际电路的端口都要在端口定义中体现出来。
5.心得体会
在这次实验中要注意数据流和门级建模的差别,由于受到上一章的门级建模的影响,在设计该实验的时候,我习惯性的使用了门级建模中的一些语言习惯。
同时在该实验中第一次用到forever语句,这个关键字在应用时没有什么太大问题,但在仿真的时候,一定要有仿真时间的限定,不然会出现一些故障。
实验三行为级建模
1.实验内容
使用case语句设计八功能的算术运算单元,其输入信号a和b均为4位,功能选择select为3位,输出out为5位。
算术单位ALU所执行的操作与select信号有关,具体关系见下表,忽略输出结果的上溢和下溢的位。
Select信号
功能
3’b000
Out=a
3’b001
Out=a+b
3’b010
Out=a-b
3’b011
Out=a/b
3’b100
Out=a%b
3’b101
Out=a<<1
3’b110
Out=a>>1
3’b111
Out=a>b(大小幅度比较)
2.实验目的
(1)使用always和initial,并了解其在行为级建模中的重要性
(2)理解行为级建模中基于延迟的时序控制机制
(3)知道如何在行为级建模中使用电平敏感的时序控制机制
(4)使用case等语句
3实验步骤
(1)实验代码:
moduleEight_input_ALU(out,a,b,select);
output[4:
0]out;
input[3:
0]a,b;
input[2:
0]select;
reg[4:
0]out;
always@(aorborselect)
begin
case(select)
3'b000:
out=a;
3'b001:
out=a+b;
3'b010:
out=a-b;
3'b011:
out=a/b;
3'b100:
out=a%b;
3'b101:
out=a<<1;
3'b110:
out=a>>1;
3'b111:
out=a>b;
default:
out=5'dx;
endcase
end
endmodule
modulestimulus;
reg[3:
0]A,B;
reg[2:
0]SELECT;
wire[4:
0]OUT;
Eight_input_ALUa1(OUT,A,B,SELECT);
initial
begin
$monitor($time,"OUT=%bSELECT=%b",OUT,SELECT);
end
initial
begin
A=4'b1101;B=4'b0010;SELECT=3'b000;
forever#5SELECT=SELECT+1;
end
endmodule
(2)实验结果及波形图如下:
3.实验中遇到的问题及解决方法
该实验中用到case语句,在时序边沿敏感电路中用该语句的时候一定要用default,同时endcase不能丢。
4.心得体会
这该实验中了解到了initial语句,该语句是从仿真0时刻开始执行,同时在整个仿真过程中执行一次,并且是各自独立的,一般的使用begin和end将他们组合成一个块语句;还用就是不要在同一个always块中混合使用阻塞和非阻塞赋值语句。
实验四函数
1.实验内容
设计一个实现8位ALU功能的函数,其输入为两个4位操作数变量a和b,以及一个3位的选择信号select,输出为5位变量out,具体关系见下表。
不考虑计算结果上溢和下溢。
Select信号
功能
3’b000
Out=a
3’b001
Out=a+b
3’b010
Out=a-b
3’b011
Out=a/b
3’b100
Out=a%b
3’b101
Out=a<<1
3’b110
Out=a>>1
3’b111
Out=a>b(大小幅度比较)
2.实验目的
(1)理解定义函数所需的条件,学会函数的声明和调用
(2)了解和掌握函数的建立和应用
(3)理解函数和任务的区别
3.实验步骤
(1)实验代码:
moduleEight_ALU(out,select,a,b);
output[4:
0]out;
reg[4:
0]out;
input[2:
0]select;
input[3:
0]a,b;
always@(select)
begin
out=ALU(select,a,b);
end
function[4:
0]ALU;
input[2:
0]select;
input[3:
0]a,b;
begin
case(select)
3'b000:
ALU=a;
3'b001:
ALU=a+b;
3'b010:
ALU=a-b;
3'b011:
ALU=a/b;
3'b100:
ALU=a%b;
3'b101:
ALU=a<<1;
3'b110:
ALU=a>>1;
3'b111:
ALU=a>b;
default:
ALU=0;
endcase
end
endfunction
endmodule
modulestimulus;
reg[3:
0]A;
reg[3:
0]B;
reg[2:
0]SELECT;
wire[4:
0]OUT;
Eight_ALUalu1(OUT,SELECT,A,B);
initial
begin
$monitor($time,"A=%b,B=%b,SELECT=%b,OUT=%b\n",A,B,SELECT,OUT);
end
initial
begin
A=4'b1101;B=4'b1011;
SELECT=4'b000;
forever#5SELECT=SELECT+1;
#400$finish;
end
endmodule
(2)实验结果及波形:
(3)结果分析:
4.实验中遇到的问题及解决方法
(1)函数声明要单独用functions和endfunction进行声明,同时还要注意在子程序内不能含有延迟、时序或控制结构;只有一个返回值;至少有一个输入变量;没有输出或双向变量;不含有非阻塞赋值语句。
(2)函数的返回值就是函数名,所以要保证函数返回值和函数名一致
5.心得体会
在学习以前很少接触的东西的时候一定要将多看看一些例子,仔细看懂怎么应用,然后自己才懂得怎么用,在这之前我很少用函数,即使是在平常的c语言编程中也是很少使用,所以刚接触到这个的时候,根本不知道怎么写,在网上看了一些例子后渐渐的熟悉了函数的应用。
实验四使用VerilogHDL进行逻辑综合
1.实验内容
使用同步有限状态自动机方法设计一个电路,它的引脚in接受一位的输入流。
每当检测到馍10101时,输出引脚match被赋值为高电平。
Reset引脚以同步方法初始化电路。
输入引脚clk用于给电路提供时钟信号。
使用身边现有的任何工艺综合该电路。
优化电路。
使其达到最快速度。
把同样的激励应用到RTL和门级网表上,比较它们的输出。
2.实验目的
3.实验步骤
(1)需求分析:
(2)实验代码:
modulefsm(match,reset,in,clk);
outputmatch;
inputreset;
inputin,clk;
regmatch;
parameterst0=0,st1=1,st2=2,st3=3,st4=4;
reg[2:
0]p_start,n_start;
always@(negedgeclk)
if(reset)p_start<=0;
elsep_start<=n_start;
always@(p_startorin)
begin
match=0;
case(p_start)
st0:
if(in)
begin
n_start=1;
end
else
begin
n_start=0;
end
st1:
if(~in)
begin
n_start=2;
end
else
begin
n_start=1;
end
st2:
if(in)
begin
n_start=3;
end
else
begin
n_start=0;
end
st3:
if(~in)
begin
n_start=4;
end
else
begin
n_start=1;
end
st4:
if(in)
begin
match=1;
n_start=1;
end
else
begin
n_start=0;
end
default:
n_start=0;
endcase
end
endmodule
//timescale100ns/1ns;
modulestimulus;
regIN,CLK;
wireMATCH;
regRESET;
fsmf1(MATCH,RESET,IN,CLK);
initial
begin
CLK=0;RESET=1;IN=0;
@(negedgeCLK);
RESET=0;
@(posedgeCLK)IN=0;
@(posedgeCLK)IN=1;
@(posedgeCLK)IN=0;
@(posedgeCLK)IN=1;
@(posedgeCLK)IN=0;
@(posedgeCLK)IN=1;
@(posedgeCLK)IN=0;
@(posedgeCLK)IN=1;
@(posedgeCLK)IN=0;
@(posedgeCLK)IN=1;
@(posedgeCLK)IN=1;
end
always
begin
#1CLK=~CLK;
end
endmodule
(3)实验数据及波形:
(4)分析
4.实验中遇到的问题及解决方法
(1)因为没有意识到输入端是一位的,而检测的模式是10101五位的,所以在第一编写的时候,只能接受第一次输入的in,应该将in变量也要写入always语句中。
这样才能根据它来得到适时的in值。
(2)在没有给match赋初值的时候,虽然编译通过了,但运行的波形中并没有确切的值,所以要赋予一个初值。
(3)仿真中一定要考虑到激励和输入的点及持续的时间,尽量不能让输入的突变和激励的下降沿重合,不然会产生模糊匹配,导致接受到的输入端有问题,同时要保证每个输入要保持到一段时间,保证每一个输入数据能够接受到。
在之前我用的是通过时间调整希望输入数据能够在激励的下降沿能接入,但还是会出现错误,在老师的指导下使用的在激励的每个上升沿输入一新的数据,并在下降沿接入,这样就能够保证每一个能接收到
(4)在刚开始的时候,虽然能够识别10101模式了,但如果是101010101模式的时候只能识别一次,所以很明显程序不够完整,通过老师的指点将最后一个人状态跳转修改了后完善了该电路。
5.心得体会
由于这一章并没有学,只是在之前接触到一次有限状态自动机,当听说要最该实验的时候,有很多同学都认为没学过而选择放弃。
我也是这样,只是看了一下题而选择不做。
但到晚上没事的时候在看这个题的时候,根据前面学过的发觉这个并不是太难,大致的能写出来,随意大致想了一下后,还是坚持将其写完了,所以在面临新的知识点时候,一定要有钻研的精神,同时想问题也要多想一些情况,这样才能全面。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安邮电大学verilog HDL 实验报告 西安 邮电大学 verilog 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)