Thông báo

Collapse
No announcement yet.

Xin giúp đỡ lính mới chút các bro ơi

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

  • Xin giúp đỡ lính mới chút các bro ơi

    Em mới tập tành với FPGA , có một mạch và 2 phần mềm EDK , ISE . Tìm được trên mạng cái file "import_peripheral_tutorial"(cái này chắc nhiều người biết)và làm giống như nó chỉ , có vài điều chưa rõ ràng mong các bro giúp đỡ

    Đây là file user_logic.vhd mà em đã làm theo
    Em muốn hỏi là sau khi làm xong đưa trở lại EDK để sử dụng thì làm sao để sử dụng port digit_n cũng như những port khác như segment_n hay Bus2IP_reset....vậy .Vì em thấy khi khởi tạo cái này có bước là chọn thanh ghi,thì nó bảo chọn là số lượng :1 và 32bit.
    Và trong file system.ucf(EDK) em đã thử gán những port digit_n và segment_n tới những con led trên mạch(mạch em có 16 con led).Sau đó đánh đoạn code C sau vào file TestApp_Memory (sau khi đã làm những bước thêm vài một số code trong các file.h,file.c trong phần driver như hướng dẫn)
    -------------------------------------------------------------------

    Void OPB_7SEGLED_DISPLAYDIGITS(void *baseaddr_p , Xuint32 data)
    {
    Xuint32 baseaddr;
    baseaddr=(Xuint32) baseaddr_p;
    XIo_out8(Baseaddr,data);
    }

    int main (void) {
    OPB_7SEGLED_SelfTest((void*)XPAR_OPB_7SEGLED_0_BAS EADDR);
    ////cái dòng này chỉ là lệnh khởi tạo thôi phải hông các anh?????
    OPB_7SEGLED_DISPLAYDIGITS((void*)XPAR_OPB_7SEGLED_ 0_BASEADDR,3);
    ////giá trị 3 tương ứng với việc hiển thị số 0 trên led 7 đoạn
    return 0;
    }
    Sau đó chạy thử thì thấy những led mà được gán đến "port segment_n" hiển thị rất đúng(cái này làm thử đại chứ không biết gì) , còn những led được gán tới "port digit_n" thì em không biết phải sử dụng ra sao
    -------------------------------------------------------------------
    USER_LOGIC.VHL
    --------------------------------------
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_arith.all;
    use ieee.std_logic_unsigned.all;

    library proc_common_v2_00_a;
    use proc_common_v2_00_a.proc_common_pkg.all;


    entity user_logic is
    generic
    (
    C_DWIDTH : integer := 32;
    C_NUM_CE : integer := 1;
    C_IP_INTR_NUM : integer := 1
    );

    port
    (
    digit_n : out std_logic_vector(0 to 3);
    segment_n : out std_logic_vector(0 to 7);


    Bus2IP_Clk : in std_logic;
    Bus2IP_Reset : in std_logic;
    IP2Bus_IntrEvent : out std_logic_vector(0 to C_IP_INTR_NUM-1);
    Bus2IP_Data : in std_logic_vector(0 to C_DWIDTH-1);
    Bus2IP_BE : in std_logic_vector(0 to C_DWIDTH/8-1);
    Bus2IP_RdCE : in std_logic_vector(0 to C_NUM_CE-1);
    Bus2IP_WrCE : in std_logic_vector(0 to C_NUM_CE-1);
    IP2Bus_Data : out std_logic_vector(0 to C_DWIDTH-1);
    IP2Bus_Ack : out std_logic;
    IP2Bus_Retry : out std_logic;
    IP2Bus_Error : out std_logic;
    IP2Bus_ToutSup : out std_logic
    );
    end entity user_logic;

    ------------------------------------------------------------------------------
    -- Architecture section
    ------------------------------------------------------------------------------

    architecture IMP of user_logic is

    type CTRL_REG is array (0 to 3) of std_logic_vector(0 to 7);
    signal display_ctrl : CTRL_REG;
    signal digit_select : std_logic_vector(0 to 1);
    signal digit_n_i : std_logic_vector(0 to 3);
    signal segment_n_i : std_logic_vector(0 to 7);
    signal mhertz_cnt : std_logic_vector(0 to 5);
    signal khertz_cnt : std_logic_vector(0 to 9);
    signal hertz_cnt : std_logic_vector(0 to 9);
    signal mhertz_en : std_logic;
    signal khertz_en : std_logic;
    signal hertz_en : std_logic;

    signal slv_reg0 : std_logic_vector(0 to C_DWIDTH-1);
    signal slv_reg_write_select : std_logic_vector(0 to 0);
    signal slv_reg_read_select : std_logic_vector(0 to 0);
    signal slv_ip2bus_data : std_logic_vector(0 to C_DWIDTH-1);
    signal slv_read_ack : std_logic;
    signal slv_write_ack : std_logic;


    signal interrupt : std_logic_vector(0 to C_IP_INTR_NUM-1);

    begin

    display_ctrl(0) <= slv_reg0(0 to 7);
    display_ctrl(1) <= slv_reg0(8 to 15);
    display_ctrl(2) <= slv_reg0(16 to 23);
    display_ctrl(3) <= slv_reg0(24 to 31);
    digit_n <= digit_n_i;
    segment_n <= segment_n_i;

    ---------------------------------------
    -- Clock Dividers
    ---------------------------------------
    GEN_1MHZ_PROCESS : process( Bus2IP_Clk ) is
    begin
    if Bus2IP_Clk'event and Bus2IP_Clk = '1' then
    if Bus2IP_Reset = '1' then
    mhertz_cnt <= (others => '0');
    mhertz_en <= '0';
    else
    mhertz_cnt <= mhertz_cnt + 1;
    if mhertz_cnt = "110010" then
    mhertz_en <= '1' ;
    mhertz_cnt <= (others => '0');
    else
    mhertz_en <= '0';
    end if;
    end if;
    end if;
    end process GEN_1MHZ_PROCESS;

    GEN_1KHZ_PROCESS : process( Bus2IP_Clk ) is
    begin
    if Bus2IP_Clk'event and Bus2IP_Clk = '1' then
    if Bus2IP_Reset = '1' then
    khertz_cnt <= (others => '0');
    khertz_en <= '0';
    else
    if mhertz_en = '1' then
    khertz_cnt <= khertz_cnt + 1;
    if khertz_cnt = "1111101000" then
    khertz_en <= '1';
    khertz_cnt <= (others => '0');
    end if;
    else
    khertz_en <= '0';
    end if;
    end if;
    end if;
    end process GEN_1KHZ_PROCESS;

    GEN_1HZ_PROCESS : process( Bus2IP_Clk ) is
    begin
    if Bus2IP_Clk'event and Bus2IP_Clk = '1' then
    if Bus2IP_Reset = '1' then
    hertz_cnt <= (others => '0');
    hertz_en <= '0';
    else
    if khertz_en = '1' then
    hertz_cnt <= hertz_cnt + 1;
    if hertz_cnt = "1111101000" then
    hertz_en <= '1';
    hertz_cnt <= (others => '0');
    end if;
    else
    hertz_en <= '0';
    end if;
    end if;
    end if;
    end process GEN_1HZ_PROCESS;



    ----------------------------------------
    -- Display Update
    ----------------------------------------
    CYC_DISP_PROCESS : process( Bus2IP_Clk ) is
    begin
    if Bus2IP_Clk'event and Bus2IP_Clk = '1' then
    if Bus2IP_Reset = '1' then
    digit_select <= (others => '0');
    digit_n_i <= (others => '1');
    segment_n_i <= (others => '1');
    else
    if khertz_en = '1' then
    digit_select <= digit_select + 1;
    case digit_select is
    When "00" => segment_n_i <= display_ctrl(0);
    digit_n_i <= "1110";
    When "01" => segment_n_i <= display_ctrl(2);
    digit_n_i <= "1101";
    When "10" => segment_n_i <= display_ctrl(3);
    digit_n_i <= "1011";
    When "11" => segment_n_i <= display_ctrl(3);
    digit_n_i <= "0111";
    When others => null;
    end case;
    end if;
    end if;
    end if;
    end process CYC_DISP_PROCESS;




    slv_reg_write_select <= Bus2IP_WrCE(0 to 0);
    slv_reg_read_select <= Bus2IP_RdCE(0 to 0);
    slv_write_ack <= Bus2IP_WrCE(0);
    slv_read_ack <= Bus2IP_RdCE(0);

    -- implement slave model register(s)
    SLAVE_REG_WRITE_PROC : process( Bus2IP_Clk ) is
    begin

    if Bus2IP_Clk'event and Bus2IP_Clk = '1' then
    if Bus2IP_Reset = '1' then
    slv_reg0 <= (others => '1');
    else
    case slv_reg_write_select is
    when "1" =>
    for byte_index in 0 to (C_DWIDTH/8)-1 loop
    if ( Bus2IP_BE(byte_index) = '1' ) then
    slv_reg0(byte_index*8 to byte_index*8+7) <= Bus2IP_Data(byte_index*8 to byte_index*8+7);
    end if;
    end loop;
    when others => null;
    end case;
    end if;
    end if;

    end process SLAVE_REG_WRITE_PROC;

    -- implement slave model register read mux
    SLAVE_REG_READ_PROC : process( slv_reg_read_select, slv_reg0 ) is
    begin

    case slv_reg_read_select is
    when "1" => slv_ip2bus_data <= slv_reg0;
    when others => slv_ip2bus_data <= (others => '0');
    end case;

    end process SLAVE_REG_READ_PROC;



    INTR_PROC : process( Bus2IP_Clk ) is
    constant COUNT_SIZE : integer := 30;
    constant ALL_ONES : std_logic_vector(0 to COUNT_SIZE-1) := (others => '1');
    variable counter : std_logic_vector(0 to COUNT_SIZE-1);
    begin
    if ( Bus2IP_Clk'event and Bus2IP_Clk = '1' ) then
    if ( Bus2IP_Reset = '1' ) then
    counter := (others => '0');
    interrupt <= (others => '0');
    else
    counter := counter + 1;
    if ( counter = ALL_ONES ) then
    interrupt <= (others => '1');
    else
    interrupt <= (others => '0');
    end if;
    end if;
    end if;
    end process INTR_PROC;

    IP2Bus_IntrEvent(0) <= hertz_en;
    IP2Bus_Data <= slv_ip2bus_data;
    IP2Bus_Ack <= slv_write_ack or slv_read_ack;
    IP2Bus_Error <= '0';
    IP2Bus_Retry <= '0';
    IP2Bus_ToutSup <= '0';
    end IMP;
    --------------------------------------------------------------------

    MONG CÁC ANH CHỈ DẪN GIÚPgửi kèm file "import_peripheral_tutorial" và rất mong sự giúp đỡ . CÁM ƠN NHIỀU

    http://www.megaupload.com/?d=7HKDLS77
    |

  • #2
    Có ai rãnh ghé qua giúp giùm em cái.Cám ơn nhiều
    |

    Comment


    • #3
      Hi, ban ko su dung duoc truc tiep cac port vi` trong EDK, ban chi "tha^'y" duoc mot cai "address space", chu ko thay duoc may cai signals ... sau do' tuy` thuoc hardware dieu khien cac Port nhu the na`o ... O tren EDK ban se write truc tiep va`o mot cai address (trong vi' du tren la` address da`u tien cua user logic). Se co' mot so' handshaking giua user logic va system bus de write gia tri va`o register SLV_REG0 ... Sau do' t`uy thuoc ban muo'n "su du.ng" cai SLV_REG0 nhu the nao. Trong vi' du tren, ban chiu kho' doc pha`n ----------------------------------------
      -- Display Update
      ----------------------------------------
      de hieu coi 2 port segment va` digit duoc control nhu the nao ...
      cai code na`y
      OPB_7SEGLED_DISPLAYDIGITS((void*)XPAR_OPB_7SEGLED_ 0_BASEADDR,3); de write va`o address XPAR_OPB_7SEGLED_ 0_BASEADDR gia tri 3.

      Comment


      • #4
        Cán ơn Bro , em đã coi phần Display Update và thấy việc có câu lệnh này
        " if khertz_en = '1' then"vậy chứng tỏ nó có liên quan đến phần "Clock Dividers" ở trên . Nhưng em không hiểu lắm về phần Clock Dividersnày , trong đó có câu lệnh này "if mhertz_cnt = "110010" then" và em thấy "signal mhertz_cnt : std_logic_vector(0 to 5);" . Vậy không hiểu làm cách nào có thể đưa giá trị 110010 vào signal mhertz_cnt để có thể hoàn thành lệnh if ở trên . Nhờ huynh chỉ rõ hơn cho em . Chân thành cảm ơn .
        |

        Comment


        • #5
          Clock divider principle giong nhu mi`nh de'm tu` 1 toi 10 vay ... neu 10 roi thi tang hang chuc len 1. Clock chi'nh la` Bus2IP_clock, moi clock tang cai Mherzt count len 1,
          0b110010 = 50. Nhu vay moi lan cai Mhert_cnt=50, reset count va` set Mhertz signal = 1. Waveform cua may cai signal (Clock chi'nh, count va` Mhert signal) do' nhu the na`y:
          __++__++__++ .........++__++__++__++__++__++__ (Bus2IP_Clk)
          \\\< 1 >< 2><............<48><49><50><0 >< 1 >..... (MHertz_cnt)
          ________________________________++++________ (mhertz_en)
          ....
          May cai khac tuong tu

          Comment


          • #6
            That ra no' de'm hoi sai ti' ... no' dem toi 51 clock, du'ng ra la` 50 thoi ... 0 toi 49 ... (thong thuong clock cua board la 50Mhz, hiem cai nao choi clock 51MHz) ...

            Comment


            • #7
              Cám ơn huynh thì ra là vậy . Vậy là mọi việc hoàn toàn phụ thuộc vào cái này phải hông huynh
              --------------------------------------------------------------------
              display_ctrl(0) <= slv_reg0(0 to 7);
              display_ctrl(1) <= slv_reg0(8 to 15);
              display_ctrl(2) <= slv_reg0(16 to 23);
              display_ctrl(3) <= slv_reg0(24 to 31);
              digit_n <= digit_n_i;
              segment_n <= segment_n_i;
              .
              .
              .
              if khertz_en = '1' then
              digit_select <= digit_select + 1;
              case digit_select is
              When "00" => segment_n_i <= display_ctrl(0);
              digit_n_i <= "1110";
              When "01" => segment_n_i <= display_ctrl(2);
              digit_n_i <= "1101";
              When "10" => segment_n_i <= display_ctrl(3);
              digit_n_i <= "1011";
              When "11" => segment_n_i <= display_ctrl(3);
              digit_n_i <= "0111";

              --------------------------------------------------------------------
              Cho em hỏi cái , vậy là cứ mỗi lần khertz =1 thì digit_select lại được cộng thêm 1 và tùy theo giá trị của digit_select thì em thấy digit_n_i lại được gán những giá trị khác nhau ( 4 giá trị = 4 tín hiệu điều khiển 4 led) . Vậy sao nó lại không hiển thị ra port digit_n nhỉ . Hay còn vấn đề gì ở đây nữa???Lại phải làm phiền huynh nữa , thật xin lỗi . Cám ơn sự giúp đỡ của huynh , em đã sáng ra được nhiều điều . THANKS
              |

              Comment


              • #8
                Theo cai code thi` 4 LED cua digit_n se thay phien nhau sa'ng ... nhung ko biet sao ta`n so' la` 1kHz, chop tat 1kHz thi ko thay gi ca ... ko biet sao cai vi' du lai code nhu the ... muo'n test thi` doi cai khertz_en thanh hertz_en ...

                Comment


                • #9
                  Cám ơn huynh đúng là do 1KHz quá nhanh nên em cứ tưởng là nó không chạy , sửa lại giống như huynh nói , sử dụng 1Hz thì thấy rất rõ . Nhưng giờ lại có một vấn đề nhỏ nảy sinh trong EDK mong huynh chỉ giúp . Là nếu như bình thường là khởi tạo vào trong BRAM của Project (như hình)



                  thì nó chạy bình thường...

                  Nhưng khi em thay đổi muốn sử dụng XMD nên lại sửa lại như sau



                  thì sau khi download--> XMD-->dow executable.elf-->rst-->run-->Nó không chạy , em đã thử dùng Software Debugger để xem thử thì nó treo luôn như hình




                  Em không hiểu sao nó lại như vậy , vì em có làm một vài cái project trước sử dụng những pcores,driver sẵn có thì thấy khi project quá lớn BRAM không thể chứa hết thì sử dụng XMD để download tới SDRAM (cái này mạch em có) . Nhưng sao cái này tuy dùng BRAM vẫn được nhưng dùng XMD lại không được . Vì em đang muốn kết hợp phần này vào cái project trước ( project này phải sử dụng SDRAM vì BRAM không đủ ). Mong huynh giúp đỡ .Cám ơn nhiều..Bữa tới giờ nhờ huynh mà giúp em giải quyết bao rắc rối , Cám ơn lần nữa

                  Còn đây là Linker Script của em

                  |

                  Comment


                  • #10
                    You are welcome ...
                    ... Cai na`y chiu ... sai mot chut la ko biet duong dau ma` mo` ... chiu kho' la`m lai tu` dau di ... ... la`m ki~ tu`ng buoc set-up system cho du'ng ...

                    Comment


                    • #11
                      Đang cố gắng làm lại xem nó sai ở đâu , dù sao vẫn cám ơn sự giúp đỡ của huynh
                      |

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X