四位全加器实验Verilog
四位全加器实验报告

武汉轻工大学数学与计算机学院《计算机组成原理》实验报告题目:4位二进制计数器实验专业:软件工程班级:130X班学号:XXX姓名:XX指导老师:郭峰林2015年11月3日【实验环境】1. Win 72. QuartusII9.1计算机组成原理教学实验系统一台。
【实验目的】1、熟悉VHDL 语言的编写。
2、验证计数器的计数功能。
【实验要求】本实验要求设计一个4位二进制计数器。
要求在时钟脉冲的作用下,完成计数功能,能在输出端看到0-9,A-F 的数据显示。
(其次要求下载到实验版实现显示)【实验原理】计数器是一种用来实现计数功能的时序部件,计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能,同时兼有分频功能。
计数器由基本的计数单元和一些控制门所组成,计数单元则由一系列具有存储信息功能的各类触发器构成,这些触发器有RS 触发器、T 触发器、D 触发器及JK 触发器等。
计数器在数字系统中应用广泛,如在电子计算机的控制器中对指令地址进行计数,以便顺序取出下一条指令,在运算器中作乘法、除法运算时记下加法、减法次数,又如在数字仪器中对脉冲的计数等等。
计数器按计数进制不同,可分为二进制计数器、十进制计数器、其他进制计数器和可变进制计数器,若按计数单元中各触发器所接收计数脉冲和翻转顺序或计数功能来划分,则有异步计数器和同步计数器两大类,以及加法计数器、减法计数器、加/减计数器等,如按预置和清除方式来分,则有并行预置、直接预置、异步清除和同步清除等差别,按权码来分,则有“8421”码,“5421”码、余“3”码等计数器,按集成度来分,有单、双位计数器等等,其最基本的分类如下:计数器的种类⎪⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎪⎨⎧⎪⎩⎪⎨⎧⎪⎩⎪⎨⎧⎩⎨⎧进制计数器十进制计数器二进制计数器进制可逆计数器减法计数器加法计数器功能异步计数器同步计数器结构N 、、、321 下面对同步二进制加法计数器做一些介绍。
同步计数器中,所有触发器的CP 端是相连的,CP 的每一个触发沿都会使所有的触发器状态更新。
verilog的15个经典设计实例

