基于VHDL逐级进位加法器程序设计

基于VHDL逐级进位加法器程序设计

实验目的

(1) 掌握逐级进位加法器逻辑功能及使用方法。

(2) 学会用VHDL语言设计逐级进位加法器。

实验原理

逐级进位加法器:如下图所示:为一个无符号的逐级进位加法器,对每一位都使用全加器FAU,同时给出全加器真值表,真值表中的a和b是输入位,s是求和的结果,cout是进位输出位,当输入位有奇数个‘1’时,s必定是‘1’,而当有两个或者更多的输入为‘1’时,cout必定是‘1’。图中每个全加器的输出结果依赖于前一级产生的进位。这种方法可以占用最少量的电路资源,但完成一次计算所需的延时显然较大。
逐级进位加法器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-joAV7mmo-1588671390917)(G:\研究生\FPGA课程\笔记文档\rec\QQ截图20200505170247.png)]
全加器真值表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GDzOcaBk-1588671390920)(G:\研究生\FPGA课程\笔记文档\rec\QQ截图20200505170306.png)]基于全加器的真值表,可以写出如下的逻辑表达式:
s = a XOR b XOR cin
cout = (a AND b) OR (a AND cin) OR (b AND cin)

实验内容

(1) 用VHDL编写级进位加法器源程序。

(2) 将源程序进行综合、优化及功能仿真。

(3)软件说明:ModelSimSetup-13.1.0.162,QuartusSetup-13.1.0.162。

建立工程:

第一步:打开Quartus软件。

第二步:点击New Project Wizard -> next.

第三步:选择工程文件的存放位置,输入工程名 -> next -> next。

第四步:在family栏选择芯片型号-Cyclone IV E,在Name栏选择EP4CE115F29C7,选择完之后点击next。(如果不进行硬件调试时,此处默认即可)

第五步:检查工程有没有建错,点击完成。如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pJ1MKPE4-1588671390923)(G:\研究生\FPGA课程\笔记文档\rec\20161122122950778.png)]

程序设计:

逐级进位加法器顶层文件设计:

--文件名:adder_cripple.vhd 应与工程名保持一致:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity adder_cripple is
	generic(n:integer:=4);
	port(a,b:in std_logic_vector(n-1 downto 0);
		cin: in std_logic;
		s:out std_logic_vector(n-1 downto 0);
		cout: out std_logic
	);
end adder_cripple;

architecture Behavioral of adder_cripple is
begin
	process(a,b,cin)
	variable c:std_logic_vector(n downto 0);
	begin
		 c(0):= cin;  --这里的c是信号
		 for i in 0 to n-1 LOOP
		 s(i)<= a(i) xor b(i) xor c(i);
		 c(i+1) := (a(i) and b(i)) or 
					  (a(i) and c(i)) or 
					  (b(i) and c(i));
			end LOOP;
		 cout <= c(n);
	end process;
end Behavioral;

文件仿真(这里采用modelsim仿真波形):

  1. 选择File-> New -> Verification/Debugging Files ->University Program VWF。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UHmGtcO4-1588671390928)(G:\研究生\FPGA课程\笔记文档\rec\QQ截图20200423165155.png)]
    2.打开测试文件。(右键点击添加端口,对输入信号初始化,赋值。)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5rIaeIhO-1588671390931)(G:\研究生\FPGA课程\笔记文档\rec\QQ截图20200505172729.png)]
    3.仿真结果:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kjcFRNw6-1588671390933)(G:\研究生\FPGA课程\笔记文档\rec\QQ截图20200505172859.png)]
逻辑电路图:

显示编译成功后,选择菜单栏 Tools –>Netlist Viewers  –>RTL Viewer 显示逻辑电路图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Swv9E7kL-1588671390934)(G:\研究生\FPGA课程\笔记文档\rec\QQ截图20200505173051.png)]

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会尽力回答您的问题。 首先,进位选择加法器(Carry Select Adder)是一种常用于高速加法的电路。而 VHDL(VHSIC Hardware Description Language)是一种硬件描述语言,用于描述数字电路和系统。 关于平方根,一般可以采用牛顿迭代法或二分法等算法实现。在这里,我们可以使用牛顿迭代法来实现。 具体而言,我们可以先利用加法器实现一个平方操作,然后再使用牛顿迭代法来逐步逼近平方根。 以下是一个简单的 VHDL 代码实现: ```vhdl entity sqrt is port ( clk : in std_logic; rst : in std_logic; x : in std_logic_vector(7 downto 0); y : out std_logic_vector(7 downto 0) ); end entity; architecture rtl of sqrt is signal x_reg, y_reg, y_next : std_logic_vector(7 downto 0); signal adder_out : std_logic_vector(8 downto 0); signal cnt : integer range 0 to 7 := 0; begin process (clk, rst) begin if rst = '1' then x_reg <= (others => '0'); y_reg <= (others => '0'); y_next <= (others => '0'); cnt <= 0; elsif rising_edge(clk) then x_reg <= x; y_reg <= y_next; if cnt = 7 then y <= y_next; end if; if cnt = 0 then adder_out <= std_logic_vector(unsigned(x_reg) * unsigned(x_reg)); else adder_out <= std_logic_vector(unsigned(y_reg) * 2); end if; y_next(cnt) <= adder_out(cnt+1); if cnt < 7 then cnt <= cnt + 1; end if; end if; end process; end architecture; ``` 在这个实现中,我们使用了一个计数器 `cnt` 来控制迭代次数,同时使用两个寄存器 `x_reg` 和 `y_reg` 来存储输入和输出值。每次迭代时,我们先使用加法器计算输入值的平方,然后将输出值乘以 2,并取其高 8 位作为下一次迭代的输入值。 需要注意的是,这个实现中使用的加法器是一个简单的 8 位加法器,可能无法满足高速、高精度加法的需求。如果需要更高的性能,可以考虑使用更为复杂的加法器结构,例如进位预测加法器(Carry Lookahead Adder)或 Kogge-Stone 加法器等。 希望这个回答能够帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泸州月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值