EDA简易计算器和EDA交通灯设计

VLSI电路系统课程作业

学院:物理与电信工程学院

专业:电路与系统

姓名:梁家伟

学号: 2013021591

日期: 2014年 03月 07号

目录

1、简易计算器 (3)

1.1 任务 (3)

1.2 实验使用软件环境 (3)

1.3 实验设计 (3)

1.4 四位加法器 (4)

1.4.1一位全加器 (4)

1.4.2四位全加器 (5)

1.4.3可进行加减运算的四位全加器 (6)

1.5设计四位乘法器 (8)

1.5.1八位加法器 (8)

1.5.2四位乘法器 (9)

1.6简易计算器 (11)

2、交通灯控制器 (13)

2.1任务 (13)

2.3 设计思想 (14)

2.2 程序设计 (14)

2.4实验结果 (15)

3、总结 (16)

4、附录(程序) (17)

4.1 简易计算器 (17)

4.2 交通灯控制器 (21)

1、简易计算器

1.1 任务

在可编程逻辑器件上实现一个简易计算器,可以进行4位二进制数的加法和乘法运算,其中被加(乘)数取值范围0~15,加(乘)数取值范围-15~15。

要求用原理图的输入方式及硬件描述语言的结构描述方式完成。

1.2 实验使用软件环境

PC操作系统:win7(32bits)

仿真软件:Quartus10.1、ModelSim-Altera 6.6c

1.3 实验设计

设计一个1位全加器。运用modelsim功能正确后,将其封装成1位全加器模块。

以1中已封装的1位全加器模块为基础设计一个4位全加器并将其封装成模块,要求:

(1) 加数为正时,实现两个4位二进制数与来自低位进位的加法运算,输出显示和及高位进位。

(2) 加数为负时,实现两个4位二进制数的减法运算,输出显示差的原码和正负数标志。

3、以全加器为基础设计一个4位乘法器并封装成乘法器模块,输出显示乘

积和正负数标志。

4、以2、3中生成的器件模块为基础构成一个简易计算器,实现如下图功能。根据S的输入,分别完成Y=A+B或Y=A×B。

1.4 四位加法器

设计四位加法器

要实现一个四位全加器,能进行加减法且以原码方式输出结果,分三步进行,流程如下。

具体实现过程如下。

1.4.1一位全加器

(1)一位全加器代码

其中A,B分别是两个一位的加数,Cin为来自低位的进位,Sum为输出的全加和,Count为向高位的进位。

(2)用modelsim对一位全加器进行功能仿真时编写的激励信号:

译码

(3)modelsim仿真结果

1.4.2四位全加器

(1)对一位全加器的代码进行封装,在此基础上实现一个四位全加器,代码截图如下:

(2)同样编写该信号的modelsim激励文件,由于代码过长,接下来的激励文件都不截图。

(3)modelsim仿真结果

上图中,黄色标杆表示的是它所在的那条线上信号的数值(信号名和信号在黄色标杆上的数值都显示在左边栏那里),从图中可以看到,此时低位CO1=0,被加数A3A2A1A0=0010(十进制为2)、加数B3B2B1B0=1011十进制为(11)、结果S3S2S1S0=1101(十进制为13),向高位的进位CO2=0。可知四位加法器的功能仿真结果是正确的。

1.4.3可进行加减运算的四位全加器

(1)在四位全加器电路中增设控制端k,当k=0时,对输入的两数进行加法运算,当k=1时,对输入的两数进行减法运算,并以原码形式输出差值。

将控制端k与加数和低位进位进行异或运算,这样k=1时,异或后得到原加数的反码,低位进位为1,此时被加数和加数的补码相加,得到差的补码,再将补码取反加1后得到差的原码;k=0时,异或后原加数不变,此时被加数和加数相加,进行的是加法运算。主要通过控制端k的各种异或运算实现。

实现代码截图如下:

(2)编写modelism的testbench信号激励文件

(3)modelsim仿真结果

从上图可以看出,此时控制端k=1,做的是减法运算,被减数A3A2A1A0=0001(十进制为1),减数B3B2B1B0=1000(十进制为8),结果S3S2S1S0=0111(十进制为7),结果符号标志位CO2=1(表示负数),所以该运算结果为-7

的源码10111。而此时CO1不是表示低位的进位,而是在取减数的补码时,取

