文档库 最新最全的文档下载
当前位置:文档库 › 用VHDL语言实现浮点数运算

用VHDL语言实现浮点数运算

用VHDL语言实现浮点数运算
用VHDL语言实现浮点数运算

用VHDL语言实现浮点数运算

随着CPLD和FPGA的出现以及EDA技术的成熟,采用CPLD/FPGA实现数字信号处理的方法已经显示出巨大的潜力。由于CPLD/FPGA器件具备在线可编程能力,克服了专用处理器灵活性方面的不足,同时兼备了高速和低成本的优点,使CPLD /FPGA在数字信号处理领域得到广泛应用。近年来,高密度可编程器件CPLD/FPGA的集成度、速度不断提高,设计手段更加完善。

1、浮点数加/减法器的设计

整个浮点数加减法器简化为:对阶、尾数运算、规格化3部分。

(1)对阶

使两个数据的阶码相等,这时才能进行尾数的加减运算.在对阶操作时,总是使小阶向大阶对齐.实现的方法是,将原来阶码小的数的尾数部分右移,并相应地增加其阶码.传统的做法是将原来阶码小的数的尾数部分右移1位,其加1,直至阶码相等.如图1所示

在进行对阶操作时,首先比较 Ea、Eb的大小,产生换路指示位:若 Ea>Eb 则换路有效,否则换路无效;同时输出大阶E:若 Ea>Eb,则E≤Ea,否则E≤Eb;阶差:△E=|Ea-Eb|,用于控制可变步长移位器的移位步长.对于原码表示的尾

数,移位时尾数高位补零.可变步长移位器是对阶器的核心部件,用VHDL描述如下:

ENTTTY MOVE IS P0RT(

INPUT: IN STD—LOGIC— VECTOR(3 DOWNTD 0);

COUNT: IN INTEGER RANGE 0 TO 3;

OUTP: OUT STD—LOGIC— VECTOR(3 DOWNTO 0));

END MOVE;

ARCHITECTURE MUX—ARC OF MOVE IS

BEGIN

OUTPUT:PROCESS(INPUT,COUNT)

BEGIN

CASE COUNT IS

WHEN 0~OUTP(3 DOWNT 0)~INPUT(3 DOWNTO 0);

WHEN l~ OUTP(3 DOWNTO 0) ~ “0”&INPUT(3 DOWNTO 1);

WHEN 2~ OUTP(3 DOWNTO 0) ~ “00”&INPUT(3 DOWNTO 2);

WHEN 3~OUTP(3 DO 0) ~ “000”&INPUT(3);

END CASE;

END PROCESS;

END MUX—ARC;

(2)尾数运算

完成尾数即完成尾数的加减运算。原码表示的二进制数格式与VHDL语言中的UNSIGNED数据格式是一样的,因此尾数加减法可以利用VHDL语言提供的UNSIGNED 数的加减完成原码带符号数减法的规则是:若A—F的绝对值大于或等于B—F的绝对值,则差的绝对值为A

—F—B—F,差的符号与A同;否则,差的绝对值为B—F—A—F,差的符号与A相反.下面列出程序清单。

加法A_F+B_F:

ENTTY FADD IS PORT(

A_F,B_F:IN UNSIGNED(3 DOWNTO 0);

S:IN STD—LOGIC;

FSUM:OUT STD—L0GIC—VECTOR(5 DOWNTO 0));

END FADD ;

ARCHITECTURE ARC OF FADD IS

BEGIN

FSUM(4 downto O)~ A—F+B—F;

FSUM(5)~S;

END ARC;

其中,FSUM 多留一位为尾数和的符号位,一位保存加法的进位.A—F、B—F表示浮点数A、B的尾数,S表示A的符号位,若两数的符号相反,它们相加实质是相减,相减实质是相加.

减法A—F—B—F:

ENTTTY FSUB IS PORT(

S:IN STD—LOGIC;

A_F,B_F:IN UNSIGNED(3 DOWNTO 0);

SUB—OUT:OUT UNSIGNE D(4 DOWNTO 0));

END FSUB;

ARCHITECTURE ARC OF FSUB IS

SIGNAL A,B:UNSIGNED(3 DOWNTO 0);

BEGIN

ACT:PROCESS(S,A_F,B_F)

BEGIN

IF A_F < B_F THEN

A~B_F; B~A_F;

