G
Gnome
Guest
Hi,
I'm writing a little and simplified version of the cordic algorithm.
But I can't understand why the following code doesn't work. I'm using
Modelsim, and during the simulation the signals X, Y, Z never are
always undefined, nor I get any other result.
I post the code. Thanks a lot for any help,
Gnome
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity vectors is
generic(
WIDTH : integer := 16;
PIPELINE : integer := 20);
port (
clk : in std_logic;
Xi, Yi : in signed(WIDTH -1 downto 0) := conv_signed('1', WIDTH);
Xj, Yj : out signed(WIDTH -1 downto 0);
Zi : inout signed(WIDTH -1 downto 0) := conv_signed('1', WIDTH)
);
end vectors;
architecture dataflow of vectors is
-- signals
type XYvector is array(PIPELINE downto 0) of signed(WIDTH -1 downto 0);
type Zvector is array (PIPELINE downto 0) of signed(19 downto 0);
-- returns atan(1/2^n)
function FATAN(n :natural) return integer is
[...]
end FATAN;
-- shift right of 1 bit
function shiftright(vect: signed) return signed is
variable tmp : signed(vect'range);
begin
-- tmp(vect'high) := vect(vect'high); ?????
tmp(vect'high) := '0';
for i in vect'high - 1 downto 0 loop
tmp(i) := vect(i);
end loop; -- i'0' + vect(vect'high downto 1);
return tmp;
end shiftright;
signal X, Y : XYvector;
signal Z, atan : Zvector;
begin
-- init
X(0) <= Xi;
Y(0) <= Yi;
Z(0)(19 downto 4) <= Zi;
Z(0)(3 downto 0) <= (others => '0');
p2: process(clk)
begin
for n in 0 to PIPELINE -1 loop
if(clk'event and clk='1') then
atan
<= conv_signed(fatan
, 20);
if Z
>= 0 then
X(n+1) <= X
- shiftright(Y
);
Y(n+1) <= Y
+ shiftright(X
);
Z(n+1) <= Z
- fatan
;
else
X(n+1) <= X
+ shiftright(Y
);
Y(n+1) <= Y
- shiftright(X
);
Z(n+1) <= Z
+ atan
;
end if;
end if;
end loop;
end process;
-- output
Xj <= X(PIPELINE);
Yj <= Y(PIPELINE);
end dataflow;
I'm writing a little and simplified version of the cordic algorithm.
But I can't understand why the following code doesn't work. I'm using
Modelsim, and during the simulation the signals X, Y, Z never are
always undefined, nor I get any other result.
I post the code. Thanks a lot for any help,
Gnome
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity vectors is
generic(
WIDTH : integer := 16;
PIPELINE : integer := 20);
port (
clk : in std_logic;
Xi, Yi : in signed(WIDTH -1 downto 0) := conv_signed('1', WIDTH);
Xj, Yj : out signed(WIDTH -1 downto 0);
Zi : inout signed(WIDTH -1 downto 0) := conv_signed('1', WIDTH)
);
end vectors;
architecture dataflow of vectors is
-- signals
type XYvector is array(PIPELINE downto 0) of signed(WIDTH -1 downto 0);
type Zvector is array (PIPELINE downto 0) of signed(19 downto 0);
-- returns atan(1/2^n)
function FATAN(n :natural) return integer is
[...]
end FATAN;
-- shift right of 1 bit
function shiftright(vect: signed) return signed is
variable tmp : signed(vect'range);
begin
-- tmp(vect'high) := vect(vect'high); ?????
tmp(vect'high) := '0';
for i in vect'high - 1 downto 0 loop
tmp(i) := vect(i);
end loop; -- i'0' + vect(vect'high downto 1);
return tmp;
end shiftright;
signal X, Y : XYvector;
signal Z, atan : Zvector;
begin
-- init
X(0) <= Xi;
Y(0) <= Yi;
Z(0)(19 downto 4) <= Zi;
Z(0)(3 downto 0) <= (others => '0');
p2: process(clk)
begin
for n in 0 to PIPELINE -1 loop
if(clk'event and clk='1') then
atan
if Z
X(n+1) <= X
Y(n+1) <= Y
Z(n+1) <= Z
else
X(n+1) <= X
Y(n+1) <= Y
Z(n+1) <= Z
end if;
end if;
end loop;
end process;
-- output
Xj <= X(PIPELINE);
Yj <= Y(PIPELINE);
end dataflow;