反后,用来加1的,从而可以表示减数的补码。

1.5设计四位乘法器

要实现两个四位二进制数的乘法运算,即是实现相乘、移位、相加的功能,为此分三步进行,过程如下。

具体实现过程如下。

1.5.1八位加法器

(1)用之前编写的四位全加器模块串联可以得到八位加法器,代码截图如下:(2) 编写modelsim仿真时的激励文件

(3)Modelsim仿真结果

从仿真结果可以看出,此时低位进位CO1=0,被加数

A7A6A5A4A3A2A1A0=10111011,加数B7B6B5B4B3B2B1B0=11011101,结果

S7S6S5S4S3S2S1S0=10011000,高位进位CO2=1,即最终结果为110011000,可知该仿真结果是正确的。

1.5.2四位乘法器

(1) 利用已经写好的八位加法器模块,我在此基础上写了四位乘法器模块,代码截图如下:

其中A3A2A1A0,B3B2B1B0分别为四位乘数,BSF是乘法结果的符号标识,

S7S6S5S4S3S2S1S0是乘法结果,A_VECTOR、B_VECTOR、S_VECTOR是为了用modelsim仿真时可以看到十进制数值而设置的。

(2)编写modelsim的激励文件testbench。

(3)Modelsim仿真结果如下:

由仿真结果的A_VECTOR,B_VECTOR,S_VECTOR的数值可以看到该功能仿真结果是正确的。

1.6简易计算器

(1) 原理:

结合上面的设计好的四位加法器和四位乘法器,我们可以构成简易计算器

根据S的输入,分别完成Y=A+B或Y=A×B

思路:将输入的四位二进制数A3A2A1A0、B3B2B1B0分别与S进行与运算后接到四位译码全加器的输入端,将A3A2A1A0、B3B2B1B0分别与S’进行与运算后接到四位乘法器的输入端,最后将加法器和乘法器的对应输出做或运算,作为最终的输出。

这样,S=0时,加法器输出0,乘法器输出两个数的乘积,最终得到的是乘积,即进行了乘法运算;S=1时,乘法器输出0,加法器输出两个数的和,最终得到的是和,即进行了加法运算。

(2) 实现代码截图如下:

(3) 编写相应的激励文件

(4) Moldsim仿真结果如下

在该图中,flag为1时做的是四位可加减的加法器运算,此时乘法运算结果MULTI_VETOR为0;flag为0时做的是四位乘法器运算,此时加法器运算结果ADDSUB_VECTOR为0。当flag为1做四位加减法运算时,此时k=1表示做的是

减法,做减法时ADDSUB_CO2是符号标识位;k=0表示做的是加法,加法时ADDSUB_CO2表示的是加法结果向高位的进位。而当flag为0做四位乘法器时,BSF表示的是运算结果的符号。

2、交通灯控制器

2.1任务

(a)简要说明。在十字路口,每条道路各有一组红、黄、绿灯和倒计时显示器,用以指挥车辆和行人有序地通行。其中,红灯(R)亮,表示该条道路禁止通行;黄灯(Y)亮,表示停车;绿灯(G)亮,表示可以通行。

倒计时显示器是用来显示允许通行和禁止通行地时间。交通灯控制器就是用来自动控制十字路口的交通灯和计时器,指挥各种车辆和行人安全通行。

十字路口交通灯负责控制各走向红绿灯的状态及转换, 并且各状态之间有一定的时间过渡。同时, 东西南北每条干道上都为人行横道设置了红绿灯, 提醒过路行人在安全时刻穿越道路, 以保证行人的安全。

(b)具体功能如下:

①在十字路口的两个方向上各设一组红、绿、黄灯,显示顺序为其中一方向(东西方向)是绿灯、黄灯、红灯;另一方向(南北方向)是红灯、绿灯、黄灯。

②设置一组数码管,以倒计时的方式显示允许通行或禁止通行的时间,其中

绿灯、黄灯、红灯的持续时间分别是10s、3s和10s。

③当各条路上任意一条上出现特殊情况时,如当消防车、救护车或其他需要

优先放行的车辆通过时,各方向上均是红灯亮,倒计时停止,且显示数字在闪烁。当特殊运行状态结束后,控制器恢复原来状态,继续正常运行。

2.3 设计思想

依设计要求,画出交通灯点亮规律的状态转换表,如表1所示。

2.2 程序设计

