اطلاعیه

Collapse
No announcement yet.

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

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

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

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

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

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

    دیدگاه


      #3
      پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ 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
        پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ 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
          پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ 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
            پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ spartan3-4pq208

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

            http://www.seas.upenn.edu/~ese171/vhdl/vhdl_primer.html
            اسمایل، تومورو ویل بی وُرس

            دیدگاه


              #7
              پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ 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
                پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ 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
                  پاسخ : تعداد بایتی که می شه از ورودی گرفت؟ 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]

                  دیدگاه

                  لطفا صبر کنید...
                  X