begin b=a; c=b; end endmodule
【例 5.11】模为 60 的 BCD 码加法计数器
module count60(qout,cout,data,load,cin,reset,clk);
【例 5.6】用 fork-join 并行块产生信号波形
`timescale 10ns/1ns module wave2; reg wave; parameter cycle=5; initial
fork wave=0;
#(cycle) wave=1; #(2*cycle) wave=0; #(3*cycle) wave=1; #(4*cycle) wave=0; #(5*cycle) wave=1; #(6*cycle) $finish; join initial $monitor($time,,,"wave=%b",wave); endmodule
else
out<=out+1;
end
endmodule
//同步复位 //计数
【例 3.3】4 位全加器的仿真程序
`timescale 1ns/1ns `include "adder4.v" module adder_tp; reg[3:0] a,b; reg cin; wire[3:0] sum; wire cout; integer i,j;
output[7:0] qout;
output cout;
input[7:0] data;
input load,cin,clk,reset;
四位全加器实验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-11K5-K8:18-15L5-L8:7-10VIJN:83L4:64KHZ:80五、心得体会首先,实现这一段全加器代码并不难,但是由于困惑给的三个时钟输入,没有太懂意思,所以只写了全加器控制LED灯的代码;后来问清楚后,运行全加器代码,有错误,原来是建文件时用的是verilog hdl,我建的是其他类型的;后来还有错,原来是把冒号打成分号;编译成功后,LED不亮,后来发现是硬件老化,换了箱子。
这一部分做好后,我准备把控制声音的加上去,本来准备再加一个模块,可是不能有两个顶层块,就对主模块做了补充,用case命令调用不同的状态,因为时间紧迫,所以代码写得比较简单,没有用经典的分频代码。
这里附一小段,是我在研究分频控制时看懂的网上的经典分频代码,适合乐曲自动播放等高级的实现,仅供分享assign preclk=(divider==16383)?1:0;//divider==16383,preclk=1always @(posedge clk) //基频上升沿触发beginif(preclk) //preclk=1divider=origin;elsedivider=divider+1;endalways @(posedge preclk) //调整占空比beginspeaker=~speaker; //2 分频产生方波信号end这部分实现了分频功能,其中origin+divider=16384=2^14,这个数根据自己的需要而定。
verilog之四位全加器的编译及仿真(用开源免费的软件——iverilog+GTKWave)

verilog之四位全加器的编译及仿真(⽤开源免费的软件——iverilog+GTKWave)四位全加器的verilog的代码⽐⽐皆是,这⾥上⼀个⽐较简单的:/*4位全加器全加器需要有输⼊输出,需要有下级向上进位的输⼊,需要有向上⼀位进位的输出。
⼤家看⼀下,这个模块已经包含全部的输⼊输出信息。
⼤家都知道,N位加法器得出来的出来的和最多是N+1位因此可以清晰从下⾯代码中看到相关信息。
然后assign⽤的是阻塞赋值。
相加即满⾜相关的需求。
*/module adder4(cout,sum,ina,inb,cin);output[3:0] sum;output cout;input[3:0] ina,inb;input cin;assign {cout,sum}=ina+inb+cin;endmodule在写testbeach⽂件之前,先普及⼀点testbeach的知识:⼀般来讲,在数据类型声明时,和被测模块的输⼊端⼝相连的信号定义为reg类型,这样便于在initial语句和always语句块中对其进⾏赋值;和被测模块输出端⼝相连的信号定义为wire类型,便于进⾏检测。
Testbench模块最重要的的任务就是利⽤各种合法的语句,产⽣适当的时序和数据,以完成测试,并达到覆盖率要求。
那么testbeach⽂件如下:/*File Name : test_adder4.vDescription : The testbench of the adder_4.vWritten By : LiMingData : 2011/04/18 20:13modefied : 在仿真的时候,把延时从10ns改为5ns: cout显⽰为2位*///test_adder4 (top-level module)`timescale 1ns/1nsmodule test_adder4;//Declare variableswire[3:0] sum;wire cout;reg[3:0] ina,inb;reg cin;//Instantiate the module adder4adder4 adder4_1(cout,sum,ina,inb,cin);//Stimulate the inputs, Finish the stimulation at 90 time unitsinitialbegin#0 ina = 4'b0001; inb = 4'b1010; cin = 1'b0;#5 ina = 4'b0010; inb = 4'b1010; cin = 1'b1;#5 ina = 4'b0010; inb = 4'b1110; cin = 1'b0;#5 ina = 4'b0011; inb = 4'b1100; cin = 1'b1;#5 ina = 4'b0111; inb = 4'b1001; cin = 1'b0;#5 ina = 4'b0001; inb = 4'b1100; cin = 1'b1;#5 ina = 4'b0011; inb = 4'b1100; cin = 1'b0;#5 ina = 4'b0111; inb = 4'b1111; cin = 1'b1;#5 $finish;endinitial$monitor("At time %t, ina(%b) + inb(%b) + cin(%b) = sum(%b)(%2d),cout(%b)",$time, ina, inb, cin, sum, sum, cout);initialbegin$dumpfile("test.vcd");$dumpvars(0,test_adder4);endendmodule由于是在windows的cmd下进⾏命令⾏的运⾏,所以有时候每次输⼊⼀个命令显得很费时间,所以我这⾥⼜写了⼀个(批处理⽂件)bat⽂件:go.batECHO OFFECHO *********************************ECHO * Batch fileECHO *********************************ECHO *ECHO ONiverilog -o test adder4.v test_adder4.vvvp -n test -lxt2cp test.vcd test.lxtgtkwave test.lxt(说明⼀下,我在windows下安装了gnuwin的软件,即能在windows下⽤gnu的⼀些⼩的实⽤的⼯具!)哈哈,这⾥就可以⼀键运⾏了,上⾯的⼀些命令的解释可以到我的“wndows下如何⽤Iverilog+GTKWave进⾏verilog的编译和查看仿真波形”的博⽂⾥去看看吧。
4位二进制全加器的设计

