6494|5

55

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

fpga除法器的一些算法问题 [复制链接]

               学习fpga有一段时间的朋友们,你们有没有比较好的除法器的设计思想,目前我的思想进局限于移位—>比较—>减法这种思想,希望有好的想法的朋友介绍一下,比如是速度快,或者使用资源少之类的一些算法。目前正在做等精度频率计除法模块,用quartus中自带的除法器时,当输入被除数为28位,除数为16位时,就消耗了780多个逻辑元件了。
此帖出自FPGA/CPLD论坛

最新回复

上面是我写的原码一位除法,是加减交替除法  详情 回复 发表于 2014-3-27 10:31
点赞 关注
 

回复
举报

5979

帖子

8

TA的资源

版主

沙发
 
整体思路问题不大,可以实现
此帖出自FPGA/CPLD论坛
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复

55

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
本帖最后由 xuhongming 于 2014-3-26 20:32 编辑

谢谢版主的回复,不应该仅仅只追求实现吧,消耗的硬件资源和速度这些都需要考虑的吧,在网上又找到一个新的思路,加减交替,不知版主是否能具体介绍几个算法,研究研究,谢谢了
此帖出自FPGA/CPLD论坛
 
 
 

回复

109

帖子

0

TA的资源

一粒金砂(中级)

