Thông báo

Collapse
No announcement yet.

Giải thuật cordic trên VHDL

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giải thuật cordic trên VHDL

    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.

  • #2
    Suy cho cùng thì các kiểu viết codes, đặt tên biến, tín hiệu là do cá nhân/công ty tạo chuẩn chung để dễ viết code và bảo trì code.
    Nhìn chung thì không có gì không ổn ... bạn tham khảo phần mềm doxygen để viết comment, và "chuẩn
    wishbone" về coding style, ngoài ra còn nhiều coding style khác như của xilinx, altera, actel ...

    Comment


    • #3
      http://www.google.com.sg/#hl=en&q=HD...3a0cdd09959e86

      Comment


      • #4
        Phần for loop không ổn. Bạn dùng for loop, nhưng bạn lại dùng signals, cho nên đoạn code đó sẽ chỉ iterate 1 lần. Bạn nên xem lại về signal assigment.

        Nếu dùng for loop như vậy, bạn cần dùng variables. Nhưng bạn thật sự có muốn tất cả cordic iterations execute chỉ trong 1 clock cycle?

        Phần compare dùng i cũng không ổn. Bạn lầm lẫn giữa signal i bạn declared và i trong for loop. Signal i và i trong for loop là hai entity khác nhau.

        OK, pass syntax check, nhưng fundamentals về VHDL programming rất không ổn. Bạn đang viết software chứ không phải VHDL.

        Comment


        • #5
          Hi hibouvn,

          Mình không có ý kiến gì về syntax và cách lập trình của bạn. Nhưng do bạn mới tập viết ngôn ngữ mô tả phần cứng, nên mình thấy bạn nên học thêm "coding style" của các công ty lớn như Altera, Xilinx, ...Thường thì các phần này năm trong tài liệu Hướng dẫn sử dụng phần tổng hợp hoặc phần "Template" trong phần mềm. Cái này sẽ giúp cho bạn nhìn code tốt hơn, tạo các đoạn mã trong sáng dễ tổng hợp, tìm và sửa lỗi.

          Chúc bạn học tốt. .^_^.

          Comment

          Về tác giả

          Collapse

          hibouvn Tìm hiểu thêm về hibouvn

          Bài viết mới nhất

          Collapse

          Đang tải...
          X