ElSE A~A—F; B~B—F;

END IF;

SUB—OUT (3 DOWNTO O)~A—B;

SUB—OUT(4)~NOT S;

SUB—OUT (4)~ S;

END PROCESS;

END ARC;

(3)规格化

对于基数为2的浮点数,规格化数是指尾数绝对值大于或等于O.5的纯小数,当用原码表示时,即是尾数的最高为‘1’.在减法运算时,可能会使结果小于O.5,要通过尾数左移以实现规格化(称向左规格化);在加法运算时,可能结果会大于1,此时要通过尾数右移以实现规格化(称向右规格化).传统的操作规则是:尾数移动一位,阶码相应3n/减1,直至数据规格化.和对阶器一样,本文规格化器同样用可变步长移位器实现,操作规格是:先求出移位步数,用可变步长移位器对尾数移位,阶码相应加减移位步数.

(4) 浮点数加/减法器综合

图2中,Sa、Sb。浮点数A、B 的符号位:Ma、Mb。浮点数A、B的尾数;Ea、Eb。浮点数A、B 的阶码;Ma’、Mb’:对阶后的浮点数A、B的尾数;

2、浮点数乘法器的设计

(1)尾数相乘

VHDL支持乘法运算,一个简单的4×4输出8位的乘法器描述如下:

Entity MULT is PORT(

A.B:in uNSIGNED(3 downto 0);

MUL:out UNSIGNED(7 downto 0));

End MULT;

Architecture arc of MULT is

Begin

MUL~ A *B;

End arc;

(2)阶码相加

阶码是用补码表示的,格式与VHDL中的SIGNED类型一样,用VHDL的SIGNED类型加法

完成阶码相加比较简单.

(3)规格化

尾数相乘,其积的绝对值可能会小于0.5,所以要进行向左规格化.规则是:若高位为‘0’,表明绝对值小于0.5,尾数向左移1位,阶码加1.同时为减少资源占用,舍去尾数低位,使得输出结果也是8位的浮点数.

(4)浮点乘法器的综合

用VHDL的Component(部件)结构或电路顶层图描述把各个部件组合完成浮点乘法器的设计,然后用MaxPlusII编译、下载到硬件芯

片中.浮点乘法器结构如图3所示.

3、结果分析与讨论

结果表明:我们用VHDL语言在CPLD/FPGA上成功地实现了浮点数运算.但当结果的绝对值大于8就会产生上溢出错误;与加减法一样,乘法也存在溢出的问题。这是因为浮点数据位数少,舍入误差较大

解决的方法是增加浮点数据位数.

实验一 用VHDL语言设计组合逻辑电路

实验一用VHDL语言设计组合逻辑电路 一、实验目的:掌握用VHDL语言设计组合逻辑电路的方法。熟悉QuartusⅡ的 操作。 二、实验仪器:PC机一台 三、实验内容: 1.用VHDL语言设计4选1数据选择器。 2.用文本输入法输入 3.建立工程,编译,改错,直至编译通过 4.仿真,验证所设计电路的正确性 四、操作步骤: 1、在所使用的计算机数据盘里建立自己的文件夹 2、打开QuartusII 3、单击工具栏中的new,在出现的对话框中选择VHDL File,点击OK。 4、输入设计程序。 输入结束后,将程序保存在自己的文件夹中。注意:存盘的文件名应该跟实体名相同。 5、创建工程。创建工程有两种方法:第一种方法是在保存文件后出现的对话框 中点击‘是’,按提 示进行操作;

第二种方法是在出现的对话框点击‘否’。 第一种方法的具体过程: 点击‘是’,出项下面的框 点击‘Next’,出项 不需要任何修改,继续点击‘Next’,出项

继续点击‘Next’,在后面出现的框图中继续点击‘Next’,直到没有‘Next’选项,点击‘Finish’,这样就完成工程的创建。 第二种方法的具体过程:点击‘否’ 此时要创建工程,点击菜单File下的“New Preject Wizard”。出现框图: 点击‘Next’,出项

名,点击打开(或双击要创建工程的文件名),出现 项目名称和文件名称相同。点击‘Next’,出现

点击,在出现的对话框点击文件名,点击‘打开’,出现 点击右边的‘add’,出现

