Verilog实验报告(电子)参考模板

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

西安邮电大学Verilog HDL大作业报告书
学院名称:电子工程学院
学生姓名:
专业名称:电子信息工程
班级:
实验一异或门设计
一、实验目的
(1)熟悉Modelsim 软件
(2)掌握Modelsim 软件的编译、仿真方法
(3)熟练运用Modelsim 软件进行HDL 程序设计开发
二、实验内容
my_or,my_and和my_not门构造一个双输入端的xor门,其功能是计算z=x’y+xy’,其中x和y为输入,z为输出;编写激励模块对x和y的四种输入组合进行测试仿真
1、实验要求
用Verilog HDL 程序实现一个异或门,Modelism仿真,观察效果。

2、步骤
1、建立工程
2、添加文件到工程
3、编译文件
4、查看编译后的设计单元
5、将信号加入波形窗口
6、运行仿真
实验描述如下:
module my_and(a_out,a1,a2);
output a_out;
input a1,a2;
wire s1;
nand(s1,a1,a2);
nand(a_out,s1,1'b1);
endmodule
module my_not(n_out,b);
output n_out;
input b;
nand(n_out,b,1'b1); endmodule
module my_or(o_out,c1,c2);
output o_out;
input c1,c2;
wire s1,s2;
nand(s1,c1,1'b1);
nand(s2,c2,1'b1);
nand(o_out,s1,s2); endmodule
module MY_XOR(z,x,y);
output z;
input x,y;
wire a1,a2,n1,n2;
my_not STEP01(n1,x);
my_not STEP02(n2,y);
my_and STEP03(a1,n1,y);
my_and STEP04(a2,n2,x);
my_or STEP05(z,a1,a2); Endmodule
module stimulus;
reg X,Y;
wire OUTPUT;
MY_XOR xor01(OUTPUT,X,Y);
initial
begin
$monitor($time,"X=%b,Y=%b --- OUTPUT=%b\n",X,Y,OUTPUT);
end
initial
begin
X = 1'b0; Y = 1'b0;
#5 X = 1'b1; Y = 1'b0;
#5 X = 1'b1; Y = 1'b1;
#5 X = 1'b0; Y = 1'b1;
end
endmodule
二、实验结果
波形图:
三、分析和心得
通过这次的实验,我基本熟悉Modelsim 软件,掌握了Modelsim 软件的编译、仿真方法。

同时在编写程序的过程中,加深了我对课上所讲的HDL的语法的认识。

实验二二进制全加器设计
一、实验目的
(1)熟悉Verilog HDL 元件实例化语句的作用
(2)熟悉全加器的工作原理
(3)用Verilog HDL 语言设计一位二进制全加器,并仿真,验证其功能二、实验内容
一位全加器使用乘积项之和的形式可以表示为:
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描述,限制是每个门最多只能有四个输入端。

编写激励模块对其功能进行检查,并对全部的输入组合输入组合进行测试。

实验要求
用 Verilog HDL 语言描述一位全加器,并使用 modelsim仿真验证结果。

module fulladd(sum,c_out,a,b,c_in);
output sum,c_out;
input a,b,c_in;
wire s1,s2,s3,s4,a1,b1,c_in1,c1,c2,c3;
and(s1,a,b,c_in);
not(a1,a);
not(b1,b);
not(c_in1,c_in);
and(s2,a1,b,c_in1);
and(s3,a1,b1,c_in);
and(s4,a,b1,c_in1);
and(c1,a,b);
and(c2,b,c_in);
and(c3,a,c_in);
or(sum,s1,s2,s3,s4);
or(c_out,c1,c2,c3);
endmodule
module stimulus;
reg A,B,C_IN;
wire SUM,C_OUT;
fulladd FA1(SUM,C_OUT,A,B,C_IN);
initial
begin
$monitor($time,"A=%b,
B=%b,C_IN=%b,---C_OUT=%b,SUM=%b\n",A,B,C_IN,C_OUT,SUM);
end
//???????
initial
begin
A=1'd0;B=1'd0;C_IN=1'b0;
#5 A=1'd0;B=1'd0;C_IN=1'b1;
#5 A=1'd0;B=1'd1;C_IN=1'b0;
#5 A=1'd0;B=1'd1;C_IN=1'b1;
#5 A=1'd1;B=1'd0;C_IN=1'b0;
#5 A=1'd1;B=1'd0;C_IN=1'b1;
#5 A=1'd1;B=1'd1;C_IN=1'b0;
#5 A=1'd1;B=1'd1;C_IN=1'b1;
End
实验结果波形:
三.分析和心得
通过这次试验我熟悉了Verilog HDL 元件例化语句的作用,并且熟悉全加器的工作原理。

在一位全加器的过程中,也了解了如何调用模块。

实验三使用JK触发器设计一个计数器
一、实验目的
(1)熟悉Modelsim 软件
(2)掌握Modelsim 软件的编译、仿真方法
(3)熟练运用Modelsim 软件进行HDL 程序设计开发
二、实验内容
一个同步计数器可以使用主从JK触发器来设计。

设计一个同步计数器,其逻辑图和JK触发器的逻辑图如书中图所示。

清零信号clear低电平有效,输入数据在时钟信号clock的上升沿被锁存,触发器在clock的下降沿输出;当count_enable信号为低电平时停止计数。

写出同步计数器的Verilog描述和激
励模块,在激励模块中使用clear和count_enable对计数器进行测试,并显示输出计数Q[3:0]。

技术规范:
本次试验中共有三个模块,分别是JK主从触发器设计模块,计数器设计模块及激励模块。

对于JK触发器,共有四个输入端(j,k,clear,clock),两个输出端(q,qbar),根据其实际电路结构做出相应的设计;对于计数器模块,有三个输入端(clear,clock,counter_clock),四个输出(Q[3:0]),使用的是四个JK触发器和门电路组合,采用同步清零和同步脉冲构成四位同步计数器;激励模块中根据技术模块输入端口进行相关赋值以便进行仿真观察;
三.实验步骤:
1.在modulesim软件中使用数据流建模进行四位计数器设计及输入;
2.进行编译及仿真。

四.源代码:
JK触发器模块:
module m_c_jkff(q,qbar,J,K,clear,clock);
output q,qbar;
input J,K,clear,clock;
wire a,b,c,d,y,ybar,cbar;
assign cbar=~clock;
assign #1 a=~(J & qbar & clock & clear),
b=~(K & q & clock),
y=~(a & ybar),
ybar=~(y & b & clear),
c=~(y & cbar),
d=~(ybar & cbar);
assign #1 q=~(c & qbar);
assign #1 qbar=~(d & clear & q);
endmodule
计数器模块:
module four_count_ff(Q,clear,clock,count_enable);
output [3:0] Q;
input clear,clock,count_enable;
wire a1,a2,a3;
assign a1=count_enable & Q[0],
a2=a1&Q[1], a3=a2&Q[2];
m_c_jkff m1(Q[0],,count_enable,count_enable,clear,clock); m_c_jkff m2(Q[1],,a1,a1,clear,clock);
m_c_jkff m3(Q[2],,a2,a2,clear,clock);
m_c_jkff m4(Q[3],,a3,a3,clear,clock);
endmodule
激励模块:
module stimulus;
reg clock,clear,count_enable;
wire [3:0] Q;
initial
$monitor($time,"Count Q = %b Clear = %b",Q[3:0],clear); four_count_ff f1(Q,clear,clock,count_enable);
initial
begin
clear=1'b0;
count_enable=1'b1;
#10 clear=1'b1;
//#1 count_enable=1'b1;
//#50 clear=1'b0;
//#100 count_enable=1'b0;
//#100 clear=1'b0;
//#50 clear=1'b1;
//#50 count_enable=1'b1;
end
initial
begin
clock=1'b0;
forever #20 clock=~clock;
end
initial
#1000 $finish;
Endmodule
波形图:
实验四八功能算术运算单元
一、实验目的
(1)熟悉Modelsim 软件
(2)掌握Modelsim 软件的编译、仿真方法
(3)熟练运用Modelsim 软件进行HDL 程序设计开发
二、实验内容
使用case语句设计八门功能的算术运算单元(ALU),输入信号a,b为4位,功能选择信号select为3位,输出信号out为5位。

忽略输出结果中的上溢和下溢。

三.实验步骤:
1.在modulesim软件中使用case语句设计八门功能的算术运算单元(ALU) 2. 进行编译及仿真。

module alu(out,a,b,select);
output [4:0] out;
input [3:0] a, b;
input [2:0] select;
reg [4:0] out;
always @(a or b or select)
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 : $display("Invalid ALU control signal");
endcase
end
endmodule
module stimulus;
reg [3:0] A,B;
reg [2:0] SELECT;
wire [4:0] OUT;
initial
$monitor($time," A= %b B= %b SELECT= %b OUT= %b ",A[3:0],B[3:0],SELECT[2:0],OUT[4:0]);
alu alu1(OUT,A,B,SELECT);
initial
begin
A = 4'b0011;
B = 4'b1011;SELECT = 3'b000;
repeat(7)
begin
SELECT = #10 3'b001+SELECT;
end
#10 A = 4'b1111;B = 4'b1001;SELECT = 3'b000;
repeat(7)
begin
SELECT = #10 3'b001+SELECT;
end
#10 A = 4'b0000;B = 4'b0000;SELECT = 3'b000;
repeat(7)
begin
SELECT = #10 3'b001+SELECT;
end
#10 A = 4'b1111;B = 4'b1111;SELECT = 3'b000;
repeat(7)
begin
SELECT = #10 3'b001+SELECT;
end
end
endmodule
波形图:
四.实验中遇到的问题及解决方法:
“清零信号clear低电平有效,输入数据在时钟信号clock上升沿被锁存,触发器在clock下降沿输出;当count-enable为低电平时停止计数。

”一开始不能理解,后来经过同学的指导明白了过程。

总之,至此实验特别有意义。

实验五八位ALU功能的函数
一、实验目的
(1)熟悉Modelsim 软件
(2)掌握Modelsim 软件的编译、仿真方法
(3)熟练运用Modelsim 软件进行HDL 程序设计开发
二、实验内容
设计一个实现八位ALU功能的函数,输入信号a,b为4位,功能选择信号select 为3位,输出信号out为5位。

忽略输出结果中的上溢和下溢。

三.实验步骤:
1.在modulesim软件中设计一个实现八位ALU功能的函数。

2. 进行编译及仿真。

module bit8_ALU(out,a,b,select);
output [4:0] out;
input [3:0] a,b;
input [2:0] select;
reg [4:0] out;
// reg [3:0] a,b;
// reg [2:0] select;
always @(a or b or select)
begin
out = bit8_function(a,b,select);
end
//??8?ALU????
function [4:0] bit8_function;
input [3:0] a,b;
input [2:0] sel;
parameter S0 = 3'b000,
S1 = 3'b001,
S2 = 3'b010,
S3 = 3'b011,
S4 = 3'b100,
S5 = 3'b101,
S6 = 3'b110,
S7 = 3'b111;
begin
case(sel)
S0:bit8_function = a;
S1:bit8_function = a+b;
S2:bit8_function = a-b;
S3:bit8_function = a/b;
S4:bit8_function = a%b;
S5:bit8_function = a<<1;
S6:bit8_function = a>>1;
S7:bit8_function = (a>b);
default : $display("Invalid ALU control signal");
endcase
end
endfunction
endmodule

module stimulus;
reg [3:0] A,B;
reg [2:0] SELECT;
wire [4:0] OUT;
bit8_ALU alu(OUT,A,B,SELECT);
initial
begin
$monitor($time,"A=%b, B=%b, SELECT=%b, --- OUT=%b\n",A,B,SELECT,OUT);
end
initial
begin
A=4'b0000;B=4'b0000; SELECT=3'b000;
repeat(7)
begin
SELECT = #10 SELECT + 3'b001;
end
#100 A=4'b1111;B=4'b0000; SELECT=3'b000;
repeat(7)
begin
SELECT = #10 SELECT + 3'b001;
end
#100 A=4'b0000;B=4'b1111; SELECT=3'b000;
repeat(7)
begin
SELECT = #10 SELECT + 3'b001;
end
#100 A=4'b0011;B=4'b0011; SELECT=3'b000;
repeat(7)
begin
SELECT = #10 SELECT + 3'b001;
end
#100 A=4'b1111;B=4'b1111; SELECT=3'b000;
repeat(7)
begin
SELECT = #10 SELECT + 3'b001;
end
end
Endmodule
波形图:
四.实验中遇到的问题及解决方法:
这个题目比较简单,因为与之前的实验内容基本相同,只是变化成为函数的形式而已,因此做实验时没有遇到什么大问题。

实验六状态自动机
一、实验目的
(1)熟悉Modelsim 软件
(2)掌握Modelsim 软件的编译、仿真方法
(3)熟练运用Modelsim 软件进行HDL 程序设计开发
二、实验内容
使用同步有限状态自动机方法设计一个电路,它的引脚in接受一位的输入流。

每当检测到模式10101时,输出引脚reset被赋值为高电平引脚。

reset引脚以同步方式初始化电路。

输入引脚clk 用于给电路提供时针信号。

使用身边现有的任何工艺库综合该电路,优化电路,使其达到最快速度。

把同样的激励应用到RTL和们级网表上,比较它们的输出
三.实验步骤:
1.在modulesim软件中使用同步有限状态自动机方法设计一个电路。

2. 进行编译及仿真。

module select(in,clk,reset,match);
input in;
input clk;
input reset;
output match;
wire match;
wire [4:0] NEXT_STATE;
reg [4:0] PRES_STATE;
parameter s1=5'b00000;
parameter s2=5'b00001;
parameter s3=5'b00010;
parameter s4=5'b00101;
parameter s5=5'b01010;
parameter s6=5'b10101;
function [5:0] fsm;
input fsm_in;
input [4:0] fsm_PRES_STATE;
reg fsm_match;
reg [4:0] fsm_NEXT_STATE;
begin
case(fsm_PRES_STATE)
s1:
begin
if(fsm_in==1'b1)
begin
fsm_match=1'b0;
fsm_NEXT_STATE=s2;
end
else if(fsm_in==1'b0)
begin
fsm_match=1'b0;
fsm_NEXT_STATE=s1;
end
end
s2:
begin
if(fsm_in==1'b1)
begin
fsm_match=1'b0;
fsm_NEXT_STATE=s2;
end
else if(fsm_in==1'b0)
begin
fsm_match=1'b0;
fsm_NEXT_STATE=s3;
end
end
s3:
begin
if(fsm_in==1'b1)
begin
fsm_match=1'b0;
fsm_NEXT_STATE=s4;
end
else if(fsm_in==1'b0)
begin
fsm_match=1'b0;
fsm_NEXT_STATE=s1;
end
end
s4:
begin
if(fsm_in==1'b1)
begin
fsm_match=1'b0;
fsm_NEXT_STATE=s2;
end
else if(fsm_in==1'b0)
begin
fsm_match=1'b0;
fsm_NEXT_STATE=s5;
end
end
s5:
begin
if(fsm_in==1'b1)
begin
fsm_match=1'b0;
fsm_NEXT_STATE=s6;
end
else if(fsm_in==1'b0)
begin
fsm_match=1'b0;
fsm_NEXT_STATE=s1;
end
end
s6:
begin
if(fsm_in==1'b1)
begin
fsm_match=1'b0;
fsm_NEXT_STATE=s2;
end
else if(fsm_in==1'b0)
begin
fsm_match=1'b0;
fsm_NEXT_STATE=s5;
end
end
endcase
fsm={fsm_match,fsm_NEXT_STATE}; end
endfunction
assign {match,NEXT_STATE}=fsm(in,PRES_STATE);
always @(posedge clk)
begin
if (reset==1'b1)
PRES_STATE<=s1;
else
PRES_STATE<=NEXT_STATE;
end
endmodule
module stimulus;
reg clk;
reg in;
reg reset;
wire match;
select se(in,clk,reset,match);
initial
begin
clk=0;
in=0;
reset=1;
#100 reset=0; #30 in=1;
#40 in=1;
#40 in=0;
#40 in=1;
#40 in=0;
#40 in=1;
#40 in=1;
#40 in=1;
#40 in=0;
#40 in=0;
#40 in=1;
#40 in=1;
#40 in=0;
#40 in=0;
#40 in=1;
#40 in=0;
#40 in=1;
#40 in=0;
#40 in=1;
#40 in=1;
#40 in=1;
#50 $finish;
end
always
begin
#20 clk=~clk;
end
endmodule 波形图:
四.实验中遇到的问题及解决方法:
在做这个实验时,我忽略了状态自动的方式,而是采用简单的门级网表建模,直到最后才明白自己的错误所在,与老师和同学交流了此题的正确解法后,我重新将此题做了一遍,收获良多。

友情提示:范文可能无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用,感谢您的下载!。

相关文档
最新文档