4位⼆进制全加器的设计4位⼆进制全加器的设计摘要加法器是产⽣数的和的装置。
加数和被加数为输⼊,和数与进位为输出的装置为半加器。
若加数、被加数与低位的进位数为输⼊,⽽和数与进位为输出则为全加器。
常⽤作计算机算术逻辑部件,执⾏逻辑操作、移位与指令调⽤。
在电⼦学中,加法器是⼀种数位电路,其可进⾏数字的加法计算。
在现代的电脑中,加法器存在于算术逻辑单元(ALU)之中。
加法器可以⽤来表⽰各种数值,如:BCD、加三码,主要的加法器是以⼆进制作运算。
多位加法器的构成有两种⽅式:并⾏进位和串⾏进位⽅式。
并⾏进位加法器设有并⾏进位产⽣逻辑,运⾏速度快;串⾏进位⽅式是将全加器级联构成多位加法器。
通常,并⾏加法器⽐串⾏加法器的资源占⽤差距也会越来越⼤。
我们采⽤4位⼆进制并⾏加法器作为折中选择,所选加法器为4位⼆进制先⾏进位的74LS283,它从C0到C4输出的传输延迟很短,只⽤了⼏级逻辑来形成和及进位输出,由其构成4位⼆进制全加器,并⽤Verilog HDL进⾏仿真。
关键字全加器,四位⼆进制,迭代电路,并⾏进位,74LS283,Verilog HDL仿真总电路设计⼀、硬件电路的设计该4位⼆进制全加器以74LS283(图1)为核⼼,采⽤先⾏进位⽅式,极⼤地提⾼了电路运⾏速度,下⾯是对4位全加器电路设计的具体分析。
图11)全加器(full-adder )全加器是⼀种由被加数、加数和来⾃低位的进位数三者相加的运算器。
基本功能是实现⼆进制加法。
全加器的功能表输⼊输出输⼊输出逻辑表达式:CI B A S ⊕⊕==AB'CI'+A'BCI'+A'B'CI+ABCI()AB CI B A CO ++=其中,如果输⼊有奇数个1,则S 为1;如果输⼊有2个或2个以上的1,则CO=1。
实现全加器等式的门级电路图如图2所⽰,逻辑符号如图3所⽰.图2 图32)四位⼆级制加法器 a) 串⾏进位加法器四位⼆进制加法器为4个全加器的级联,每个处理⼀位。
Verilog实现的4位串行进位加法器精编版

Verilog实现的4位串行进位加法器精编版在数字电路中,加法器是最基本的电路之一、串行进位加法器是一种将两个二进制数相加的电路,通过逐位相加的方式实现。
本文将介绍如何使用Verilog语言实现一个4位串行进位加法器的精编版。
首先,我们需要定义输入和输出端口。
对于一个4位的串行进位加法器,我们需要4个输入端口A[3:0]和B[3:0],以及一个输出端口Sum[3:0]。
另外,还需要一个输入端口CarryIn和一个输出端口CarryOut,用于传递进位信号。
```module SerialCarryAdderinput [3:0] A,input [3:0] B,input CarryIn,output [3:0] Sum,output CarryOut```接下来,我们可以定义内部信号。
对于一个4位的串行进位加法器,我们需要4个内部信号,分别代表每一位的进位信号。
```wire C0, C1, C2, C3;```然后,我们可以开始实现每一位的加法逻辑。
首先,我们定义一个内部信号XOROut,用于存储每一位的异或结果。
然后,我们使用XOR门实现异或逻辑。
```wire XOROut;assign XOROut = A[0] ^ B[0];```接下来,我们定义一个内部信号ANDOut,用于存储每一位的与结果。
然后,我们使用AND门实现与逻辑。
```wire ANDOut;assign ANDOut = A[0] & B[0];```然后,我们定义一个内部信号Sum0,用于存储第一位的和结果。
然后,我们使用XOR门实现异或逻辑。
```wire Sum0;assign Sum0 = XOROut ^ CarryIn;```然后,我们定义一个内部信号Carry0,用于存储第一位的进位结果。
然后,我们使用OR门实现或逻辑。
```wire Carry0;assign Carry0 = ANDOut , (XOROut & CarryIn);```接下来,我们可以依次实现剩余3位的加法逻辑。
verilog四位BCD加法器实验报告

verilog四位BCD加法器实验报告1.实验目的⑴进一步熟悉modelsim仿真工具的使用方法。
⑵学会设计验证的方法和流程。
⑶编写一个4位BCD加法器,并且用modelsim对其仿真。
2.实验任务进一步熟悉modelsim仿真基本流程。
并完成一个4位BCD加法器,用modelsim对其仿真。
3.实验内容及步骤3.1 实验内容进一步熟悉modelsim仿真基本流程:①建一个工作库②编译设计文件③运行仿真④调试结果实验步骤:1.启动modelsim。
2.创建一个新工程:①在主菜单窗口的主菜单中选择“File→New→Project”。
②在项目名称域中输入工程名称(如adder_bcd),如下图所示。
③单击Browse按钮选择工程文件存储的目录。
④确认默认库名称为work,单击OK按钮。
3.创建新设计的文件:①单击OK按钮接受工程设置后,在主窗口的工作区将出现一个工程标签,同时弹出向工程添加项目的对话框。
单击“Create New File”,在新弹出的窗口中,输入文件名(如adder_1bit),特别需要注意的是,“Add file as type”里边要选择“verilog”类型。
②如果还需要写新的模块,在project对话框中点右键,选择“Add to Project→New File”。
在弹出的对话框中输入新的文件名(如adder_bcd_1bit;adder_bcd_4bit;test),同样注意“Add file as type”里边要选择“verilog”类型。
4.向工程输入有效的设计单元:把设计的源文件输入到工程里边。
5.在主窗口中选择“Compile→Compile All”完成工程的编译。
对于modelsim正确编译的设计文件,都打上“√”标志;对于编译失败的情况,打上“×”标志,此时可在右侧的脚本状态窗中查看出错信息,修正后再编译。
6.完成工程正确的编译后,在主窗口中单击Library标签,进入编译库页,打开work库,双击测试单元(如test),加载测试单元。
4位全加器verilog课程设计