点击‘Next’,在后面出现的框图中继续点击‘Next’,直到没有‘Next’选项,点击‘Finish’,这样就完成工程的创建。 6、观察QUARTUS 界面 点击箭头所指图标,观察箭头上方的变化,点击+号,双击出项的文件

门电路VHDL语言

“非”门 library ieee; use ieee.std_logic_1164.all; entity not1 is port(a:in std_logic; b:out std_logic); end entity not1; architecture behav of not1 is begin b<=not a; end architecture behav; “与”门 library ieee; use ieee.std_logic_1164.all; entity and2 is port(a,b:in std_logic; c:out std_logic); end entity and2; architecture behav of and2 is begin c<=a and b; end architecture behav; “与非”门 library ieee; use ieee.std_logic_1164.all; entity nand2 is port(a,b:in std_logic; c:out std_logic); end entity nand2; architecture behav of nand2 is begin c<=not(a and b); end architecture behav; “或非”门 library ieee; use ieee.std_logic_1164.all; entity nor2 is port(a,b:in std_logic; c:out std_logic); end entity nor2; architecture one of nor2 is begin c<=not(a or b); end architecture one; “异或非”门 library ieee; use ieee.std_logic_1164.all; entity xor2 is port(a,b:in std_logic; c:out std_logic); end entity xor2; architecture one of xor2 is Begin c<=not( ( (not a)and b)or(a and(not b) ) ); end architecture one; D触发器 library ieee; use ieee.std_logic_1164.all; entity dffa is port(D,clk,clr:in std_logic; Q:out std_logic); end entity dffa; architecture behave of dffa is begin process(clk,D,clr) begin if clr='1' then Q<='0'; Elsif clk'event and clk='1' then Q<=D; end if; end process; end architecture behave; T触发器 library ieee; use ieee.std_logic_1164.all; entity tffa is port(T,clk,clr: in std_logic; Q: buffer std_logic); end entity tffa; architecture behave of tffa is begin process(clk,T,clr) begin if clk'event and clk='1'then if clr='1' then Q<='0'; Elsif t='1'then Q<=not Q; else Q<=Q; End if; end if; end process; end architecture behave; JK触发器 library ieee; use ieee.std_logic_1164.all; entity jk is port(J,K,clk, in std_logic; Q: buffer std_logic); end entity tffa; architecture behave of jk is begin process(clk,J,K) begin if clk'event and clk='1'then Q<=( (J and(not Q) )or( (not K)and Q) ); end if; end process; end architecture behave;

vhdl语言编写的门电路

ENTITY AND2A IS PORT (A,B:IN BIT; C:OUT BIT); END ENTITY AND2A; ARCHITECTURE EX1 OF AND2A IS BEGIN C<=A AND B; END ARCHITECTURE EX1; 用VHDL设计一个具有高电平使能端的三态非门LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY trigate IS PORT( A, EN: IN STD_LOGIC; Y: OUT STD_LOGIC ); END trigate; ARCHITECTURE a OF trigate IS BEGIN PROCESS( A, EN) BEGIN IF EN ='0' THEN Y<= 'Z'; ELSE Y<= A; END IF; END PROCESS; END a;

entity nand3a is port (A,B,C:in bit; Y:out bit); end entity nand3a; architecture text2 of nand3a is begin Y<=not (A and B and C ); end architecture text2; 用VHDL设计电路 entity b3 is Port (A, B,Ci: in bit; S,Co:out bit); end entity b3; architecture text2 of b3 is begin S<= A xor B xor Ci ; Co<=( A and B) or (Ci and (A xor B )); end architecture text2;

EDA中VHDL基本逻辑电路设计