分频模块代码截图:

我用的FPGA的板载时钟是50M,通过该分频分出周期为1s的时钟信号clk_1s,用来做计时。

各个方向的交通灯状态转换代码截图(部分状态):

2.4实验结果

(a)从左图到右图,对应的是2.3中状态表从状态1变化到状态2,在没有出现紧急情况时,红绿灯是按照状态表中状态1到状态8不断循环的。

(b)这个对应的是2.3状态表中的状态9。我是通过FPGA板子上的按键来模拟紧急情况的出现的,不论红绿灯此时是处于状态表中状态1到状态8的哪一种状态,只要当按键按下时,就表示有紧急情况,这时各个方向上都是显示红灯状态。当释放按键后,红绿灯又恢复到2.3状态表中的状态1,然后不断往下的正常切换状态。

3、总结

通过这两次实验,我对FPGA有了更深的理解,也更加熟悉Moldesim仿真软件的用法,收获蛮多的。这个学期,非常感谢潘老师给我们上课,在此衷心地说一声:谢谢!

4、附录(程序)4.1 简易计算器

(a)一位加法器

module add(

input A,B,Cin,

output Sum,Count);

wire S1,T1,T2,T3;

xor x1(S1,A,B);

xor x2(Sum,S1,Cin);

and A1(T3,A,B);

and A2(T2,B,Cin);

and A3(T1,A,Cin);

or O1(Count,T1,T2,T3);

endmodule

(b)四位加法器

module add_f1(

input A3,A2,A1,A0,B3,B2,B1,B0,CO1,

output S3,S2,S1,S0,CO2

);

wire count1,count2,count3,count4;

add U1(.A(A0),.B(B0),.Cin(CO1),.Sum(S0),.Count(count1)); add U2(.A(A1),.B(B1),.Cin(count1),.Sum(S1),.Count(count2)); add U3(.A(A2),.B(B2),.Cin(count2),.Sum(S2),.Count(count3)); add U4(.A(A3),.B(B3),.Cin(count3),.Sum(S3),.Count(count4)); assign CO2=count4;

endmodule

(c)可加减四位加法器

module addsub_f(

input k,

input A3,A2,A1,A0,B3,B2,B1,B0,CO1,

output S3,S2,S1,S0,CO2);

wire k_or_CO1,k_xor_B0,k_xor_B1,k_xor_B2,k_xor_B3;

wire count1,count2,count3,count4;

or O1(k_or_CO1,k,CO1);

xor x1(k_xor_B0,k,B0);

xor x2(k_xor_B1,k,B1);

xor x3(k_xor_B2,k,B2);

xor x4(k_xor_B3,k,B3);

add U1(.A(A0),.B(k_xor_B0),.Cin(k_or_CO1),.Sum(SS0),.Count(count1));

add U2(.A(A1),.B(k_xor_B1),.Cin(count1),.Sum(SS1),.Count(count2));

add U3(.A(A2),.B(k_xor_B2),.Cin(count2),.Sum(SS2),.Count(count3));

add U4(.A(A3),.B(k_xor_B3),.Cin(count3),.Sum(SS3),.Count(count4));

wire Ncount4,k_and_Ncount4;

not not1(Ncount4,count4);

and and1(k_and_Ncount4,k,Ncount4);

wire k_and_N4_xor_SS0,k_and_N4_xor_SS1,k_and_N4_xor_SS2,k_and_N4_xor_SS3; xor x5(k_and_N4_xor_SS0,k_and_Ncount4,SS0);

xor x6(k_and_N4_xor_SS1,k_and_Ncount4,SS1);

xor x7(k_and_N4_xor_SS2,k_and_Ncount4,SS2);

xor x8(k_and_N4_xor_SS3,k_and_Ncount4,SS3);

xor x9(k_xor_count4,k,count4);

assign CO2=k_xor_count4;

add_f1

U1_F( .A3(k_and_N4_xor_SS3),.A2(k_and_N4_xor_SS2),.A1(k_and_N4_xor_SS1) ,.A0(k_and_N4_xor_SS0),.B3(0),.B2(0),.B1(0),

.B0(k_and_Ncount4),.CO1(0),.S3(S3),.S2(S2),.S1(S1),.S0(S0),.CO2()

);

Endmodule

(d)八位加法器

