【Verilog】实验四 数字加法器的设计

一、实验目的

1. 掌握数字加法器的工作原理和逻辑功能。

2. 熟悉VIVADO集成开发环境。

3. 熟悉VIVADO中进行开发设计的流程。

二、实验环境

1. 装有ModelSim和VIVADO的计算机。

2. Sword实验系统。

三、实验任务

1. 用VerilogHDL语言设计实现4位串行数字加法器和4位并行加法器,在ModelSim上仿真实现。

2. 生成FPGA设计文件,下载到Sword实验系统上验证电路功能。

四、实验原理与实验步骤

1. 实验原理

数字加法器是一种较为常用的逻辑运算器件,被广泛用于计算机、通信和多媒体数字集成电路中。广义的加法器包括加法器和减法器,在实际系统中加法器输入通常采用补码形式。此次实验仅考虑加法运算,分别完成4位的串行进位加法器设计和4位的并行进位加法器设计。

(1) 1 bit全加器

最简单的一位全加器的结构,设定两个二进制数字AiBi和一个进位输入Ci 相加,产生一个和输出Si ,以及一个进位输出Ci1

Si   =  Ai⊕Bi⊕Ci 

Ci1AiBiBiCiCiAi

       AiBi﹙Ai⊕Bi﹚Ci

(2) 4位串行进位加法器

n位串行进位全加器原理示意图

(3) 4位并行进位加法器

超前进位加法器是一种高速加法器,每级进位由附加的组合电路产生,高位的运算不需等待低位运算完成,因此可以提高运算速度。

各级进位信号表达式的推导过程

Ci1 AiBi(Ai⊕Bi)Ci

设:  Gi = AiBi         Pi = Ai ⊕Bi 

则有:     Si Pi ⊕Ci 

           Ci1 GiPiCi

4位并行进位的逻辑表达式为:

C0                   

C1G0P0C0   

C2G1P1C1 = G1 + P1(G0+P0C0)

    G1+ G0P1+P0P1C0 

C3G2P2C2 = G2 + P2(G1+G0P1+P0P1C0)

    G2+ G1P2+G0P1P2+P0P1P2C0 

C4G3P3C3 = G3 + P3(G2+…+P0P1P2C0) 

      G3+G2P3+G1P2P3+G0P1P2P3+P0P1P2P3C0

2. 实验步骤

  (1)用连续赋值语句实现4位串行进位的全加器,并完成modelsim下的功能仿真。

(2)用连续赋值语句实现4位并行进位的全加器,并完成modelsim下的功能仿真。

用相同的激励向量的话,仿真结果相同

(3)设计完成I/O引脚分配,选择sw0-sw3给出第一个加数,sw4-sw7给出第二个加数,sw[15]为Ci的输入,运算结果在LED以及数码管上显示。

xc7k160tffg676-1

top.v

`timescale 1ns / 1ps
module 	 TOP(input  wire clk_100mhz,
				 input  wire[15:0]SW,
				output wire seg_clk,
				output wire seg_clrn,
				output wire seg_sout,
				output wire SEG_PEN	,
				 output wire led_clk,
				 output wire led_clrn,
				 output wire led_sout,
				 output wire LED_PEN				
					);
				
    wire[31:0]Div;
    wire[15:0]LED_DATA;
    wire CK;

    clk_div       U8(clk_100mhz,1'b0,SW[2],Div,CK);
													
    LED_P2S 			  #(.DATA_BITS(16),.DATA_COUNT_BITS(4)) 
					      PLED (clk_100mhz,
									1'b0,
									Div[20],
									LED_DATA,
									led_clk,
									led_clrn,
									led_sout,
									LED_PEN
									);
		

	P2S 			  #(.DATA_BITS(64),.DATA_COUNT_BITS(6)) 
						  P7SEG (clk_100mhz,
									1'b0,
									Div[20],
									disp_data,
									seg_clk,
									seg_clrn,
									seg_sout,
									SEG_PEN
									);
	wire[3:0] out;
	wire[7:0] out1;
	wire cout;
	wire[3:0] cout1;
	wire[7:0] cout2;
	
	
	chuan U9(out,cout,SW[3:0],SW[7:4],SW[15]);
	//bing U10(out,cout,SW[3:0],SW[7:4],SW[15]);

	shumaguan U11_1(.out(out1),.in(out));
	wire[7:0] Seg0=out1;
	
	wire[3:0] cout1={3'b000,cout};
	shumaguan U11_2(.out(cout2),.in(cout1));

	wire[7:0] Seg1=cout2;
		wire[63:0] disp_data =  {Seg0,Seg1,48'hffffffffffff};


	assign LED_DATA = ~{out[0],out[1],out[2],out[3],cout,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0};	
	
endmodule

chuan.v

module chuan(sum,cout,a,b,cin);
    output[3:0] sum;
    output cout;
    input[3:0] a,b;
    input cin;
    wire[4:0] c;
    assign c[0]=cin;
    assign c[4:1]=(a&b)|((a^b)&c[3:0]);
    assign cout=c[4];
    assign sum=a^b^c[3:0];
endmodule

shumaguan.v

module shumaguan(in,out);
	output[7:0] out;
	input[3:0] in;
	reg[7:0] out;
	always@(in)
		begin
		case(in)
		4'b0000: out=8'b00000011;
		4'b0001: out=8'b10011111;
		4'b0010: out=8'b00100101;
		4'b0011: out=8'b00001101;
		4'b0100: out=8'b10011001;
		4'b0101: out=8'b01001001;
		4'b0110: out=8'b01000001;
		4'b0111: out=8'b00011111;
		4'b1000: out=8'b00000001;
		4'b1001: out=8'b00001001;
		4'b1010: out=8'b00010001;
		4'b1011: out=8'b11000001;
		4'b1100: out=8'b01100011;
		4'b1101: out=8'b10000101;
		4'b1110: out=8'b01100001;
		4'b1111: out=8'b01110001;
		default: out=8'b0;
		endcase
		end
endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值