第三章基本逻辑电路设计 3.1 组合逻辑电路设计 一、简单门电路设计 例:3输入“与非”门电路 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY nand3 IS PORT(a,b,c:IN STD_LOGIC; y:OUT STD_LOGIC); END nand3; ARCHITECTURE nand3_1 OF nand3 IS BEGIN y<=NOT(a AND b AND c); END nand3_1; LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY nand3 IS PORT(a,b,c:IN STD_LOGIC; y:OUT STD_LOGIC); END nand3; ARCHITECTURE nand3_2 OF nand3 IS BEGIN t4:PROCESS(a,b,c) VARIABLE comb:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN comb:= a & b & c; CASE comb IS WHEN “000” =>y<=‘1’; WHEN “001” =>y<=‘1’; WHEN “010” =>y<=‘1’; WHEN “011” =>y<=‘1’; WHEN “100” =>y<=‘1’; WHEN “101” =>y<=‘1’; WHEN “110” =>y<=‘1’; WHEN “111” =>y<=‘0’; WHEN OTHERS=>y<=‘X’; END CASE; END PROCESS; END nand3_2; 二、编码器、译码器、选择器 例:地址译码器 假设一个微处理器存储空间为从0000H到FFFFH, 将其分成5部分,它们的地址分配如下: 0000H—DFFFH为动态随机存储器DRAM使用;E000H—E7FFH为I/O设备使用; E800H---EFFFH备用; F000H—F7FFH为第一个只读存储器ROM1使用;F800H—FFFFH为第二个只读存储器ROM2使用;其中选通控制信号DRAM1,IO,ROM1,ROM2均为低电平有效。 例:地址全译码 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ad_decoder IS PORT( address : IN STD_LOGIC_VECTOR(15 downto 0); DRAM1,IO,ROM1,ROM2 : OUT STD_LOGIC); END ad_decoder ; ARCHITECTURE a OF ad_decoder IS BEGIN PROCESS(address) BEGIN IF address<=x”dfff” THEN DRAM<=‘0’; IO<=‘1’; ROM1<=‘1’; ROM2<=‘1’; ELSIF address>=x”e000” AND address<=x”e7ff” THEN DRAM<=‘1’; IO<=‘0’; ROM1<=‘1’; ROM2<=‘1’; ELSIF address>=x”f000” AND address<=x”f7ff” THEN DRAM<=‘1’; IO<=‘1’; ROM1<=‘0’; ROM2<=‘1’; ELSIF address>=x”f800” THEN DRAM<=‘1’; I/O<=‘1’; ROM1<=‘1’; ROM2<=‘0’; END IF; End PROCESS; END a;

七人表决器-VHDL语言编写代码

------------------------------------- -- Title: 七人表决器-- -- Author:Pan hongtao -- -- Data: 2006-10-1 -- ---------------------------------------- library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; -------------------------------------------------------------------- entity exp12 is port( k1,K2,K3,K4,K5,K6,K7 : in std_logic; --输入:7个人 ledag : out std_logic_vector(6 downto 0); --数码管显示 m_Result : out std_logic --表决结果 ); end exp12; -------------------------------------------------------------------- architecture behave of exp12 is signal K_Num : std_logic_vector(2 downto 0); signal K1_Num,K2_Num: std_logic_vector(2 downto 0); signal K3_Num,K4_Num: std_logic_vector(2 downto 0); signal K5_Num,K6_Num: std_logic_vector(2 downto 0); signal K7_Num : std_logic_vector(2 downto 0); begin process(K1,K2,K3,K4,K5,K6,K7) --计算表决同意人数 begin K1_Num<='0'&'0'&K1; K2_Num<='0'&'0'&K2; K3_Num<='0'&'0'&K3; K4_Num<='0'&'0'&K4; K5_Num<='0'&'0'&K5; K6_Num<='0'&'0'&K6; K7_Num<='0'&'0'&K7; end process; process(K1_Num,K2_Num,K3_Num,K4_Num,K5_Num,K6_Num,K7_Num) begin K_Num<=K1_Num+K2_Num+K3_Num+K4_Num+K5_Num+K6_Num+K7_Num; end process; process(K_Num) --根据人数输出结果 begin

VHDL语言编写规范

VHDL语言编写规范 目录 目录 (1) 1 目的 (2) 2 范围 (2) 3 定义 (2) 4 规范内容:VHDL编码风格 (2) 4.1 标识符(Identifiers)命名习惯 (2) 4.2 数据对象和类型 (4) 4.3 信号和变量 (5) 4.4 实体 (5) 4.5 语句 (7) 4.6 运算符(Operator) (10) 4.7 function (10) 4.8 procedure (11) 4.9 类属( generics) (11) 4.10 package (12) 4.11 FSM(有限状态机) (12) 4.12 Comments (12) 4.13 TAB键间隔 (12) 4.14 语句书写规范规定 (13) 5 程序中的注释 (13) 6 代码模块划分 (14) 7 代码编写中容易出现的问题 (15) 7.1 资源共享问题 (15) 7.2 组合逻辑描述的多种方式 (15) 7.3 考虑综合的执行时间 (16) 7.4 避免使用Latch (16) 7.5 多赋值语句案例:三态总线 (16) 附录一VHDL保留字 (18) 附录二函数书写实例 (19) 附录三参数化元件实例 (20) 附录四程序包书写实例 (21)