4位全加器verilog课程设计一、课程目标知识目标:1. 理解4位全加器的原理和功能,掌握其Verilog硬件描述语言实现方法。
2. 学习并掌握数字电路中加法器的基本结构和工作原理。
3. 掌握Verilog模块化编程,能够实现并测试4位全加器的基本功能。
技能目标:1. 能够运用Verilog语言编写4位全加器的代码,并进行功能仿真。
2. 学会使用硬件描述语言进行数字电路的设计,提高实际问题解决能力。
3. 能够对4位全加器进行调试和优化,提升编程实践技能。
情感态度价值观目标:1. 培养学生的团队合作意识,提高学生在项目实践中的沟通与协作能力。
2. 增强学生对数字电路设计领域的兴趣,激发学生的创新精神。
3. 引导学生树立正确的价值观,认识到科技发展对社会进步的重要性。
课程性质:本课程为电子信息工程及相关专业高年级的数字电路设计课程,旨在通过4位全加器的Verilog实现,让学生掌握数字电路设计的基本方法和实践技能。
学生特点:学生已具备一定的数字电路基础和Verilog编程知识,具备分析问题和解决问题的能力。
教学要求:注重理论与实践相结合,鼓励学生积极参与课堂讨论,培养学生的动手能力和实际操作技能。
通过课程学习,使学生在知识、技能和情感态度价值观方面均取得明显进步。
二、教学内容本课程教学内容主要包括以下几部分:1. 数字加法器原理回顾:介绍加法器的基本原理,重点讲解4位全加器的工作流程和关键特性。
- 教材章节:数字电路基础,第3章第2节。
2. Verilog硬件描述语言基础:复习Verilog的基本语法,强调模块化编程方法。
- 教材章节:硬件描述语言Verilog,第4章。
3. 4位全加器的Verilog设计:- 设计原理:讲解4位全加器的设计思路和实现方法。
- 代码编写:引导学生编写4位全加器的Verilog代码,并进行模块化设计。
- 教材章节:数字电路设计,第5章第3节。
4. 功能仿真与调试:- 介绍仿真工具和仿真方法,指导学生进行4位全加器的功能仿真。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四四位全加器
一、实验目的
l. 用组合电路设计4位全加器。
2.了解Verilog HDL语言的行为描述的优点。
2、实验原理
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位全加器)的方法来实现。
3、实验步骤
四、实验连线
K1-K4:14-11
K5-K8:18-15
L5-L8:7-10
VIJN:83
L4:6
4KHZ:80
5、心得体会
首先,实现这一段全加器代码并不难,但是由于困惑给的三个时钟输入,没有太懂意思,所以只写了全加器控制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^14,这个数根据自己的需要而定。
在这个过程中我明白了:
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;
4'b1100: speaker=10*clk_4MHz;
4'b1101: speaker=10*clk_4MHz;
4'b1110: speaker=10*clk_4MHz;
4'b1111: speaker=10*clk_4MHz;
endcase
else
case(s) //全加器部分进位输出为1的情况
4'b0000: speaker=10000*clk_4MHz;
4'b0001: speaker=10000*clk_4MHz;
4'b0010: speaker=10000*clk_4MHz;
4'b0011: speaker=10000*clk_4MHz;
4'b0100: speaker=1000*clk_4MHz; 4'b0101: speaker=1000*clk_4MHz; 4'b0110: speaker=1000*clk_4MHz; 4'b0111: speaker=1000*clk_4MHz; 4'b1000: speaker=6000*clk_4MHz; 4'b1001: speaker=6000*clk_4MHz; 4'b1010: speaker=6000*clk_4MHz; 4'b1011: speaker=6000*clk_4MHz; 4'b1100: speaker=100*clk_4MHz; 4'b1101: speaker=100*clk_4MHz; 4'b1110: speaker=100*clk_4MHz;
4'b1111: speaker=100*clk_4MHz; endcase
endmodule。