Guest User

Untitled

a guest
Oct 24th, 2017
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.55 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4.  
  5.  
  6.  
  7. entity divisor is
  8. generic
  9. (
  10. DATA_WIDTH : natural := 8;
  11. ADDR_WIDTH : natural := 3
  12. );
  13.  
  14. port (
  15. clk : in std_logic;
  16. reset : in std_logic;
  17. raddr : in natural range 0 to 2**ADDR_WIDTH - 1;
  18. waddr : in natural range 0 to 2**ADDR_WIDTH - 1;
  19. max : in std_logic_vector((DATA_WIDTH -1) downto 0);
  20. data : in std_logic_vector((DATA_WIDTH -1) downto 0);
  21. q : out std_logic_vector((DATA_WIDTH -1) downto 0)
  22.  
  23. );
  24.  
  25. end divisor;
  26.  
  27. architecture rtl of divisor is
  28.  
  29. -- Build a 2-D array type for the RAM
  30. subtype word_t is std_logic_vector((DATA_WIDTH-1) downto 0);
  31. type memory_t is array(natural range <>) of word_t;
  32.  
  33. -- Declare the RAM signal.
  34. signal ram, div : memory_t((2**ADDR_WIDTH)-1 downto 0);
  35.  
  36. -- Declare the n and max_reg signal.
  37. signal n,m,nb : std_logic_vector(((2*DATA_WIDTH)-1) downto 0);
  38. signal max_reg : std_logic_vector(((2*DATA_WIDTH)-1) downto 0);
  39.  
  40.  
  41. -- Build div_reg, ram_reg
  42. type memory_reg is array(natural range <>) of std_logic_vector(((2*DATA_WIDTH)-1) downto 0);
  43.  
  44. signal ram_reg: memory_reg((2**ADDR_WIDTH)-1 downto 0);
  45.  
  46. begin
  47. process(clk,reset)
  48. begin
  49. if (reset = '1') then
  50. ram(waddr) <= X"00";
  51. div(waddr) <= X"00";
  52. max_reg <= X"0000";
  53. ram_reg(waddr) <= X"0000";
  54. n <= X"0000";
  55. nb <= X"0000";
  56. m <= X"0000";
  57. elsif(rising_edge(clk)) then
  58. ram(waddr) <= data;
  59. max_reg((DATA_WIDTH -1) downto 0) <= max((DATA_WIDTH -1) downto 0);
  60. ram_reg(waddr)((DATA_WIDTH-1) downto 0) <= ram(waddr)((DATA_WIDTH-1) downto 0);
  61. nb <= std_logic_vector(unsigned(nb)+1);
  62. if (ram(waddr) = max)then
  63. div(waddr) <= std_logic_vector(unsigned(div(waddr))+1);
  64. elsif (ram(waddr) > max)then
  65. while (((unsigned(div(waddr))*unsigned(ram(waddr))) > unsigned(max)) or (unsigned(m) <(DATA_WIDTH -1))) loop
  66. div(waddr) <= std_logic_vector(unsigned(div(waddr))+1);
  67. max_reg <= std_logic_vector(unsigned(max_reg) - unsigned(ram_reg(waddr)));
  68. m <= std_logic_vector(unsigned(m)+1);
  69. end loop;
  70. m <= std_logic_vector(unsigned(m)-1);
  71. while (((unsigned(div(waddr))*unsigned(ram_reg(waddr))) < unsigned(max_reg)-1) or (unsigned(n) <(DATA_WIDTH)-unsigned(m))) loop
  72. ram_reg(waddr)(((2*DATA_WIDTH)-1) downto 1) <= ram_reg(waddr)(((2*DATA_WIDTH)-1) downto 0);
  73. n <= std_logic_vector(unsigned(n)+1);
  74. nb <= std_logic_vector(unsigned(nb)*2);
  75. end loop;
  76. ram_reg(waddr) <= std_logic_vector(unsigned(ram_reg(waddr)) - unsigned(max_reg));
  77. div(waddr) <= std_logic_vector(unsigned(div(waddr))+(1/(unsigned(nb))));
  78. else
  79. while (((unsigned(div(waddr))*unsigned(ram_reg(waddr))) < unsigned(max_reg)-1) or (unsigned(n)<(DATA_WIDTH-1))) loop
  80. ram_reg(waddr)(((2*DATA_WIDTH)-1) downto 1) <= ram_reg(waddr)(((2*DATA_WIDTH)-1) downto 0);
  81. ram_reg(waddr)(0) <= '0';
  82. n <= std_logic_vector(unsigned(n)+1);
  83. nb <= std_logic_vector(unsigned(nb)*2);
  84. end loop;
  85. ram_reg(waddr) <= std_logic_vector(unsigned(ram_reg(waddr)) - unsigned(max_reg));
  86. div(waddr) <= std_logic_vector(unsigned(div(waddr))+(1/(unsigned(nb))));
  87. end if;
  88. else null;
  89. end if;
  90.  
  91. end process;
  92.  
  93. q <= div(waddr);
  94.  
  95. end rtl;
Add Comment
Please, Sign In to add comment