资源描述
《 — 数字电路 —》
实 验 指 导 书
林文忠、罗海波 编 写
适用专业:_通信工程__
闽江学院_计算机科学 系
2010年 9月
前 言
《数字电路》主要包括逻辑代数的基本理论、组合逻辑电路、时序逻辑电路及其可编程逻辑器件和存储器原理等内容。通过本课程的学习,要求学生建立基本的逻辑代数的思维方法,掌握常用的组合/时序逻辑电路MSI器件及其分析和设计,掌握可编程逻辑器件的概念和设计方法,了解存储器的结构和原理。
为了使学生更好地理解和深刻地把握这些知识,增强学生的实践动手能力,本实验部分主要培养学生的逻辑代数思维以及电路的设计和设计能力,锻炼学生的Verilog HDL的应用编程开发能力,让学生对CPLD的开发过程、开发步骤有一个详尽的理解,也让学生理解CPLD编程与数字电路之间的关系。
本指导书为《数字电路》理论课程配套实验的一部分,即扩展的CPLD编程实验部分,另外的基础部分不包括在此指导书之内。
本实验指导书针对通信工程专业而编写,由于课时及难度要求的不一致,计算机科学与技术专业的《数字电路与逻辑设计》课程的实验部分也可参考此指导书,选择或者综合一部分项目进行。
目 录
1、实验一:Quartus II的安装及实验平台的熟悉···········································1
2、实验二:Verilog HDL语言的熟悉····························································7
3、实验三:4位累加器的的开发·································································21
4、实验四:快速进位功能的8位累加器的开发···········································24
5、实验报告基本内容要求········································································28
30
实验一:Quartus II的安装及实验平台、开发语言的熟悉
实验学时:2
实验类型:验证
实验要求:必修
一、实验目的
(1) 学会安装Quartus II 7.2开发软件。
(2) 熟悉MJU_CS/Altera实验仪。
(3) 熟悉基本的Verilog HDL语法及编程。(需提前预习)。
(4) 熟悉开发平台编译、仿真、下载,到调试的整个开发过程。
二、实验内容
(1) 熟悉MJU-CS/Altera实验仪,熟悉开发板的硬件环境。
(2) 安装Quartus II 7.2开发软件,熟悉Verilog HDL语言的开发软件环境。
(3) 通过基本的输入输出输出实验(点亮发光二极管等)熟悉实验平台开发流程。
(4) 熟悉Verilog HDL语言的基本语法和使用。(预习完成实验二)
三、实验原理、方法和手段
教师演示,学生自主验证操作。
四、实验组织运行要求
采用集中授课形式。
五、实验条件
(1)每2位同学为1组,每组一台PC机、一台MJU-CS/Altera实验仪。
(2)配套的软硬件设备:并口JTAG下载线、Quartus II 7.2安装程序等。
六、实验步骤
(一)熟悉MJU-CS/Altera实验仪
在老师的指导下,参考《数字电路CPLD综合实验开发板使用说明书》第1节内容,对MJU-CS/Altera实验仪的硬件资源、结构、布局进行熟悉。
(1)电路布局
(2)主要器件:
CPLD芯片EPM240T100C5N、+3.3V电源供应芯片AMS1117-3.3、2个4合1的8段共阳极数码管、RS-232接口器件MAX232CSE、模数芯片ADC0804、数模芯片DAC0832、无源蜂鸣器BUZZER、4个独立按键、4*4矩阵键盘、复位按钮、12个LED(红、黄、绿各4个)、LED指示灯、晶振。
(3)应用接口:
详见《数字电路CPLD综合实验开发板使用说明书》表1.1。
(4)跳线接口:
详见《数字电路CPLD综合实验开发板使用说明书》表1.2。
(4)硬件原理分析
详见《数字电路CPLD综合实验开发板使用说明书》第二部分内容。
(二)安装Quartus II 7.2开发软件
在老师的指导下,安装Quartus II 7.2软件,并进行运行,熟悉软件的界面以及相关的工具和功能等。
详细步骤及界面介绍略。
三、实验平台开发流程的熟悉
1. 基本输出实验 – 点亮发光二极管
要求:点亮MJU-CS/Altera实验仪上的4个红色发光二极管。通过此实验掌握CPLD的基本开发流程,软硬件设计步骤。
分析:在MJU-CS/Altera实验仪上已经为用户准备了12个发光二极管,其中红、黄、绿三色各4个,其硬件原理图如下图1所示,在MJU-CS/Altera实验仪中,短接J10,则所有的LED正极接通3.3v电源,只要正确分配并锁定引脚后,在相应的引脚上输出低电平“0”,就可以实现点亮该发光二极管的功能。
图1 发光二极管原理图
其中,各IO接口所连接LED的颜色及在实验板上的位置如下图所示:
图2 LED灯IO接口连接示意图
程序设计:
由于要求是点亮4个红色发光二极管,因此只须在相应的引脚输出低电平“0”即可,完整的Verilog HDL源程序如下:
实验方法:
1)建立项目工程led,并在此工程项目下新建Verilog HDL源程序文件led.v,输入上面的程序代码并保存。
2)为该工程项目选择一个目标器件并对相应的引脚进行锁定,在此所选择的器件应该是Altera公司的EPM240T100C5N芯片,引脚锁定方法如下表1所示。
表1 led实验引脚锁定方法
3)对该工程文件进行编译处理,若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
4)拿出跳线短接帽短接J10。拿出JTAG下载电缆,并将此电缆的两端分别接到PC机和MJU-CS/Altera实验仪的JTAG下载接口上,打开工作电源,执行下载命令,把程序下载到MJU-CS/Altera实验仪的EPM240T100C5N芯片中,此时,MJU-CS/Altera实验仪的4个红色LED灯将被点亮。
2. 基本输入/ 输出实验 – 基本逻辑门实验
要求:在MJU-CS/Altera实验仪上完成F=AB的逻辑功能。
分析:在MJU-CS/Altera实验仪上为用户准备了5个输入独立按键K1~K4,RESET,其硬件原理图如图2所示。这样用户可以把健K1、K2当做输入A、B,而F可以用LED发光二极管来表示。当有按键按下时,IO引脚将由高电平切换到低电平,从而也将改变LED的状态。
图2 独立按键原理图
程序设计:
Verilog HDL源程序如下:
实验方法:
1)建立项目工程fab_and,并在此工程项目下新建Verilog HDL源程序文件fab.v,输入上面的程序代码并保存。
2)为该工程项目选择一个目标器件并对相应的引脚进行锁定,在此所选择的器件应该是Altera公司的EPM240T100C5N芯片,引脚锁定方法如下表2所示。
表2 基本逻辑门实验引脚锁定方法
3)对该工程文件进行编译处理,若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
4)K1为a信号,K2为b信号,f为LED输出信号。拿出JTAG下载电缆,并将此电缆的两端分别接到PC机和MJU-CS/Altera实验仪的JTAG下载接口上,打开工作电源,执行下载命令,把程序下载到MJU-CS/Altera实验仪的EPM240T100C5N芯片中。
5)观察LED发光管的亮灭状态,按下K1按键,再次观察发光管的状态,此时为什么发光管亮了呢?
七、思考题
1)为什么将EPM240T100C5N的引脚设置为“0”,对应连接的LED将被点亮?修改程序或配置,点亮MJU-CS/Altera实验仪的4个黄色LED灯。
2)实现F = A +B的逻辑功能,并使用K1、K2和LED输入控制和输出显示体现逻辑或的功能。
3)请课前课后学习Verilog HDL语言。见附录一:Verilog HDL语言的基本知识
八、实验报告
要求及格式见本手册末尾说明。
九、其它说明
在进行实验时,请握持实验板的边缘,不要随意用手指触碰板子上的电路部分,以免静电对实验板的损害。
实验二:Verilog HDL语言的熟悉
实验学时:2
实验类型:验证
实验要求:选修
一、实验目的
(1) 熟悉使用Quartus II 7.2开发环境。
(2) 熟悉基本的Verilog HDL语法及编程。
二、实验内容
(1) 熟悉使用Quartus II 7.2开发环境。
(2) 通过例程熟悉基本的Verilog HDL语法及编程。
三、实验原理、方法和手段
教师演示,学生自主验证操作。
四、实验组织运行要求
采用集中授课形式。
五、实验条件
(1)每2位同学为1组,每组一台PC机、一台MJU-CS/Altera实验仪。
(2)配套的软硬件设备:并口JTAG下载线、Quartus II 7.2安装程序等。
六、实验步骤
(一)学习以下例程:
module muxtwo(out, a, b, s1);
input a, b, s1;
output out;
reg out;
always @ (s1 or a or b)
if( !s1 ) out = a;
else out = b;
endmodule
以上程序段完成了二选一数据选择器,从以上例程扩展学习Verilog HDL语言的基本语法。
(二)Verilog HDL语言基本语法的学习:
(1)数据常量
-- Verilog HDL中共有19种数据类型。
1 数字
整数
二进制数(b或B)
十进制数(d或D)
十六进制数(h或H)
八进制数(o或O)
数字的三种表达方式:
<位宽><进制><数字> --- 全面的描述方式
<进制><数字> --- 默认位宽,至少32位
<数字>--- 默认位宽与进制(十进制)
examples:
8'b10101100
8'ha2
x 与 z
-- x代表不定值;z(?)代表高阻值
examples:
4'b10x0
4'b101z
12'dz
12'd?
8'h4x
负数
-- 在位宽表达式前加一个减号(-),减号必须放在数字定义表达式的最前面。
examples:
-8'd5 //ok
8'd-5 //not ok!!!
下划线
-- 用来分割数字的表达,提高程序的可读性,只能用在具体的数字之间。
examples:
16'b1010_1111_1001_0001 //OK
8'b_1001_1111 // not ok!!!
note:常量不说明位数的时候,默认为32位,每个字母用8位的ASCII码值表示,如“AB”=16’B010000001_010000010,
2 参数型(parameter)
-- 用parameter来定义常量,称为符号常量,可提高程序的可读性与可维护性。
格式:
parameter 参数名1 = 表达式,参数名2 = 表达式,... ,参数名n = 表达式;
note:表达式必须是常数表达式!!
举例:
parameter msb = 7;
parameter byte_size=8,byte_msb=byte_size-1;
note:parameter所定义的常量必须是值可以确定的。
(2)变量类型
1. wire型
- 常用来表示用于以assign关键字指定的组合逻辑信号
- 默认的类型
wire a; // 1个1位
wire[7:0] b; //1个8位
wire[4:1] c,d; //2个4位
2. reg型
-- 存储数据单元的抽象
-- always块内被赋值的每一个信号都必须为reg型(reg只表示被定义的信号将用在alway块内)
-- 默认初始值为不定值:x
reg rega;
reg[3:0] regb;
reg[4:1] regc,regd;
3. memory型
-- 通过对reg型变量建立数组,用于对存储器建模
reg[7:0] mega[255:0];
-- mega存储器,有256个8bit单元,地址范围为0~255
思考:reg[n-1:0] rega; 与 reg mega[n-1:0]的区别??
(3)结构说明语句
verilog HDL语言中的任何过程模块都从属于以下4种结构的说明语句:
- initial //开始时立即执行,且只执行一次
- always //开始时立即执行,直到仿真结束
- task
- function
//task和function语句可以在程序模块中的一处或多处调用
(3.1)always语句
- 仿真过程中不断活跃着
- 其后的过程快是否执行取决于它的触发条件是否满足
声明格式
always <时序控制> <语句>
note: always语句需要时序控制配合,否则会出现仿真死锁。
例1
always areg = ~areg;
//零延迟的无限循环跳变
例2
always #10 areg = ~areg;
//周期为20的无限延续信号
例3
reg[7:0] counter;
reg tick;
always @ (posedge areg) //上升沿激励
begin
tick = ~tick;
counter = counter + 1;
end
例4
always @ (posedge clock or posegde reset)
//上升沿 clock or reset激励
begin
....
end
例5
always @ (a or b or c)
//多个电平激励
begin
....
end
-- 沿触发的always块常常描述时序行为
-- 电平触发的always块常常描述组合逻辑行为
又一个verilog HDL实例:
module muxtwo(out, a, b, s1);
input a, b, s1;
output out;
not u1(ns1, s1);
and #1 u2(sela, a, ns1);
and #1 u3(selb, b, s1);
or #2 u4(out, sela, selb);
endmodule
模块中的逻辑功能可以通过以下3种方法实现:
1. assign声明语句
assign a = b & c;
2. 用实例元件
and #2 u1(q, a, b); //要求元件名唯一
3. 用always块
note:assign是描述组合逻辑的常用方法,always块可用于组合逻辑和时序逻辑。
(4)等式运算符
= = 、 = = = //等于
!=、 != = //不等于
examples:
if(A == 1'bx) $display("AisX");
//当A为X时,这个语句也不执行!
if(A === 1'bx) $display("AisX");
//当A为X时,这个语句执行!
(5)移位运算符
<<、>>
-- 用0填补由于移位造成的空位
examples:
4'b1001<<1 = ? 4'b1001<<2 = ?
4'b1001>>1 = ? 4'b1001>>4 = ?
1<<6 = ?
(6)位拼接运算符{ }
{ }可以把2个或多个信号的某些位拼接起来进行运算
格式:
{信号1的某几位, 信号2的某几位, ..., 信号n的某几位}
note:不允许存在没有指明位数的信号,位宽必须明确
examples:
{a,b[3:0],w,3'b101}
{a,b[2],b[1],b[0],w,1'b1,1'b0,1'b1}
{4{w}} = {w,w,w,w} //重复缩写形式
{b,{3{a,b}}} = {b,a,b,a,b,a,b} //嵌套形式
(7)缩减运算符
-- 单目运算符
-- 最后的运算结果是1位
-- 先第一位与第二位与或,接着第二位与第三位。。。。
reg[3:0] B;
reg C;
C = &B;
C = ((B[0] & B[1]) & B[2]) & B[3];
(8)赋值语句与块语句
(8.1)信号的两种不同的赋值方式:
1. 非阻塞赋值方式(b <= a)
-- 块结束后才完成赋值操作
-- b的值不是立即改变的
-- 比较常用的赋值方法
note:注意与比较运算符"<="区别开来
2. 阻塞赋值方式(b = a)
-- 先赋值,块才结束
-- b的值是立即改变的
-- 可能会产生意想不到的结果
note:在always块内给reg信号赋值时,采用哪种方式尤其要注意
举例说明以上区别如下:
always @ (posedge clk)
begin
b <= a;
c <= b;
end
//clk到来,b为a,c为b(c保持原来的b值)
always @ (posedge clk)
begin
b = a;
c = b;
end
//clk到来,b、c同时变化为a
(8.2)块语句
-- 将多条语句组合在一起,整体化
-- 2种类别:顺序块begin_end;
并行块fork_join
举例如下:
parameter d = 50;
reg[7:0] r;
begin
#d r = 'h35;
#d r = 'hE2;
#d r = 'h00;
#d r = 'hF7;
#d ->end_wave; //触发事件end_wave
end
并行块
-- 块内语句是同时执行的
-- 所有语句的基准时间是进入块语句的时间点
-- 延迟时间可对赋值语句进行时序控制
-- 当时序最后的一条语句执行完,或者调用disable语句时,程序流跳出块
举例如下:
fork
#50 r = 'h35;
#100 r = 'hE2;
#150 r = 'h00;
#200 r = 'hF7;
#250 ->end_wave; //触发事件end_wave
join
note:顺序块和并行块的起始时间和结束时间;并行块中语句的顺序可随意。
(9) 条件语句(if-else、case)
case
格式:
1. case(表达式) <case分支项> endcase
2. casez(表达式) <case分支项> endcase
2. casex(表达式) <case分支项> endcase
case分支项的一般格式:
分支项表达式: 语句;
default: 语句 //可有可无
reg[15:0] rega;
reg[9:0] result;
case(rega)
16'd0: result = 10'b0111_1111;
16'd1: result = 10'b1011_1111;
16'd2: result = 10'b1101_1111;
default: result = 10'bx;
endcese
note:
1. case项分支表达式必须不同
2. 执行完某个case分支,即跳出case语句结构
3. 分支表达式的值要明确相等才会执行
4. 位宽必须相等
表1 case、casez和casex的真值表
(10)循环语句
forever:连续的执行语句
repeat:执行n次
while:条件满足则执行
for:分3步走
note:for语句的变量增加不能用“++”
(10.1)forever:连续的执行语句
格式:
forever 语句;
note:常用于产生周期性的波形,作为仿真测试信号,与always的不同之处在于:不能独立写在程序中,而必须写在initial块中。
(10.2)repeat:执行n次
格式:
repeat(执行次数) 语句;
note:常用于产生周期性的波形,作为仿真测试信号,与always的不同之处在于:不能独立写在程序中,而必须写在initial块中。
(11)initial说明语句
格式:
initial
begin
语句s;
end
1. 只执行一次。
2. 常用于仿真信号的产生等。
(12)task和function说明语句
--都用于定义程序模块
区别是:
1. 函数只能跟主模块共用一个仿真时间,任务则没有此限制。
2. 函数不能启动任务,任务可以启动任务和函数
3. 函数至少需要一个输入变量,任务可以没有或多个任何类型的变量
4. 函数返回一个值,任务没有返回值
examples:
switch_bytes(old_word, new_word);
new_word = switch_bytes(old_word);
哪个是函数方式?哪个是任务方式?
(三)结合以上的Verilog HDL语言的学习,学习并跟着编写一下例程。
(1)4位全加器
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
(2)4位计数器
module count4(out,reset,clk);
output[3:0] out;
input reset,clk;
reg[3:0] out;
always @(posedge clk)
begin
if (reset) out<=0; //同步复位
else out<=out+1; //计数
end
endmodule
(3)用case语句描述的 4 选 1 数据选择器
module mux4_1(out,in0,in1,in2,in3,sel);
output out;
input in0,in1,in2,in3;
input[1:0] sel;
reg out;
always @(in0 or in1 or in2 or in3 or sel) //敏感信号列表
case(sel)
2'b00: out=in0;
2'b01: out=in1;
2'b10: out=in2;
2'b11: out=in3;
default: out=2'bx;
endcase
endmodule
七、思考题
(1)在4位计数器的基础上,实现带同步清0,同步置1的4位加法计数器。
(2)在以上4选1数据选择器的基础上,实现带1个使能端(低电平有效)的8选1数据选择器。
八、实验报告
要求及格式见本手册末尾说明。
九、其它说明
学生在做本实验前,应该充分进行预习,熟悉Verilog HDL语言,此外,应从其他渠道学习和巩固Verilog HDL语言的编程,如网络、其他书籍等。
实验三:4位累加器的开发
实验学时:2
实验类型:验证
实验要求:必修
一、实验目的
(1) 理解累加器的原理。
(2) 熟悉累加器的Verilog HDL编程、仿真和调试。
二、实验内容
(1) 4位累加器的开发及仿真。
(2) 3位累加器的开发及下载运行。
三、实验原理、方法和手段
教师演示,学生自主验证操作。
四、实验组织运行要求
采用集中授课形式。
五、实验条件
(1)每2位同学为1组,每组一台PC机、一台MJU-CS/Altera实验仪。
(2)配套的软硬件设备:并口JTAG下载线、Quartus II 7.2安装程序等。
六、实验步骤
(一)4位累加器的开发及仿真
要求:实现带低位进位、向高位进位功能的4位累加器并进行仿真。
分析:4位累加器是一种组合逻辑电路,Verilog HDL语言实现方法较多,其中一种较为简单的实现源代码如下:
请自行分析源代码。
实验方法:
1)建立项目工程add4,并在此工程项目下新建Verilog HDL源程序文件add4.v,输入上面的程序代码并保存。
2)对该工程文件进行编译处理,若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
3)创建仿真波形文件,对4位累加器的逻辑功能进行仿真。
4)根据仿真波形文件,分析4位累加器的逻辑功能是否符合预期。
(二)3位累加器的开发及下载运行
要求:实现带低位进位、向高位进位功能的3位累加器并进行下载运行,加法的加数、被加数、低位进位由拨码开关实现。在实验开发板上,当拨码开关拨动到上方时,相应的IO脚状态为“0”,反之,当拨动到下方时,相应的IO脚状态为“1”。拨码开关的标号与IO脚的对应关系如下表所示:
表2.1 拨码开关位置编号与IO引脚的对应关系
拨码开关标号
IO引脚
1
75
2
71
3
74
4
70
5
69
6
73
7
72
8
68
分析:3位累加器是一种组合逻辑电路,Verilog HDL语言实现方法较多,其中一种较为简单的实现源代码如下:
请自行分析源代码。
实验方法:
1)建立项目工程add,并在此工程项目下新建Verilog HDL源程序文件add.v,输入上面的程序代码并保存。
2)为该工程项目选择一个目标器件并对相应的引脚进行锁定,在此所选择的器件应该是Altera公司的EPM240T100C5N芯片,引脚锁定方法如下表1所示。
表1 led实验引脚锁定方法
3)对该工程文件进行编译处理,若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
4)拿出JTAG下载电缆,并将此电缆的两端分别接到PC机和MJU-CS/Altera实验仪的JTAG下载接口上,打开工作电源,执行下载命令,把程序下载到MJU-CS/Altera实验仪的EPM240T100C5N芯片中。
5)观察最右边数码管的显示,分析原因,随机拨动拨码开关的1~7,观察最右边数码管的显示,分析原因。
6)根据5),总结心得体会。
七、思考题
无
八、实验报告
要求及格式见本手册末尾说明。
九、其它说明
开发板上的+5V电源接口不能使用短路冒与地(GND)进行短接,否则将烧坏电源和开发板。
实验四:快速进位功能的8位累加器的开发
实验学时:2
实验类型:验证
实验要求:选修
一、实验目的
(1) 理解累加器的快速进位的原理。
(2) 熟悉累加器的Verilog HDL编程、仿真和调试。
二、实验内容
(1) 学习累加器的快速进位原理。
(2) 8位快速进位累加器的开发及仿真。
三、实验原理、方法和手段
教师演示,学生自主验证操作。
四、实验组织运行要求
采用集中授课形式。
五、实验条件
(1)每2位同学为1组,每组一台PC机、一台MJU-CS/Altera实验仪。
(2)配套的软硬件设备:并口JTAG下载线、Quartus II 7.2安装程序等。
六、实验步骤
(一)累加器的快速进位原理
累加器的快速进位也称为超前进位,具有快速进位的累加器称为超前进位加法器。超前进位加法器就是使各位的进位直接由加数和被加数来决定,而不需要依赖和等待低位进位。对于每一位给高位的进位,有如下逻辑表达式:
(式1、第i位进位给i+1位的进位)
从上式可知,当第i位被加数和加数均为1时,有,此时,不论低位运算结果如何本位必然有进位输出(),所以定义为进位产生函数。当和中只有一个为1时,有,,使得,所以定义为进位传递函数。此时,第i位给i+1位的进位,与相等,相当于直接通过传递函数传递继承过来,而不需要等待低位的运算。如此,可以实现每一位的快速进位值及最终的进位值。
将和代入全加器的“和”及“进位”表达式有:
(式2、第i位的本位)
(式3、第i位进位给i+1位的进位)
从而构成超前进位加法器。
(二)8位快速进位累加器的开发及仿真
要求:实现带低位进位、向高位进位功能8位具有快速进位的累加器并进行仿真。
分析:按照式2、式3,可写出源代码如下所示:
module add_ahead(sum,cout,a,b,cin);
output[7:0] sum; output cout; input[7:0] a,b; input cin;
wire[7:0] G,P; wire[7:0] C,sum;
assign G[0]=a[0]&b[0]; //产生第0 位本位值和进位值
assign P[0]=a[0]|b[0];
assign C[0]=cin; //第0位得到的进位
assign sum[0]=a[0]^b[0]^C[0];
assign G[1]=a[1]&b[1]; //产生第1 位本位值和进位值
assign P[1]=a[1]|b[1];
assign C[1]=G[0]|(P[0]&cin); //第0位给第1位的进位
assign sum[1]=a[1]^b[1]^C[1];
assign G[2]=a[2]&b[2]; //产生第2 位本位值和进位值
assign P[2]=a[2]|b[2];
assign C[2]=G[1]|(P[1]&C[1]); //第1位给第2位的进位
assign sum[2]=a[2]^b[2]^C[2];
assign G[3]=a[3]&b[3]; //产生第3 位本位值和进位值
assign P[3]=a[3]|b[3];
assign C[3]=G[2]|(P[2]&C[2]); //第2位给第3位的进位
assign sum[3]=a[3]^b[3]^C[3];
assign G[4]=a[4]&b[4]; //产生第4 位本位值和进位值
assign P[4]=a[4]|b[4];
assign C[4]=G[3]|(P[3]&C[3]); //第3位给第4位的进位
assign sum[4]=a[4]^b[4]^C[4];
assign G[5]=a[5]&b[5]; //产生第5 位本位值和进位值
assign P[5]=a[5]|b[5];
assign C[5]=G[4]|(P[4]&C[4]); //第4位给第5位的进位
assign sum[5]=a[5]^b[5]^C[5];
assign G[6]=a[6]&b[6]; //产生第6 位本位值和进位值
assign P[6]=a[6]|b[6];
assign C[6]=G[5]|(P[5]&C[5]); //第5位给第6位的进位
assign sum[6]=a[6]^b[6]^C[6];
assign G[7]=a[7]&b[7]; //产生第7 位本位值和进位值
assign P[7]=a[7]|b[7];
assign C[7]=G[6]|(P[6]&C[6]); //第6位给第7位的进位
assign sum[7]=a[7]^b[7]^C[7];
assign cout=G[7]|(P[7]&C[7]); //产生最高位进位输出
endmodule
请自行分析源代码。
实验方法:
1)建立项目工程add_ahead,并在此工程项目下新建Verilog HDL源程序文件add_ahead.v,输入上面的程序代码并保存。
2)对该工程文件进行编译处理,若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
3)创建仿真波形文件,对具有快速进位功能的8位累加器的逻辑功能进行仿真。
4)根据仿真波形文件,分析具有快速进位功能的8位累加器的逻辑功能是否符合预期。
七、思考题
1)请思考如果用基本的门电路来实现具有快速进位功能的8位累加器硬件电路,该如何实现?其与普通的8位累加器各有何优缺点?
八、实验报告
要求及格式见本手册末尾说明。
九、其它说明
开发板上的+5V电源接口不能使用短路冒与地(GND)进行短接,否则将烧坏电源和开发板。
学生实验报告基本内容要求
学生实验报告应事先准备好,用来做预习报告、实验记录和实验报告。
1、实验预习
在实验前每位同学都需要对本次实验进行认真的预习,并写好预习报告,在预习报告中要写出实验目的、要求,需要用到的仪器设备、物品资料以及简要的实验步骤,形成一个操作提纲。对实验中的安全注意事项及可能出现的现象等做到心中有数,但这些不要求写在预习报告中。
设计性实验要求进入实验室前写出实验方案,并经指导教师审阅后实施。
2、实验记录
学生开始实验时,应该将记录本放在近旁,将实验中所做的每一步操作、观察到的现象和所测得的数据及相关条件如实地记录下来。
实验记录中应有指导教师的签名。
3、实验报告
主要内容包括对实验数据、实验中的特殊现象、实验操作的成败、实验的关键点等内容进行整理、解释、分析总结,回答思考题,提出实验结论或提出自己的看法等。
展开阅读全文