1 目的 编写该规范的目的是提高书写VHDL代码的可读性、可修改性、可重用性;优化代码综合和仿真结果,指导设计工程师使用VHDL 规范代码和优化电路,规范化公司的ASIC/FPGA 设计输入,从而做到: a、逻辑功能正确; b、可快速仿真; c、综合结果最优; d、可读性最好。 2 范围 该规范设计VHDL编码风格、规定,编码中应注意的问题,VHDL代码书写范例等,适用于所有的采用VHDL代码进行设计的项目。 3 定义 VHDL:Very high speed IC Hardware Description Language,甚高速集成电路的硬件描述语言。 FSM:Finite Status Machine,有限状态机 Simulate:仿真,通过输入激励在计算机上验证设计是否正确。包括RTL仿真和门级仿真。 模拟:是指对一个物理器件的结构、功能或其他特性如延时特性等用抽象的语言或高级语言(如用C语言进行算法描述)所进行的建模。 4 规范内容:VHDL编码风格 设计必须文档化。要将设计思路,详细实现等写入文档,然后经过严格评审通过后才能进行下一步的工作。这样做乍看起来很花时间,但是从整个项目过程来看,绝对要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态,便于对程序代码的修改、学习。 本文中提到的VHDL编码规则和建议适用于VHDL的任何一级(RTL,behavioral,gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。 4.1 标识符(Identifiers)命名习惯 标识符用于定义实体名、结构体名、信号和变量名等,选择有意义的命名对设计是十分重要的。命名包含信号或变量诸如出处、有效状态等基本含义,下面给出一些命名的规则,包括VHDL语言的保留字。 1. 标识符定义命名规定

数字电路设计实验vhdl语言实验报告

实验一秒表计数器的设计 一、实验目的: 本实验通过设计四种频率可选的数字时钟系统,以达到熟悉VHDL 语言编程语法、设计思路和熟练掌握Quartus II 开发软件的目的。 二、实验内容: 该数字时钟的显示格式如下所示:HH:MM:SS,其中HH表示时计数的两位,MM表示分计数的两位,SS表示秒计数的两位。本系统输入信号分别为复位信号rst(高有效)、sel(两位信号,分别可以选择2分频、4分频8分频和16分频)、clk_in(时钟信号)、8位时输出、8位分输出、8位秒输出(其中高4为表示对应的高半字节、低4位表示的低半字节,譬如当时间为08:59:30时,时输出为”0000_1000”,分输出为”0101_1001”,秒输出为”0011_0000”)。该时钟系统可以通过Sel信号时钟运行的快慢。 三、实验流程: 通过对实验内容的分析:可以考虑时钟系统的可由三部分组成:1、分频器: 分频器为时序电路并且通过《数字电路》理论课程的学习可知由计数器来实现,同学可以回想一下实验1中是如何实现计数器电路的设计),该模块主要产生2、4、8、16分频的时钟信号; 2、多路选择器: 在VHDL中多路选择器为组合逻辑,可以有多种实现方法,在这里主要选用了case语句来实现。该模块的作用是从分频器中根据Sel

信号选择适当的时钟信号; 3、时钟控制器: 该模块比较复杂,主要实现功能是实现一个24小时的计时。当时间为00:00:59的时候下一个时钟到来时状态的跳变为00:01:00,计时中多数计数为加1操作,有几个特殊状态需要重点考虑:当时间产生分进数时,譬如上例。当时间产生时进数时,譬如00:01:59时刻的下一个状态为00:02:00;当时间产生时进数时,譬如00:59:59是个的下一个状态为01:00:00。当时间产生天进数时,譬如23:59:59的下一个状态为00:00:00。 四、仿真要求: 本次试验的结果全部采用功能仿真分析: 1、在结果图中能够看到让复位信号rst为有效的情况下,所有的输出为00:00:00; 2、当频率选择输出分别为”00”、”01”、”10”、”11”时秒为的进数分别包含2、4、8、16倍clk_in的时钟周期; 3、可以看到完整的计时周期00:00:00->23:59:59->00:00:00。 五、实验代码: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;

相关文档