Kính chào các bậc tiền bối,
Em mới tập tành VHDL vài tuần vì trường em cho 1 project nhỏ thực hiện giải thuật cordic bằng vhdl, kính mong các bác có kinh nghiệm xem giúp em về cú pháp của đoạn code sau :
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.std_logic_arith.ALL;
USE IEEE.std_logic_unsigned.ALL;
ENTITY cordic IS
GENERIC ( WIDTH : INTEGER := 16;
ITER : INTEGER := 13);
PORT ( rst : IN STD_LOGIC;
clk : IN STD_LOGIC;
angle : IN STD_LOGIC_VECTOR ( WIDTH-1 DOWNTO 0 );
wr : IN STD_LOGIC;
sin : OUT STD_LOGIC_VECTOR (WIDTH-1 DOWNTO 0 );
cos : OUT STD_LOGIC_VECTOR (WIDTH-1 DOWNTO 0 );
val : OUT STD_LOGIC );
END cordic;
ARCHITECTURE beh OF cordic IS
CONSTANT ConstK : STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0) := "0001001101101110";
TYPE LUT IS ARRAY (0 TO ITER - 1) OF STD_LOGIC_VECTOR( WIDTH-1 DOWNTO 0 );
SIGNAL ROM_DATA : LUT:= ( "0001100100100010",
"0000111011010110",
"0000011111010111",
"0000001111111011",
"0000000111111111",
"0000000100000000",
"0000000010000000",
"0000000001000000",
"0000000000100000",
"0000000000010000",
"0000000000001000",
"0000000000000100",
"0000000000000010" );
SIGNAL X, Y, Z : STD_LOGIC_VECTOR( WIDTH-1 DOWNTO 0 );
SIGNAL Xo, Yo, Zo : STD_LOGIC_VECTOR( WIDTH-1 DOWNTO 0 );
SIGNAL BSY : BIT;
SIGNAL i : INTEGER;
BEGIN
PROCESS (rst, clk)
BEGIN
IF (rst = '1') THEN
-- Initialiser les signaux internes
Xo <= ConstK;
Yo <= (OTHERS =>'0');
Zo <= (OTHERS =>'0');
-- Mettre @ zero toutes les sorites
sin <= (OTHERS =>'0');
cos <= (OTHERS =>'0');
val <= '0';
ELSE
IF (clk'event AND clk='1') THEN
IF (wr = '1') THEN
IF (BSY = '0') THEN
BSY <= '1';
Xo <= ConstK;
Yo <= (OTHERS =>'0');
Zo <= angle;
END IF;
END IF;
IF (BSY = '1') THEN
calcul : FOR i IN 0 TO (ITER - 1) LOOP
IF ( Zo < 0 ) THEN
X <= Xo + ('0' & Yo(Yo'LEFT DOWNTO 1));
Y <= Yo - ('0' & Xo(Xo'LEFT DOWNTO 1));
Z <= Zo + ROM_DATA(i);
ELSE
X <= Xo - ('0' & Yo(Yo'LEFT DOWNTO 1));
Y <= Yo + ('0' & Xo(Xo'LEFT DOWNTO 1));
Z <= Zo - ROM_DATA(i);
END IF;
Xo <= X;
Yo <= Y;
END LOOP calcul ;
IF (i = (ITER - 1)) THEN
BSY <= '0';
val <= '1';
-- Output
sin <= X;
cos <= Y;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
END beh;
Em biên dịch thì nó ko có lỗi nhưng ko biết như vậy đã đúng với cách lập trình phổ biến chưa vì có rất nhiều kiểu lập trình VHDL.
Kính mong các cao thù chỉ giáo giúp ah. Em cám ơn rất nhiều.
Em mới tập tành VHDL vài tuần vì trường em cho 1 project nhỏ thực hiện giải thuật cordic bằng vhdl, kính mong các bác có kinh nghiệm xem giúp em về cú pháp của đoạn code sau :
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.std_logic_arith.ALL;
USE IEEE.std_logic_unsigned.ALL;
ENTITY cordic IS
GENERIC ( WIDTH : INTEGER := 16;
ITER : INTEGER := 13);
PORT ( rst : IN STD_LOGIC;
clk : IN STD_LOGIC;
angle : IN STD_LOGIC_VECTOR ( WIDTH-1 DOWNTO 0 );
wr : IN STD_LOGIC;
sin : OUT STD_LOGIC_VECTOR (WIDTH-1 DOWNTO 0 );
cos : OUT STD_LOGIC_VECTOR (WIDTH-1 DOWNTO 0 );
val : OUT STD_LOGIC );
END cordic;
ARCHITECTURE beh OF cordic IS
CONSTANT ConstK : STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0) := "0001001101101110";
TYPE LUT IS ARRAY (0 TO ITER - 1) OF STD_LOGIC_VECTOR( WIDTH-1 DOWNTO 0 );
SIGNAL ROM_DATA : LUT:= ( "0001100100100010",
"0000111011010110",
"0000011111010111",
"0000001111111011",
"0000000111111111",
"0000000100000000",
"0000000010000000",
"0000000001000000",
"0000000000100000",
"0000000000010000",
"0000000000001000",
"0000000000000100",
"0000000000000010" );
SIGNAL X, Y, Z : STD_LOGIC_VECTOR( WIDTH-1 DOWNTO 0 );
SIGNAL Xo, Yo, Zo : STD_LOGIC_VECTOR( WIDTH-1 DOWNTO 0 );
SIGNAL BSY : BIT;
SIGNAL i : INTEGER;
BEGIN
PROCESS (rst, clk)
BEGIN
IF (rst = '1') THEN
-- Initialiser les signaux internes
Xo <= ConstK;
Yo <= (OTHERS =>'0');
Zo <= (OTHERS =>'0');
-- Mettre @ zero toutes les sorites
sin <= (OTHERS =>'0');
cos <= (OTHERS =>'0');
val <= '0';
ELSE
IF (clk'event AND clk='1') THEN
IF (wr = '1') THEN
IF (BSY = '0') THEN
BSY <= '1';
Xo <= ConstK;
Yo <= (OTHERS =>'0');
Zo <= angle;
END IF;
END IF;
IF (BSY = '1') THEN
calcul : FOR i IN 0 TO (ITER - 1) LOOP
IF ( Zo < 0 ) THEN
X <= Xo + ('0' & Yo(Yo'LEFT DOWNTO 1));
Y <= Yo - ('0' & Xo(Xo'LEFT DOWNTO 1));
Z <= Zo + ROM_DATA(i);
ELSE
X <= Xo - ('0' & Yo(Yo'LEFT DOWNTO 1));
Y <= Yo + ('0' & Xo(Xo'LEFT DOWNTO 1));
Z <= Zo - ROM_DATA(i);
END IF;
Xo <= X;
Yo <= Y;
END LOOP calcul ;
IF (i = (ITER - 1)) THEN
BSY <= '0';
val <= '1';
-- Output
sin <= X;
cos <= Y;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
END beh;
Em biên dịch thì nó ko có lỗi nhưng ko biết như vậy đã đúng với cách lập trình phổ biến chưa vì có rất nhiều kiểu lập trình VHDL.
Kính mong các cao thù chỉ giáo giúp ah. Em cám ơn rất nhiều.
Comment