ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





  1. #1
    تاریخ عضویت
    2006/11/09
    زیره آسمون آبی
    177
    1

    تعداد بایتی که می شه از ورودی گرفت؟ spartan3-4pq208

    سلام به همه fpga بازها.
    می خواستم بدونم تو spartan3-4pq208 چند بایت رو می شه از ورودی گرفت و تو ارایه ذخیره کرد؟
    ای دستان پرتوان برس به داد این ناتوان.
    متشکرم.
    گسترده تر از هر چیز دل مومن است(امام علی (ع))
    [glow=red,2,300]R[/glow]
    [glow=green,2,300]G[/glow]
    [glow=blue,2,300]B[/glow]
    • تبلیغات
      .

  2. #2
    تاریخ عضویت
    2011/05/12
    366
    11

    پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ spartan3-4pq208

    به طور کلی محدودیتی برای گرفتن اطلاعات برای پایه های FPGA که I/O هستند نیست و لزومی هم نداره که حتما اطلاعات به صورت بایت(8 بیتی) ارسال بشن بلکه بسته به تعداد پایه های مورد استفاده میتونه مثلا 128 بیتی هم باشه که به صورت موازیه، اگر هم سریال باشه که دیگه لازم نیست تعداد پایه ها زیاد باشه، تعداد بیتهای اطلاعات هم که دیگه اصلا اهمیتی نداره. برای ذخیره آرایه هم که از حافظه داخلی FPGA میشه استفاده کرد که اونهم مقدارش در دیتاشیت مشخصه. کلا کار ساده و باقلواییه :nerd:
    اسمایل، تومورو ویل بی وُرس
  3. #3
    تاریخ عضویت
    2006/11/09
    زیره آسمون آبی
    177
    1

    پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ spartan3-4pq208

    سلام.
    مرسی از اینکه پاسخ دادی.
    یه برنامه نوشتم که 3300 بایت رو می خوام بصورت 8 بیتی بخونم وتو ارایه ذخیره کنم ولی ارور میده. :angry: :cry2:
    اینم برنامش:
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;

    ---------------------------------------------------------

    entity lop is
    Port (o : out std_logic;
    int1 : in std_logic;---int save data
    a: in std_logic_vector(7 downto 0)
    );
    end lop;

    architecture Behavioral of lop is
    ----------------------------------------------------------


    signal sat:integer range 0 to 3300;
    signal cnt:integer range 0 to 3300;

    type mee is array(0 to 3300)of std_logic_vector(7 downto 0);
    signal me:mee;



    --------------------save data------------------------------
    begin

    process(int1)

    begin

    if (int1' event and int1='1&#039then


    me(cnt)<=a;--

    if "10101111"=me(sat)then
    o<='1';

    else
    o<='0';

    end if;
    cnt<=cnt+1;
    sat<=sat+2;

    end if;

    end process;
    ---------------------------------------------
    end Behavioral;
    ممنون میشم اکه راهنماییم کنید.
    گسترده تر از هر چیز دل مومن است(امام علی (ع))
    [glow=red,2,300]R[/glow]
    [glow=green,2,300]G[/glow]
    [glow=blue,2,300]B[/glow]
  4. #4
    تاریخ عضویت
    2011/05/12
    366
    11

    پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ spartan3-4pq208

    نه نه نه نه
    اینجوری که نمیشه با لاجیک اینکار رو کرد، باید از حافظه خود FPGA کمک بگیرید.

    ابتدا باید یک رم با پورتی برای خوندن و نوشتن بسازید:


    library ieee;
    use ieee.std_logic_1164.all;

    entity single_port_ram is

    generic
    (
    DATA_WIDTH : natural := 8;
    ADDR_WIDTH : natural := 8
    );

    port
    (
    clk : in std_logic;
    addr : in natural range 0 to 2**ADDR_WIDTH - 1;
    data : in std_logic_vector((DATA_WIDTH-1) downto 0);
    we : in std_logic := '0';
    q : out std_logic_vector((DATA_WIDTH -1) downto 0)
    );

    end entity;

    architecture rtl of single_port_ram is

    -- Build a 2-D array type for the RAM
    subtype word_t is std_logic_vector((DATA_WIDTH-1) downto 0);
    type memory_t is array(2**ADDR_WIDTH-1 downto 0) of word_t;

    -- Declare the RAM signal.
    signal ram : memory_t;

    -- Register to hold the address
    signal addr_reg : natural range 0 to 2**ADDR_WIDTH-1;

    begin

    process(clk)
    begin
    if(rising_edge(clk)) then
    if(we = '1&#039 then
    ram(addr) <= data;
    end if;

    -- Register the address for reading
    addr_reg <= addr;
    end if;
    end process;

    q <= ram(addr_reg);

    end rtl;

    بعد از اون توی کدتون استفاده کنید.

    موفق باشید.
    اسمایل، تومورو ویل بی وُرس
  5. #5
    تاریخ عضویت
    2006/11/09
    زیره آسمون آبی
    177
    1

    پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ spartan3-4pq208

    سلام.
    خسته نباشی.ممنون از اینکه جواب میدی.
    این برنامه رو که گذاشتی من اینتوری باز نویسی کردم
    ولی امان از این ارور:
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;

    ---------------------------------------------------------

    entity lop is
    Port (

    int1 : in std_logic;
    int2 : in std_logic;
    a: in std_logic_vector(7 downto 0);
    o: out std_logic_vector(7 downto 0)
    );
    end lop;

    architecture Behavioral of lop is
    ----------------------------------------------------------


    signal sat:integer range 2 to 4095;
    signal cnt:integer range 0 to 4095;


    type mee is array(0 to 4095)of std_logic_vector(7 downto 0);
    signal me:mee;

    --------------------save data------------------------------
    begin

    process(int1)

    begin

    if (int1' event and int1='1&#039then

    me(cnt)<=a;





    cnt<=cnt+1;

    end if;

    end process;

    ------------
    process(int2)

    begin

    if (int2' event and int2='1&#039then






    o<=me(sat);
    sat<=sat+1;

    end if;

    end process;
    ----------------------------------------
    end Behavioral;
    ولی این یکی چو ن شرط نداره ارور نمیده:

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;

    ---------------------------------------------------------

    entity lop is
    Port (

    int1 : in std_logic;
    int2 : in std_logic;
    a: in std_logic_vector(7 downto 0);
    o: out std_logic_vector(7 downto 0)
    );
    end lop;

    architecture Behavioral of lop is
    ----------------------------------------------------------


    signal sat:integer range 2 to 4095;
    signal cnt:integer range 0 to 4095;


    type mee is array(0 to 4095)of std_logic_vector(7 downto 0);
    signal me:mee;

    --------------------save data------------------------------
    begin

    process(int1)

    begin

    if (int1' event and int1='1&#039then

    me(cnt)<=a;





    cnt<=cnt+1;

    end if;

    end process;

    ------------
    process(int2)

    begin

    if (int2' event and int2='1&#039then






    o<=me(sat);
    sat<=sat+1;

    end if;

    end process;
    ----------------------------------------
    end Behavioral;

    کمکم کنید لطفا
    گسترده تر از هر چیز دل مومن است(امام علی (ع))
    [glow=red,2,300]R[/glow]
    [glow=green,2,300]G[/glow]
    [glow=blue,2,300]B[/glow]
  6. #6
    تاریخ عضویت
    2011/05/12
    366
    11

    پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ spartan3-4pq208

    اول اینکه هر دو قسمتی که نوشتین مثل همدیگه هستند، دوم اینکه داخل پروسس شرطها رو باید به یک لبه از کلاک نسبت بدید تا مدار ترتیبی ساخته بشه و گرنه مدار ترکیبی میشه و اصلا قابل پیاده سازی نیست. مثلا همه شرطهای داخل یک پروسس باید داخل شرط if(rising_edge(clk))then نوشته بشن که فقط در لحظه بالارونده کلاک شرطها اعمال بشن. برای استفاده از رم خود FPGA هم باید همون کدی رو که براتون نوشتم رو با استفاده از Component فراخوانی کنید که سنتزگر متوجه بشه که میخواید از رم موجود استفاده کنید و نه از لاجیکها.

    http://www.seas.upenn.edu/~ese171/vhdl/vhdl_primer.html
    اسمایل، تومورو ویل بی وُرس
  7. #7
    تاریخ عضویت
    2006/11/09
    زیره آسمون آبی
    177
    1

    پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ spartan3-4pq208

    سلام.
    کد دوم رو اشتباه گذاشتم.
    منظورم این کد بود ولی ارور میده.بصورت ترتیبی هم نوشتم.
    نمی دونم جرا با این شرط مشکل داره!
    اون برنامه که شما نوشتی ادرس رو از پین ورودی می گرفت که من اون رو حذف کردم و به جا signal cnt رو قرار دادم و در پروسس دوم یه شرط برایه مقایسه ارایه نوشتم چون نمی خوام همون مقداره خونده شده به پین خروجی بره. اگه این برنامه ایرادی داره راهنماییم کنید.


    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;

    ---------------------------------------------------------

    entity lop is
    Port (

    int1 : in std_logic;
    int2 : in std_logic;
    a: in std_logic_vector(7 downto 0);
    o: out std_logic_vector(7 downto 0)
    );
    end lop;

    architecture Behavioral of lop is
    ----------------------------------------------------------


    signal sat:integer range 2 to 4095;
    signal cnt:integer range 0 to 4095;


    type mee is array(0 to 4095)of std_logic_vector(7 downto 0);
    signal me:mee;

    --------------------save data------------------------------
    begin

    process(int1)

    begin

    if (int1' event and int1='1&#039then

    me(cnt)<=a;





    cnt<=cnt+1;

    end if;

    end process;

    ------------
    process(int2)

    begin

    if (int2' event and int2='1&#039then

    if me(sat)="11111111"then
    o<="11001100";
    else
    o<="00000000";
    end if;





    sat<=sat+1;

    end if;

    end process;
    ----------------------------------------
    end Behavioral;

    گسترده تر از هر چیز دل مومن است(امام علی (ع))
    [glow=red,2,300]R[/glow]
    [glow=green,2,300]G[/glow]
    [glow=blue,2,300]B[/glow]
  8. #8
    تاریخ عضویت
    2011/05/12
    366
    11

    پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ spartan3-4pq208

    نقل قول نوشته اصلی توسط siamakb
    سلام.
    کد دوم رو اشتباه گذاشتم.
    منظورم این کد بود ولی ارور میده.بصورت ترتیبی هم نوشتم.
    نمی دونم جرا با این شرط مشکل داره!
    اون برنامه که شما نوشتی ادرس رو از پین ورودی می گرفت که من اون رو حذف کردم و به جا signal cnt رو قرار دادم و در پروسس دوم یه شرط برایه مقایسه ارایه نوشتم چون نمی خوام همون مقداره خونده شده به پین خروجی بره. اگه این برنامه ایرادی داره راهنماییم کنید.


    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;

    ---------------------------------------------------------

    entity lop is
    Port (

    int1 : in std_logic;
    int2 : in std_logic;
    a: in std_logic_vector(7 downto 0);
    o: out std_logic_vector(7 downto 0)
    );
    end lop;

    architecture Behavioral of lop is
    ----------------------------------------------------------


    signal sat:integer range 2 to 4095;
    signal cnt:integer range 0 to 4095;


    type mee is array(0 to 4095)of std_logic_vector(7 downto 0);
    signal me:mee;

    --------------------save data------------------------------
    begin

    process(int1)

    begin

    if (int1' event and int1='1&#039then

    me(cnt)<=a;





    cnt<=cnt+1;

    end if;

    end process;

    ------------
    process(int2)

    begin

    if (int2' event and int2='1&#039then

    if me(sat)="11111111"then
    o<="11001100";
    else
    o<="00000000";
    end if;





    sat<=sat+1;

    end if;

    end process;
    ----------------------------------------
    end Behavioral;

    با حذف آدرس ورودی و جایگزین کردنش با یک شمارنده اون بلاک رو از حالت حافظه خارج میکنید و دیگه کامپایلر تشخیص نمیده که شما قصد استفاده از رم داخلی FPGA رو دارید. اگه به اینترفیس رمها دقت کرده باشید همه شون از باس داده و باس آدرس برخوردارن که این بخش لازمه کاره، حالا برای اتصال یک شمارنده به یک باس آدرس، شما هر دو رو نیاز دارید تا یک رجیستر آدرس رو در خودش نگه داره و یک رجیستر عدد شمارنده رو، همونطور که گفتم به راحتی میشه از اون کد رم که براتون گذاشتم حتی چند اینستنس بگیرید و همزمان چند رم داشته باشید، حالا یک نمونه براتون میذارم شاید با کد بهتر متوجه بشید.

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;

    entity lop is
    Port (
    clk : in std_logic;
    read_nwrite : in std_logic;
    write_data: in std_logic_vector(7 downto 0);
    read_data: out std_logic_vector(7 downto 0)
    );
    end lop;

    architecture Behavioral of lop is

    component single_port_ram is

    generic
    (
    DATA_WIDTH : natural := 8;
    ADDR_WIDTH : natural := 8
    );

    port
    (
    clk : in std_logic;
    addr : in natural range 0 to 2**ADDR_WIDTH - 1;
    data : in std_logic_vector((DATA_WIDTH-1) downto 0);
    we : in std_logic := '0';
    q : out std_logic_vector((DATA_WIDTH -1) downto 0)
    );
    end component;

    signal Address_Counter: std_logic_vector(7 downto 0);
    signal Address_Counter_Unsigned: unsigned(7 downto 0) := x"00";
    begin
    u0: single_port_ram port map (
    not clk, Address_Counter, write_data, not read_nwrite, read_data
    );

    Address_Counter(0) <= Address_Counter_Unsigned(0);
    Address_Counter(1) <= Address_Counter_Unsigned(1);
    Address_Counter(2) <= Address_Counter_Unsigned(2);
    Address_Counter(3) <= Address_Counter_Unsigned(3);
    Address_Counter(4) <= Address_Counter_Unsigned(4);
    Address_Counter(5) <= Address_Counter_Unsigned(5);
    Address_Counter(6) <= Address_Counter_Unsigned(6);
    Address_Counter(7) <= Address_Counter_Unsigned(7);

    process(clk)
    begin
    if (rising_edge(clk))then
    if(read_nwrite = '1&#039then
    Address_Counter_Unsigned <= Address_Counter_Unsigned + 1;
    end if;
    end if;
    end process;

    end Behavioral;













    --Library
    library ieee;
    use ieee.std_logic_1164.all;

    --Single Port RAM
    entity single_port_ram is

    generic
    (
    DATA_WIDTH : natural := 8;
    ADDR_WIDTH : natural := 8
    );

    port
    (
    clk : in std_logic;
    addr : in natural range 0 to 2**ADDR_WIDTH - 1;
    data : in std_logic_vector((DATA_WIDTH-1) downto 0);
    we : in std_logic := '0';
    q : out std_logic_vector((DATA_WIDTH -1) downto 0)
    );

    end entity;

    architecture rtl of single_port_ram is

    -- Build a 2-D array type for the RAM
    subtype word_t is std_logic_vector((DATA_WIDTH-1) downto 0);
    type memory_t is array(2**ADDR_WIDTH-1 downto 0) of word_t;

    -- Declare the RAM signal.
    signal ram : memory_t;

    -- Register to hold the address
    signal addr_reg : natural range 0 to 2**ADDR_WIDTH-1;

    begin

    process(clk)
    begin
    if(rising_edge(clk)) then
    if(we = '1&#039 then
    ram(addr) <= data;
    end if;

    -- Register the address for reading
    addr_reg <= addr;
    end if;
    end process;

    q <= ram(addr_reg);

    end rtl;


    مثلا در این کد یک پایه کلاک، یک پایه خوندن یا نوشتن و دو باس داده وجود داره که از یکی میشه دیتا رو خوند و در دیگری نوشت، هر دفعه که عمل خوندن انجام میشه هم آدرس داخلی یکی اضافه میشه و اگر هم به آخر برسه باز میره از اول آدرس صفر شروع میکنه و میره جلو، حالا اگه عمل خوندن انجام شده و قصد نوشتن دارین کافیه پایه خوندن یا نوشتن صفر بشه و یک کلاک کامل یعنی یک بالا رونده و یک پایین رونده به پایه کلاک زده بشه تا عمل نوشتن کامل بشه، در زمان خوندن هم کافیه پایه نوشتن و خوندن برابر یک منطقی بشه و بازهم یک کلاک کامل زده بشه.
    اسمایل، تومورو ویل بی وُرس
  9. #9
    تاریخ عضویت
    2006/11/09
    زیره آسمون آبی
    177
    1

    پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ spartan3-4pq208

    سلام
    ممنون از برنامه ها.
    مشکل برنامم فهمیدم چی بود.دانتر sat رو اشتباه تعریف می کردم.
    بازم ازت ممنونم
    اینم برنامه درست:
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;

    ---------------------------------------------------------
    entity lop is
    Port (int1 : in std_logic;
    int2 : in std_logic;
    a: in std_logic_vector(7 downto 0);
    o: out std_logic_vector(7 downto 0):="00000000"
    );
    end lop;
    architecture Behavioral of lop is
    ----------------------------------------------------------
    signal sat:integer range 0 to 4095;
    signal sat_next:integer range 0 to 4095;
    signal cnt:integer range 0 to 4095;

    type mee is array(0 to 4095)of std_logic_vector(7 downto 0);
    signal me:mee;
    --------------------save data------------------------------
    begin
    process(int1)
    begin
    if (int1' event and int1='1' )then
    me(cnt)<=a;
    cnt<=cnt+1;
    end if;
    end process;
    -----------------------------------------------------
    process(int2)
    begin
    if (int2' event and int2='1&#039then

    if "10101010"=me(sat) then
    o<="11110000";
    else
    o<="00000000";
    end if;

    sat_next<=sat+1;
    sat<=sat_next;

    end if;
    end process;
    ----------------------------------------
    end Behavioral;
    گسترده تر از هر چیز دل مومن است(امام علی (ع))
    [glow=red,2,300]R[/glow]
    [glow=green,2,300]G[/glow]
    [glow=blue,2,300]B[/glow]
نمایش نتایج: از 1 به 9 از 9

موضوعات مشابه

  1. پاسخ: 4
    آخرين نوشته: 2016/01/16, 18:08
  2. پاسخ: 4
    آخرين نوشته: 2013/03/15, 07:05
  3. تعداد زیاد ورودی برای 8051
    توسط nasibanouri در انجمن سایر مطالب مرتبط با ميکرو ها و پروسسورها
    پاسخ: 6
    آخرين نوشته: 2012/10/30, 12:30
  4. شمارش تعداد پالس های یک ورودی
    توسط maryam-68 در انجمن سایر مطالب مرتبط با ميکرو ها و پروسسورها
    پاسخ: 4
    آخرين نوشته: 2011/10/21, 10:41
  5. محاسبه تعداد ماکزیمم ورودی و خروجی در آی سی
    توسط umbra در انجمن مفاهیم پایه برق و الکترونیک
    پاسخ: 1
    آخرين نوشته: 2008/11/03, 17:02

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •