OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5244|回复: 1

[ALTERA] 使用Quartus II 的浮点运算IP核,实现对一个未知二进制数除5

[复制链接]

4

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2016-11-1
在线时间
22 小时
发表于 2019-8-27 10:33:07 | 显示全部楼层 |阅读模式
附上代码,已经仿真验证,可以实现,请问还有其它更简单的方法吗?


--------------------------------------------------------
-- use Division  IP  core achieve /5
--------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity Division_ip is
port (
   Clk_i       :  in std_logic;
   Rst_i       :  in std_logic;
   DivisionA_i      :  in std_logic_vector(17 downto 0);
   DivisionC_o          : out std_logic_vector(17 downto 0)
);
end Division_ip;
architecture arch_Division_ip of Division_ip is
component M_Division port (
   clock       : IN  STD_LOGIC      ;
   dataa       : IN  STD_LOGIC_VECTOR (31 DOWNTO 0) ;
   datab       : IN  STD_LOGIC_VECTOR (31 DOWNTO 0) ;
   result       : OUT  STD_LOGIC_VECTOR (31 DOWNTO 0)
);
end component;

constant DivisionB_c     : std_logic_vector(31 downto 0) := b"0100_0000_1010_0000_0000_0000_0000_0000";
signal zero      : std_logic_vector(31 downto 0) := b"0000_0000_0000_0000_0000_0000_0000_0000";
shared variable  i     : integer range 0 to 17;
signal  j       : integer range 0 to 256;
signal Dataa_s      : std_logic_vector(31 downto 0);
signal DivisionA_s     : bit_vector(17 downto 0);
signal  DivisionD_s     : bit_vector(31 downto 0);
signal DivisionC_s     : std_logic_vector(23 downto 0);
signal result_s     : std_logic_vector(31 downto 0);

begin
DivisionA_s <= to_bitvector(DivisionA_i);

process (Rst_i, Clk_i) begin
   IF (Rst_i = '0') then
    i := 17;
    Dataa_s <= (others => '0');
   elsif rising_edge (Clk_i) then
    if (DivisionA_i(i) = '1') then
     Dataa_s(22 downto 5 ) <=to_stdlogicvector( DivisionA_s SLL (18-i));
     Dataa_s(30 downto 23) <= conv_std_logic_vector(i+127,8);
    else
     i := i - 1;
    end if;
   end if;
end process;

process (Rst_i, Clk_i) begin
   if (Rst_i = '0') then
    DivisionC_s <= (others => '0');
   elsif rising_edge (Clk_i) then
    DivisionC_s <= to_stdlogicvector( ('1' & DivisionD_s(22 downto 0)) SRL (150 - j));
   end if;
end process;

j <= conv_integer(result_s(30 downto 23));
DivisionD_s <= to_bitvector(result_s);

U_M_Division_0 : M_Division port map (
   clock       => Clk_i        ,
   dataa       => Dataa_s        ,
   datab       => DivisionB_c       ,
   result       => result_s
);

DivisionC_o <= DivisionC_s(17 downto 0);

end arch_Division_ip;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2016-11-1
在线时间
22 小时
 楼主| 发表于 2019-8-27 15:46:28 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 08:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表