verilog全加器实验
Verilog-全加器上机实验报告
西 安 邮 电 學 院
基于Verilog的HDL设计基础
实验报告
学院名称 :
学生姓名 : 专业名称 :
班 级 : 学
时
通信与信息工程学院 通信工程 号 : 间 :2010年11月24日
实验题目 全加器
一、实验内容
对一位二进制全加器的设计与验证;再对其进行综合生成网表文件;然后进行后仿真。
二、技术
1、 输入引脚: a,b,c_in;输出引脚:sum,c_out。
2、 功能:这是一位二进制全加器。a,b为输入的两个二进制加数,c_in为低位向本位的借位,sum为全加和,c_out为本位向高位的进位。
三、实验步骤
1、在modulesim软件中进行两个一位二进制数的全加器的设计
与验证,直到运行结果全部正确;
2、在Quartus软件中对刚刚完成的计数器进行综合,生成网表
文件;
3、在modulesim软件中对计数器进行进行后仿真。
四、源代码
1. 设计模块:
module Count4(sum,c_out,a,b,c_in);
output [3:0] sum;
output c_out;
input [3:0] a,b;
input c_in;
wire c1,c2,c3;
Count Ca0(sum[0],c1,a[0],b[0],c_in);
Count Ca1(sum[1],c2,a[1],b[1],c1);
Count Ca2(sum[2],c3,a[2],b[2],c2);
Count Ca3(sum[3],c_out, a[3],b[3],c3);
Endmodule
module Count(sum, c_out,a,b,c_in);
output sum,c_out;
input a,b,c_in;
wire s1,c1,c2;
xor(s1,a,b);
and(c1,a,b);
xor(sum,s1,c_in);
and(c2,s1,c_in);
xor(c_out,c2,c1);
endmodule
2.激励模块:
module jili;
reg [3:0] A, B;
reg C_IN;
wire [3:0] SUM ;
wire C_OUT;
Count4 CT_4(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=4'd0;B=4'd0;C_IN=1'b0;
#5 A=4'd3;B=4'd4;
#5 A=4'd2;B=4'd5;
#5 A=4'd9;B=4'd9;
#5 A=4'd10;B=4'd15;
#5 A=4'd10;B=4'd5;C_IN=1'b1;
end
endmodule
五、仿真结果及分析
五、调试情况,设计技巧及体会
1、程序调试:
开始时程序一直都编译不出来,总是出现错误,认真修改后,总算是编译成功了,但在SIMULATE时又出现错误,~在同学的帮助下,经过认真的改正,最终修改正确运行成功。之后进行前仿真和形成网表。最后进行在modulesim软件中对计数器进行进行后仿真
2、后仿真:
后防真时要注意文件的扩展名及储存路径。尽量保持存储文件名一致。
3、综合:
在进行综合生成网表前一定要熟悉掌握每一个选项和步骤。不会的查书看 最后在同学的帮助下终于搞定了。
篇二:Verilog实验报告(电子)
西安邮电大学
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;
wires1;
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;
wires1,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;
wirea1,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);
篇三:四位全加器实验Verilog
实验四 四位全加器
一、实验目的
l. 用组合电路设计4位全加器。
2.了解Verilog HDL语言的行为描述的优点。
二、实验原理
4位全加器工作原理
1)全加器
除本位两个数相加外,还要加上从低位来的进位数,称为全加器。被加数Ai、加数Bi从低位向本位进位Ci-1作为电路的输入,全加和Si与向高位的进位Ci作为电路的输出。能实现全加运算功能的电路称为全加电路。全加器的逻辑功能真值表如表中所列。
2)1位全加器
一位全加器(FA)的逻辑表达式为:S=A?B?Cin;Co=AB+BCin+ACin 其中A,B为要相加的数,Cin为进位输入;S为和,Co是进位输出;
这两幅图略微有差别,但最后的结果是一样的。
3)4位全加器
4位全加器可看作4个1位全加器串行构成, 具体连接方法如下图所示:
采用Verilog HDL语言设计该4位全加器,通过主模块调用子模块(1位全加器)的方法来实现。
三、实验步骤
四、实验连线
K1-K4:14-11
K5-K8:18-15
L5-L8:7-10
VIJN:83
L4:6
4KHZ:80
五、心得体会
首先,实现这一段全加器代码并不难,但是由于困惑给的三个时钟输入,没有太懂意思,所以只写了全加器控制LED灯的代码;后来问清楚后,运行全加器代码,有错误,原来是建文件时用的是verilog hdl,我建的是其他类型的;后来还有错,原来是把冒号打成分号;编译成功后,LED不亮,后来发现是硬件老化,换了箱子。这一部分做好后,我准备把控制声音的加上去,本来准备再加一个模块,可是不能有两个顶层块,就对主模块做了补充,用case命令调用不同的状态,因为时间紧迫,所以代码写得比较简单,没有用经典的分频代码。这里附一小段,是我在研究分频控制时看懂的网上的经典分频代码,适合乐曲自动播放等高级的实现,仅供分享
assign preclk=(divider==16383)?1:0;//divider==16383,preclk=1
always @(posedge clk) //基频上升沿触发
begin
if(preclk) //preclk=1
divider=origin;
else
divider=divider+1;
end
always @(posedge preclk) //调整占空比
begin
speaker=~speaker; //2 分频产生方波信号
end
这部分实现了分频功能,其中origin+divider=16384=2
,这个数根据自己的需要而定。
在这个过程中我明白了:
1)细心,每个步骤不能错;
2)出现问题要仔细排查,软硬件都要;
3)注意reg wire的设定;
4)学到了额外的扩展知识
六、代码分析:
module full_add1(SUM,C_OUT,A,B,C_IN);//一位全加器子模块
output SUM,C_OUT;
input A,B,C_IN;
wire C1,C2,C3;
and (C1,A,B); //内部门实现
xor (C3,A,B);
and (C2,C3,C_IN);
xor (SUM,C_IN,C3);
xor (C_OUT,C1,C2);
endmodule
module shiyan4(speaker,s,c_out,a,b,c_in,clk_4MHz,);//主模块
output [3:0]s;
output c_out;
output speaker;
input clk_4MHz;
input [3:0]a,b;
input c_in;
reg speaker;
wire c1,c2,c3;
full_add1 f0(s[0],c1,a[0],b[0],c_in);//调用子模块(4个一位全加
器) full_add1 f1(s[1],c2,a[1],b[1],c1);
full_add1 f2(s[2],c3,a[2],b[2],c2);
full_add1 f3(s[3],c_out,a[3],b[3],c3);
always @(posedge clk_4MHz)//时钟信号上升沿触发
if(c_out==1) //全加器部分进位输出为1的情况case(s)
4'b0000: speaker=clk_4MHz; //全加器s为0扬声器输出的
频率 4'b0001: speaker=clk_4MHz; //全加器s为1扬声器
输出的频率 (同样目的,以下依次分成不同频率) 4'b0010: speaker=clk_4MHz;
4'b0011: speaker=clk_4MHz;
4'b0100: speaker=2*clk_4MHz;
4'b0101: speaker=2*clk_4MHz;
4'b0110: speaker=2*clk_4MHz;
4'b0111: speaker=2*clk_4MHz;
4'b1000: speaker=3*clk_4MHz;
4'b1001:speaker=3*clk_4MHz;
4'b1010:speaker=3*clk_4MHz;
4'b1011: speaker=3*clk_4MHz;