OpenCores
URL https://opencores.org/ocsvn/jart/jart/trunk

Subversion Repositories jart

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 67 to Rev 68
    Reverse comparison

Rev 67 → Rev 68

/jart/branches/ver0branch/sqrt.vhd
0,0 → 1,150
 
-- A 1 clock x 4 stage pipe square root.
 
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use work.powerGrid.all;
 
entity sqrt is
 
generic (
W2 : integer := 64
);
port
(
clk,rst,ena : in std_logic;
radical : in std_logic_vector (W2-1 downto 0);
sho : out std_logic;
a,b,x,y : out std_logic_vector ((W2/2)-1 downto 0);
decoder : out integer range 0 to (W2/2)-1
);
end entity;
 
 
architecture rtl of sqrt is
constant WP : integer:= W2/2;
constant WP_2 : integer:= WP/2;
 
signal sa0,sb0,sx0,sy0,sb0_1 : std_logic_vector (WP-1 downto 0);
signal sa1,sb1,sx1,sy1,sb1_1,muxs1 : std_logic_vector (WP-1 downto 0);
signal sa2,sb2,sx2,sy2 : std_logic_vector (WP-1 downto 0);
signal localenc1 : integer range 0 to WP-1;
signal localenc2 : integer range 0 to WP-1;
begin
-- Logic function signals ...... if some day there's a paper of how this logic circuit works, it will be easier to comprehend this block of code
sb0_1<=sa0(WP-2 downto 0) & '0';
signalization : for i in 0 to WP-1 generate
-- Stage 0. Functions for A,B,X and preliminar Y.
sb0(i)<=radical(i*2);
sa0(i)<=radical(i*2+1);
sx0(i)<=sb0(i) or sa0(i);
sy0(i)<=sb0(i) and sa0(i);
-- Stage 1 : Function for signal Y.
muxs1(i) <= sy1(i) or (not(sx1(i)) and sb1_1(i));
end generate signalization;
stages: process (rst,clk,ena,sx0,sx1,localenc2)
variable localenc0 : integer range 0 to WP-1;
begin
-- Highest signifcant pair enconder : look for the bit pair with the most significant bit.
localenc0 := WP-1;
stg0henc: while localenc0>0 loop
exit when (sx0(localenc0)='1');
localenc0:=localenc0-1;
end loop;
-- Clocking process;
if rst='0' then
-- Stage 1
sa1<=(others => '0');
sb1<=(others => '0');
sx1<=(others => '0');
sy1<=(others => '0');
sb1_1<=(others => '0');
 
-- Stage 2
sx2<=(others => '0');
sa2<=(others => '0');
sb2<=(others => '0');
sy2<=(others => '0');
--Stage 3
x<=(others => '0');
y<=(others => '0');
a<=(others => '0');
b<=(others => '0');
elsif rising_edge(clk) and ena='1' then
-- Stage01
sa1<=sa0;
sb1<=sb0;
sx1<=sx0;
sy1<=sy0;
sb1_1<=sb0_1;
localenc1<=localenc0;
-- Stage12
sx2<=sx1;
sa2<=sa1;
sb2<=sb1;
sy2<= muxs1;
localenc2<=localenc1;
-- Stage 23 Shift 1 bit to right if the high bit in the highest significant pair is set.
if sa2(localenc2)='1' then
-- Shift Right
a <= '0' & sb2(WP-1 downto 1);
b <= sa2;
x <= '0' & sy2(WP-1 downto 1);
y <= sx2;
else
-- Leave me alone
x <= sx2;
y <= sy2;
a <= sa2;
b <= sb2;
end if;
decoder<=localenc2;
sho<=sa2(localenc2);
stage34
end if;
end process stages;
end rtl;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.