4
 

  1. --this is an add-subtraction alternate divider of the original code
  2. --output fraction
  3. --e.g. X=1.1001(-0.5625/-9),Y=0.1011(0.6875/11),Q=1.1101(-0.8125),F=(0.0078125),the MSB is sign bit;
  4. -- X must less than Y;
  5. library ieee;
  6. use ieee.std_logic_1164.all;
  7. use ieee.std_logic_unsigned.all;

  8. entity serial_divider is
  9. generic (
  10.                 x_bitwidth        : integer := 5;        --dividend bit width
  11.                 y_bitwidth        : integer := 5;        --divisor bit width       
  12.                 q_bitwidth        : integer := 5        --quotient bit width
  13.                 );
  14.         port(
  15.                 n_rst,clk,en: in std_logic;
  16.                 X                        : in std_logic_vector(x_bitwidth-1 downto 0);--input dividend
  17.                 Y                        : in std_logic_vector(y_bitwidth-1 downto 0);--input divisor               
  18.                 quotient        : out std_logic_vector(q_bitwidth-1 downto 0)               
  19.                 --X,Y,quotient,fraction are original codes
  20.                 );
  21. end serial_divider;

  22. architecture rtl of serial_divider is

  23. type m_state is(
  24.                                 idle,
  25.                                 clear,                --clear all registers                               
  26.                                 is_ov,                --judge whether division overflows;
  27.                                 comput,                --comput division
  28.                                 finish                --output quotient,fraction,ov flag bit
  29.                                 );
  30. signal cs,ns: m_state;

  31. signal clr,load,comput_en,comput_over,oe : std_logic;
  32. signal is_ov_en                : std_logic;

  33. signal reg_x                 : std_logic_vector(x_bitwidth-2 downto 0);
  34. signal reg_y                : std_logic_vector(y_bitwidth-2 downto 0);
  35. signal reg_yc                : std_logic_vector(y_bitwidth-1 downto 0);
  36. signal q_MSB                : std_logic;

  37. signal bit_cnt                 : integer range 0 to q_bitwidth-1;

  38. signal remain                : std_logic_vector(x_bitwidth-1 downto 0);
  39. signal result_tmp        : std_logic_vector(q_bitwidth-1 downto 0);

  40. begin

  41. --three segments FSM
  42. --timing sequence part of FSM
  43.         process(clk,n_rst,en)
  44.         begin
  45.         if(n_rst='0')then
  46.                 cs<=idle;
  47.         elsif(clk'event and clk='1')then
  48.                 if(en='1')then
  49.                         cs<=ns;
  50.                 end if;
  51.         end if;
  52.         end process;
  53. --combination part of FSM
  54.         process(cs,comput_over)
  55.         begin
  56.         case (cs) is
  57.                 when idle                =>        ns<=clear;               
  58.                 when clear                =>        ns<=is_ov;               
  59.                 when is_ov                =>        ns<=comput;                                                                               
  60.                 when comput                =>         if(comput_over='1')then
  61.                                                                 ns<=finish;
  62.                                                         else
  63.                                                                 ns<=comput;
  64.                                                         end if;
  65.                 when finish                =>        ns<=idle;
  66.                 when others                =>        ns<=idle;
  67.         end case;
  68.         end process;
  69. --register output part of FSM
  70.         process(clk)
  71.         begin
  72.         if(clk'event and clk='1')then
  73.                 case (ns) is
  74.                         when idle        =>clr<='0';load<='0';comput_en<='0';is_ov_en<='0';oe<='0';       
  75.                         when clear        =>clr<='1';load<='1';comput_en<='0';is_ov_en<='0';oe<='0';                       
  76.                         when is_ov        =>clr<='0';load<='0';comput_en<='0';is_ov_en<='1';oe<='0';
  77.                         when comput        =>clr<='0';load<='0';comput_en<='1';is_ov_en<='0';oe<='0';
  78.                         when finish =>clr<='0';load<='0';comput_en<='0';is_ov_en<='0';oe<='1';
  79.                         when others        =>clr<='0';load<='0';comput_en<='0';is_ov_en<='0';oe<='0';
  80.                 end case;
  81.         end if;
  82.         end process;

  83. --count times of computing
  84.         process(clk)
  85.         begin
  86.         if(clk'event and clk='1')then
  87.                 if(clr='1')then
  88.                         bit_cnt <= 0;
  89.                 elsif(comput_en='1')then
  90.                         if(bit_cnt=q_bitwidth-1)then
  91.                                 comput_over <= '1';
  92.                                 bit_cnt         <= 0;
  93.                         else
  94.                                 comput_over <= '0';
  95.                                 bit_cnt         <= bit_cnt + 1;
  96.                         end if;
  97.                 else
  98.                         comput_over <= '0';
  99.                         bit_cnt         <= 0;
  100.                 end if;
  101.         end if;
  102.         end process;
  103.        
  104. --judge quotient sign bit
  105.         process(clk)
  106.         begin
  107.         if(clk'event and clk='1')then
  108.                 if(load='1')then
  109.                         q_MSB  <= X(x_bitwidth-1) xor Y(y_bitwidth-1);
  110.                         reg_x  <= X(x_bitwidth-2 downto 0);
  111.                         reg_y  <= Y(y_bitwidth-2 downto 0);
  112.                         reg_yc <= not ('0' & Y(y_bitwidth-2 downto 0)) + 1;       
  113.                 end if;
  114.         end if;
  115.         end process;

  116.         process(clk)
  117.         begin
  118.         if(clk'event and clk='1')then
  119.                 if(clr='1')then
  120.                         remain                <= (others=>'0');
  121.                         result_tmp        <= (others=>'0');
  122.                 elsif(is_ov_en='1' and comput_en='0')then
  123.                         remain        <= reg_x + reg_yc;
  124.                 elsif(is_ov_en='0' and comput_en='1')then
  125.                         if(remain(x_bitwidth-1)='1')then
  126.                                 remain                 <= (remain(x_bitwidth-2 downto 0) & '0') + reg_y;
  127.                                 result_tmp         <= result_tmp(q_bitwidth-2 downto 0) & '0';
  128.                         else
  129.                                 remain                 <= (remain(x_bitwidth-2 downto 0) & '0') + reg_yc;
  130.                                 result_tmp         <= result_tmp(q_bitwidth-2 downto 0) & '1';
  131.                         end if;
  132.                 end if;
  133.         end if;
  134.         end process;
  135.        
  136. --output quotient,faction,ov flag bit
  137.         process(n_rst,clk)
  138.         begin
  139.         if(n_rst='0')then
  140.                 quotient <= (others=>'0');                       
  141.         elsif(clk'event and clk='1')then
  142.                 if(oe='1')then
  143.                         quotient <= q_MSB & result_tmp(q_bitwidth-1 downto 1);       
  144.                 end if;
  145.         end if;
  146.         end process;

  147. end rtl;
复制代码
此帖出自FPGA/CPLD论坛
 
 
 

回复

109

帖子

0

TA的资源

一粒金砂(中级)

5
 
上面是我写的原码一位除法,是加减交替除法
此帖出自FPGA/CPLD论坛

点评

谢谢回复,但目前是在用verilog学习fpga,VHDL还不太懂,但还是谢谢你的热心帮助  详情 回复 发表于 2014-3-28 10:52
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(中级)

6
 
k331922164 发表于 2014-3-27 10:31
上面是我写的原码一位除法,是加减交替除法

谢谢回复,但目前是在用verilog学习fpga,VHDL还不太懂,但还是谢谢你的热心帮助
此帖出自FPGA/CPLD论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表