module add_e1(

input A7,A6,A5,A4,A3,A2,A1,A0, B7,B6,B5,B4,B3,B2,B1,B0,CO1,

output S7,S6,S5,S4,S3,S2,S1,S0,CO2

);

wire count1;

add_f1 U2_F( .A3(A3),.A2(A2),.A1(A1),.A0(A0),.B3(B3),.B2(B2),.B1(B1),

.B0(B0),.CO1(CO1),.S3(S3),.S2(S2),.S1(S1),.S0(S0),.CO2(count1)

);

add_f1 U3_F( .A3(A7),.A2(A6),.A1(A5),.A0(A4),.B3(B7),.B2(B6),.B1(B5),

.B0(B4),.CO1(count1),.S3(S7),.S2(S6),.S1(S5),.S0(S4),.CO2(CO2)

);

Endmodule

(e)四位乘法器

module multipe_f(

input A3,A2,A1,A0,B3,B2,B1,B0,BSF,

output S7,S6,S5,S4,S3,S2,S1,S0,CO2,

output [3:0]A_VECTOR,B_VECTOR,

output [7:0]S_VECTOR

);

assign A_VECTOR={A3,A2,A1,A0};

assign B_VECTOR={B3,B2,B1,B0};

assign S_VECTOR={S7,S6,S5,S4,S3,S2,S1,S0};

wire T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16;

and Aa1(T1,A3,B0);and Aa2(T2,A2,B0);and Aa3(T3,A1,B0);and Aa4(T4,A0,B0); and Aa5(T5,A3,B1);and Aa6(T6,A2,B1);and Aa7(T7,A1,B1);and Aa8(T8,A0,B1); and Aa9(T9,A3,B2);and Aa10(T10,A2,B2);and Aa11(T11,A1,B2);and

Aa12(T12,A0,B2);

and Aa13(T13,A3,B3);and Aa14(T14,A2,B3);and Aa15(T15,A1,B3);and

Aa16(T16,A0,B3);

wire

SS7,SS6,SS5,SS4,SS3,SS2,SS1,SS0,SSS7,SSS6,SSS5,SSS4,SSS3,SSS2,SSS1,SSS0,SSS CO2;

add_e1 U_sum1(

.A7(0),.A6(0),.A5(0),.A4(0),.A3(T1),.A2(T2),.A1(T3),.A0(T4),

.B7(0),.B6(0),.B5(0),.B4(T5),.B3(T6),.B2(T7),.B1(T8),.B0(0),.CO1(0),

.S7(SS7),.S6(SS6),.S5(SS5),.S4(SS4),.S3(SS3),.S2(SS2),.S1(SS1),.S0(SS0),.CO2() );

add_e1 U_sum2(

.A7(0),.A6(0),.A5(T9),.A4(T10),.A3(T11),.A2(T12),.A1(0),.A0(0),

.B7(0),.B6(T13),.B5(T14),.B4(T15),.B3(T16),.B2(0),.B1(0),.B0(0),.CO1(0),

.S7(SSS7),.S6(SSS6),.S5(SSS5),.S4(SSS4),.S3(SSS3),.S2(SSS2),.S1(SSS1),.S0(SSS0 ),.CO2(SSSCO2)

);

add_e1 U_sum3(

.A7(SS7),.A6(SS6),.A5(SS5),.A4(SS4),.A3(SS3),.A2(SS2),.A1(SS1),.A0(SS0),

.B7(SSS7),.B6(SSS6),.B5(SSS5),.B4(SSS4),.B3(SSS3),.B2(SSS2),.B1(SSS1),.B0(SSS0 ),.CO1(SSSCO2),

.S7(S7),.S6(S6),.S5(S5),.S4(S4),.S3(S3),.S2(S2),.S1(S1),.S0(S0),.CO2()

);

endmodule

(f)基于以上模块构成的简易计算器

module multiple_addsub(

input k,flag,CO1,A3,A2,A1,A0,B3,B2,B1,B0,BSF,

output ADDSUB_S3,ADDSUB_S2,ADDSUB_S1,ADDSUB_S0,ADDSUB_CO2,

output multi_S7,multi_S6,multi_S5,multi_S4,multi_S3,multi_S2,multi_S1,multi_S0, multi_CO2,

output [3:0]A_VECTOR,B_VECTOR,ADDSUB_VECTOR,

output [7:0]MULTI_SVECTOR

);

相关文档
最新文档