Verilog实验报告电子.docx
《Verilog实验报告电子.docx》由会员分享,可在线阅读,更多相关《Verilog实验报告电子.docx(24页珍藏版)》请在冰豆网上搜索。
![Verilog实验报告电子.docx](https://file1.bdocx.com/fileroot1/2023-2/2/0c2b2fa3-3c5e-4183-82b0-72d29fdd9f5a/0c2b2fa3-3c5e-4183-82b0-72d29fdd9f5a1.gif)
Verilog实验报告电子
西安邮电大学
VerilogHDL大作业报告书
学院名称
:
电子工程学院
学生姓名
:
专业名称
:
电子信息工程
班级
:
实验一异或门设计
一、实验目的
(1)熟悉Modelsim软件
(2)掌握Modelsim软件的编译、仿真方法
(3)熟练运用Modelsim软件进行HDL程序设计开发
二、实验内容
my_or,my_and和my_not门构造一个双输入端的xor门,其功能是计算z=x’y+xy’,其中x和y为输入,z为输出;编写激励模块对x和y的四种输入组合进行测试仿真
1、实验要求
用VerilogHDL程序实现一个异或门,Modelism仿真,观察效果。
2、步骤
1、建立工程
2、添加文件到工程
3、编译文件
4、查看编译后的设计单元
5、将信号加入波形窗口
6、运行仿真
实验描述如下:
modulemy_and(a_out,a1,a2);
outputa_out;
inputa1,a2;
wires1;
nand(s1,a1,a2);
nand(a_out,s1,1'b1);
endmodule
modulemy_not(n_out,b);
outputn_out;
inputb;
nand(n_out,b,1'b1);
endmodule
modulemy_or(o_out,c1,c2);
outputo_out;
inputc1,c2;
wires1,s2;
nand(s1,c1,1'b1);
nand(s2,c2,1'b1);
nand(o_out,s1,s2);
endmodule
moduleMY_XOR(z,x,y);
outputz;
inputx,y;
wirea1,a2,n1,n2;
my_notSTEP01(n1,x);
my_notSTEP02(n2,y);
my_andSTEP03(a1,n1,y);
my_andSTEP04(a2,n2,x);
my_orSTEP05(z,a1,a2);
Endmodule
modulestimulus;
regX,Y;
wireOUTPUT;
MY_XORxor01(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;
#5X=1'b1;Y=1'b0;
#5X=1'b1;Y=1'b1;
#5X=1'b0;Y=1'b1;
end
endmodule
2、实验结果
波形图:
3、分析和心得
通过这次的实验,我基本熟悉Modelsim软件,掌握了Modelsim软件的编译、仿真方法。
同时在编写程序的过程中,加深了我对课上所讲的HDL的语法的认识。
实验二二进制全加器设计
一、实验目的
(1)熟悉VerilogHDL元件实例化语句的作用
(2)熟悉全加器的工作原理
(3)用VerilogHDL语言设计一位二进制全加器,并仿真,验证其功能
二、实验内容
一位全加器使用乘积项之和的形式可以表示为:
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描述,限制是每个门最多只能有四个输入端。
编写激励模块对其功能进行检查,并对全部的输入组合输入组合进行测试。
实验要求
用VerilogHDL语言描述一位全加器,并使用modelsim仿真验证结果。
modulefulladd(sum,c_out,a,b,c_in);
outputsum,c_out;
inputa,b,c_in;
wires1,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
modulestimulus;
regA,B,C_IN;
wireSUM,C_OUT;
fulladdFA1(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;
#5A=1'd0;B=1'd0;C_IN=1'b1;
#5A=1'd0;B=1'd1;C_IN=1'b0;
#5A=1'd0;B=1'd1;C_IN=1'b1;
#5A=1'd1;B=1'd0;C_IN=1'b0;
#5A=1'd1;B=1'd0;C_IN=1'b1;
#5A=1'd1;B=1'd1;C_IN=1'b0;
#5A=1'd1;B=1'd1;C_IN=1'b1;
End
实验结果波形:
三.分析和心得
通过这次试验我熟悉了VerilogHDL元件例化语句的作用,并且熟悉全加器的工作原理。
在一位全加器的过程中,也了解了如何调用模块。
实验三使用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触发器模块:
modulem_c_jkff(q,qbar,J,K,clear,clock);
outputq,qbar;
inputJ,K,clear,clock;
wirea,b,c,d,y,ybar,cbar;
assigncbar=~clock;
assign#1a=~(J&qbar&clock&clear),
b=~(K&q&clock),
y=~(a&ybar),
ybar=~(y&b&clear),
c=~(y&cbar),
d=~(ybar&cbar);
assign#1q=~(c&qbar);
assign#1qbar=~(d&clear&q);
endmodule
计数器模块:
modulefour_count_ff(Q,clear,clock,count_enable);
output[3:
0]Q;
inputclear,clock,count_enable;
wirea1,a2,a3;
assigna1=count_enable&Q[0],
a2=a1&Q[1],a3=a2&Q[2];
m_c_jkffm1(Q[0],,count_enable,count_enable,clear,clock);
m_c_jkffm2(Q[1],,a1,a1,clear,clock);
m_c_jkffm3(Q[2],,a2,a2,clear,clock);
m_c_jkffm4(Q[3],,a3,a3,clear,clock);
endmodule
激励模块:
modulestimulus;
regclock,clear,count_enable;
wire[3:
0]Q;
initial
$monitor($time,"CountQ=%bClear=%b",Q[3:
0],clear);
four_count_fff1(Q,clear,clock,count_enable);
initial
begin
clear=1'b0;
count_enable=1'b1;
#10clear=1'b1;
//#1count_enable=1'b1;
//#50clear=1'b0;
//#100count_enable=1'b0;
//#100clear=1'b0;
//#50clear=1'b1;
//#50count_enable=1'b1;
end
initial
begin
clock=1'b0;
forever#20clock=~clock;
end
initial
#1000$finish;
Endmodule
波形图:
实验四八功能算术运算单元
一、实验目的
(1)熟悉Modelsim软件
(2)掌握Modelsim软件的编译、仿真方法
(3)熟练运用Modelsim软件进行HDL程序设计开发
二、实验内容
使用case语句设计八门功能的算术运算单元(ALU),输入信号a,b为4位,功能选择信号select为3位,输出信号out为5位。
忽略输出结果中的上溢和下溢。
3.实验步骤:
1.在modulesim软件中使用case语句设计八门功能的算术运算单元(ALU)
2.进行编译及仿真。
modulealu(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:
$display("InvalidALUcontrolsignal");
endcase
end
endmodule
modulestimulus;
reg[3:
0]A,B;
reg[2:
0]SELECT;
wire[4:
0]OUT;
initial
$monitor($time,"A=%bB=%bSELECT=%bOUT=%b",A[3:
0],B[3:
0],SELECT[2:
0],OUT[4:
0]);
alualu1(OUT,A,B,SELECT);
initial
begin
A=4'b0011;B=4'b1011;SELECT=3'b000;
repeat(7)
begin
SELECT=#103'b001+SELECT;
end
#10A=4'b1111;B=4'b1001;SELECT=3'b000;
repeat(7)
begin
SELECT=#103'b001+SELECT;
end
#10A=4'b0000;B=4'b0000;SELECT=3'b000;
repeat(7)
begin
SELECT=#103'b001+SELECT;
end
#10A=4'b1111;B=4'b1111;SELECT=3'b000;
repeat(7)
begin
SELECT=#103'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位。
忽略输出结果中的上溢和下溢。
3.实验步骤:
1.在modulesim软件中设计一个实现八位ALU功能的函数。
2.进行编译及仿真。
modulebit8_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@(aorborselect)
begin
out=bit8_function(a,b,select);
end
//?
?
8?
ALU?
?
?
?
function[4:
0]bit8_function;
input[3:
0]a,b;
input[2:
0]sel;
parameterS0=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("InvalidALUcontrolsignal");
endcase
end
endfunction
endmodule
、
modulestimulus;
reg[3:
0]A,B;
reg[2:
0]SELECT;
wire[4:
0]OUT;
bit8_ALUalu(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=#10SELECT+3'b001;
end
#100A=4'b1111;B=4'b0000;SELECT=3'b000;
repeat(7)
begin
SELECT=#10SELECT+3'b001;
end
#100A=4'b0000;B=4'b1111;SELECT=3'b000;
repeat(7)
begin
SELECT=#10SELECT+3'b001;
end
#100A=4'b0011;B=4'b0011;SELECT=3'b000;
repeat(7)
begin
SELECT=#10SELECT+3'b001;
end
#100A=4'b1111;B=4'b1111;SELECT=3'b000;
repeat(7)
begin
SELECT=#10SELECT+3'b001;
end
end
Endmodule
波形图:
四.实验中遇到的问题及解决方法:
这个题目比较简单,因为与之前的实验内容基本相同,只是变化成为函数的形式而已,因此做实验时没有遇到什么大问题。
实验六状态自动机
一、实验目的
(1)熟悉Modelsim软件
(2)掌握Modelsim软件的编译、仿真方法
(3)熟练运用Modelsim软件进行HDL程序设计开发
二、实验内容
使用同步有限状态自动机方法设计一个电路,它的引脚in接受一位的输入流。
每当检测到模式10101时,输出引脚reset被赋值为高电平引脚。
reset引脚以同步方式初始化电路。
输入引脚clk用于给电路提供时针信号。
使用身边现有的任何工艺库综合该电路,优化电路,使其达到最快速度。
把同样的激励应用到RTL和们级网表上,比较它们的输出
三.实验步骤:
1.在modulesim软件中使用同步有限状态自动机方法设计一个电路。
2.进行编译及仿真。
moduleselect(in,clk,reset,match);
inputin;
inputclk;
inputreset;
outputmatch;
wirematch;
wire[4:
0]NEXT_STATE;
reg[4:
0]PRES_STATE;
parameters1=5'b00000;
parameters2=5'b00001;
parameters3=5'b00010;
parameters4=5'b00101;
parameters5=5'b01010;
parameters6=5'b10101;
function[5:
0]fsm;
inputfsm_in;
input[4:
0]fsm_PRES_STATE;
regfsm_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
elseif(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
elseif(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
elseif(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
elseif(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
elseif(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
elseif(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@(posedgeclk)
begin
if(reset==1'b1)
PRES_STATE<=s1;
else
PRES_STATE<=NEXT_STATE;
end
endmodule
modulestimulus;
regclk;
regin;
regreset;
wirematch;
select