Thông báo

Collapse
No announcement yet.

Hỏi Về Lỗi Khi Lập Trinh Vhdl

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

  • Hỏi Về Lỗi Khi Lập Trinh Vhdl

    mình co viiet chuơng trinh vhdl cho vi xu li
    coolrunner2 cplds
    xc2c256



    chuơng trình mình viết la nhan nút thi dêm lên nhấn nữa thi đếm xuống .
    chuơng trinh như sau

    ----------------------------------------------------------------------------------
    -- Company:
    -- Engineer:
    --
    -- Create Date: 21:43:57 04/03/2008
    -- Design Name:
    -- Module Name: pack - Behavioral
    -- Project Name:
    -- Target Devices:
    -- Tool versions:
    -- Description:
    --
    -- Dependencies:
    --
    -- Revision:
    -- Revision 0.01 - File Created
    -- Additional Comments:
    --
    ----------------------------------------------------------------------------------
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    ---- Uncomment the following library declaration if instantiating
    ---- any Xilinx primitives in this code.
    --library UNISIM;
    --use UNISIM.VComponents.all;

    entity pack is
    Port ( CLK : in STD_LOGIC;
    CLR : in STD_LOGIC;
    BUTTON : in STD_LOGIC;
    LED1 : out STD_LOGIC_VECTOR (6 downto 0);
    LED2 : out STD_LOGIC_VECTOR (6 downto 0));
    end pack;

    architecture Behavioral of pack is


    PROCEDURE HIENTHI(SIGNAL LED1: out STD_LOGIC_VECTOR (6 downto 0);SIGNAL LED2 :out
    STD_LOGIC_VECTOR (6 downto 0);X : IN INTEGER)IS
    TYPE MANG_LED IS ARRAY (0 TO 9 )OF STD_LOGIC_VECTOR (6 downto 0);
    constant MA_LED : MANG_LED := ("1000000","1111001","0100100","0110000","0011001" ,
    "0010010","0000010","1111000","0000000","0010000") ;
    BEGIN
    LED1 <= MA_LED(X/10);
    LED2 <= MA_LED(X MOD 10);
    END HIENTHI;

    BEGIN

    PROCESS(CLK,CLR,BUTTON)
    VARIABLE CHIATAN,DEM,SO :INTEGER := 0;
    BEGIN
    IF CLR = '1' THEN
    SO:=0;
    DEM:=0;
    CHIATAN:=0;
    ELSIF CLK='1' AND CLK'EVENT THEN
    CHIATAN := CHIATAN+1;

    IF CHIATAN=1843200 THEN

    IF BUTTON ='1' THEN
    DEM:= DEM+1;
    IF DEM =2 THEN DEM := 0 ; END IF;
    END IF;

    IF DEM=1 THEN
    SO:=SO+1;
    IF SO=100 THEN SO :=0; END IF;
    END IF;

    IF DEM=0 THEN
    SO:=SO-1;
    IF SO=-1 THEN SO :=99; END IF;
    END IF;
    HIENTHI(LED1,LED2,SO);
    end if;
    END IF;

    END PROCESS;
    end Behavioral;





    và mình bien dich có lỗi như sau :
    ERROR:Xst:769 - "C:/Xilinx/demlenxuong/pack.vhd" line 47: Operator <DIVIDE> must have constant operands or first operand must be power of 2

    bạn nào biết xin chỉ giúp cảm ơn nhiều
    Attached Files

  • #2
    Các operators như /mod không được hỗ trợ bởi các synthesis tool (nhất là cho các dòng chip cấp thấp), trừ khi các operands là constants (hoặc là lũy thừa 2 cho /). Bài tập này thật ra đâu có cần dùng / và mod.

    Thiết kế hiện thời của bạn có vài lỗi cơ bản khác.

    - Lấy thí dụ nếu tần số clock của bạn là 1843200Hz, thì CHIATAN=1843200 sẽ chỉ xãy ra một lần trong ~2330 giây (= 2^32 / 1843200).

    - Nếu lỗi trên được sửa, khi bạn nhấn nút xuống, BUTTON = '1' trong bao nhiêu giây? Nếu bạn nhấn ngắn hơn 1 giây, với thiết kế hiện thời của bạn, module có thể "không thấy" BUTTON = '1' vì nó chỉ hoạt động khi CHIATAN=1843200. Nếu bạn chỉ nhấn nút một lần nhưng không buông ra trong nhiều giây, module của bạn sẽ liên tục đảo chiều mỗi khi CHIATAN=1843200.


    Nếu bạn muốn dùng INTEGER, bạn nên quy định giới hạn, thí dụ như signal DEM : INTEGER RANGE 0 to 2 := 0. Nếu bạn không quy định giới hạn, các synthesis tool thường sẽ quy INTEGER ra thành STD_LOGIC_VECTOR(31 downto 0), vì các tool không đủ thông minh để biết rằng trong trường hợp này bạn chỉ cần 2-bit. Một lợi điểm nữa là nếu trong code của bạn có lỗi logic, khiến cho signal của bạn vượt qua khỏi giới hạn bạn đã đặt ra, khi bạn mô phỏng, Modelsim sẽ báo lỗi cho bạn biết.


    Không nên tách SO := SO + 1 và SO := SO - 1 theo cách viết code của bạn. Nên tham khảo XST.pdf (Xilinx Synthesis Technology User Guide).

    Nguyên văn bởi XST
    Following is the VHDL code for an unsigned 8-bit adder/subtractor.
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    entity addsub is
    port(A,B : in std_logic_vector(7 downto 0);
    OPER: in std_logic;
    RES : out std_logic_vector(7 downto 0));
    end addsub;
    architecture archi of addsub is
    begin
    RES <= A + B when OPER='0'
    else A - B;
    end archi;

    Góp ý sơ qua cho bạn.

    Comment

    Về tác giả

    Collapse

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

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

    Collapse

    Đang tải...
    X