اطلاعیه

Collapse
No announcement yet.

پردازش تصویر با استفاده از vhdl

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

    پردازش تصویر با استفاده از vhdl

    سلام بر دوستان گرامی
    پروژه بنده نهان نگاری در تبدیل ویولت هستش که ابتدا در متلب پیاده سازی کردم و الان مونده vhdl
    ابتدا می خوام یک تصویر را در fpga دریافت کنم و به صورت ماتریس دربیارم
    برای این کار باید از ارایه دوبعدی استفاده کنم اما من زیاد با ارایه کار نکردم
    به نظر ساده می یاد
    اگر کسی میدونه لصفا راهنمایی کنه
    بعد از حل این مشکل ان شاءالله ادامه را می نویسیم تا علاوه بر کمک به من دوستان دیگر نیز مطالبی را یاد بگیرند
    سپاس
    ايميل من:peymankzv@gmail.com

    #2
    پاسخ : پردازش تصویر با استفاده از vhdl

    برای دریافت تصویر خودم برنامه زیر را نوشتم اما خطا میده که دارم بهش ور می رم اما جواب نداده تا حالا
    یه نگاهی بهش بنداید ببینید درسته یا نه؟

    library ieee;
    use ieee.std_logic_1164.all;
    entity getpx1 is
    port (a:in bit;
    clk: in std_logic;
    w:in bit;
    r0:inout std_logic_vector(7 downto 0);
    c:inout std_logic_vector(7 downto 0));
    end getpx1;
    architecture p1 of getpx1 is
    type get is array(63 downto 0,63 downto 0)of integer (255 downto 0);
    signal gets:get;
    begin
    process(clk)
    begin
    if(clk'event and clk='1&#039then
    if (w='1&#039then
    for i in 0 to 7 loop
    c(i)<=a;
    end loop;
    r0<=conv_integer(c);
    gets(row,col)<=r0;
    col<=col+1;
    if (col='63&#039 then
    row<=row+1;
    col<='0';
    end if;
    end if;
    end process;
    end p1;
    ايميل من:peymankzv@gmail.com

    دیدگاه


      #3
      پاسخ : پردازش تصویر با استفاده از vhdl

      انگار کد بالا یه کم ناخواناست

      library ieee;
      use ieee.std_logic_1164.all;
      entity getpx1 is
      port (a:in bit;
      clk: in std_logic;
      w:in bit;
      r0:inout std_logic_vector(7 downto 0);
      c:inout std_logic_vector(7 downto 0));
      end getpx1;
      architecture p1 of getpx1 is
      type get is array(63 downto 0,63 downto 0)of integer (255 downto 0);
      signal gets:get;
      begin
      process(clk)
      begin
      if(clk'event and clk='1&#039then
      if (w='1&#039then
      for i in 0 to 7 loop
      c(i)<=a;
      end loop;
      r0<=conv_integer(c);
      gets(row,col)<=r0;
      col<=col+1;
      if (col='63&#039 then
      row<=row+1;
      col<='0';
      end if;
      end if;
      end process;
      end p1;

      ايميل من:peymankzv@gmail.com

      دیدگاه


        #4
        پاسخ : پردازش تصویر با استفاده از vhdl

        یعنی کسی قبلا کارنکرده و یا علاقه داشته باشه تو این زمینه که کمک کنه؟؟!!
        ايميل من:peymankzv@gmail.com

        دیدگاه


          #5
          پاسخ : پردازش تصویر با استفاده از vhdl

          برای قسمت اول برنامه دریافت ماتریس عکس به صورت زیر ویرایش کردم که مشکلی نداره و فقط نمی دونم درست کار می کنه یا نه؟

          library ieee;
          use ieee.std_logic_1164.all;
          use IEEE.std_logic_signed.all;
          entity getpx3 is
          port (a:in std_logic;
          clk: in std_logic;
          w:in std_logic
          );

          end getpx3;
          architecture p1 of getpx3 is
          type get is array(63 downto 0,63 downto 0)of integer range 0 to 255;
          signal gets:get;
          signal c:std_logic_vector(7 downto 0);
          signal r0:integer range 0 to 255;
          signal row,col:integer range 0 to 63;

          begin
          process(clk)
          begin
          if(clk'event and clk='1&#039then
          if (w='1&#039then
          for i in 7 downto 0 loop

          c(i)<=a;
          end loop;
          r0<=conv_integer(c);
          gets(row,col)<=r0;
          col<=col+1;
          if ((col=63)and(row<63))then
          row<=row+1;
          col<=0;
          end if;
          end if;
          end if;
          end process;
          end p1;
          ايميل من:peymankzv@gmail.com

          دیدگاه


            #6
            پاسخ : پردازش تصویر با استفاده از vhdl

            در یک نگاه سریع این کد به نظر درست میاد ولی دوست عزیز بهتزین راه برای اطمینان از کدهایی که مینویسید شبیه سازی اونهاست. برای من در این کد مشخص نیست که آیا دیتا LSB First هست یا بر عکس.
            برای شبیه سازی می تونید از نرم افزار Modelsim استفاده کنید.
            همچنین توصیه می کنم که از Handshaking های بیشتری در کدتون استفاده کنید مثلا برای ابتدا و انتهای هر فریم و و Enable کردن بلوک و ...
            یا علی.

            دیدگاه


              #7
              پاسخ : پردازش تصویر با استفاده از vhdl

              منظور از این جمله تون چیه؟
              مشکلی نداره و فقط نمی دونم درست کار می کنه یا نه؟
              یا علی.

              دیدگاه


                #8
                پاسخ : پردازش تصویر با استفاده از vhdl

                سپاس سعی میکنم رعایت کنم
                منظورم اینه که کامپایل میشه ولی شبیه سازی نکردم
                مهندس جان اگر بخواهم یک فایل تصویر که به صورت ماتریس در یک متن ذخیره شده را بخوانم چه باید بکنم؟
                برای امتحان کد ادامه برنامه به این مورد نیاز دارم
                ايميل من:peymankzv@gmail.com

                دیدگاه


                  #9
                  پاسخ : پردازش تصویر با استفاده از vhdl

                  برای شبیه سازی کامل برنامه تون باید یک TestBench آماده کنید. در این TB شما میتونید اطلاعات فایل تصویر رو از یک فایل متنی یا باینری بخونید. برای این کار از کتابخانه STD.TEXTIO باید استفاده کنید.
                  به مثال زیر توجه کنید.


                  use std.textio. all ; -- make textio accessible
                  architecture behave of filehandling is

                  signal number : positive;
                  signal sum : natural;
                  file myfile : text open read_mode is ”data.txt”;

                  begin

                  process
                  variable l : line; -- declare a line variable
                  variable fnumber : positive;
                  variable fsum : natural;
                  begin
                  if not endfile(myfile) then -- if the file is not empty ...
                  readline(myfile,l); -- ... read a line ...
                  read(l,fnumber); -- ... read the 1st element ...
                  read(l,fsum); -- ... and then the 2nd element
                  ...
                  end architecture behave;
                  یا علی.

                  دیدگاه


                    #10
                    پاسخ : پردازش تصویر با استفاده از vhdl

                    سلام

                    برنامه برای خواندن ماتریس تصویر را تا جاهایی نوشتم
                    اما یک مشکل
                    در برنامه نوشته شده از دو آرایه استفاده شده یکی دوبعدی برای انتقال کامل ماتریس و یکی یک بعدی برای استخراج هر ستون
                    زیرا دستور
                    readline
                    خط به خط می خواند و ما باید هر خط که 512 المان در آن دارد را وارد آرایه دوبعدی کنیم برای همین هر خط را در یک آرایه یک بعدی ریختیم
                    اما پس از شبیه سازی آرایه یک بعدی المان های سطر را دریافت می کند اما خروجی دو بعدی کاملا صفر است!
                    و جالب این که من دربعدی را به متغییر زیر ریختم
                    outelement2<=pxmat(row,i)
                    و این متغییر خروجی دارد اما آرایه دوبعدی ما 0 نشان می دهد!!!
                    برنامه را در زیر گذاشتم
                    اگر راه حلی به ذهنتان می رسد ممنون می شوم راهنمایی فرمایید
                    سپاس
                    پ.ک

                    library ieee;
                    use ieee.std_logic_1164.all;
                    use IEEE.std_logic_signed.all;
                    use std.textio.all;-----------need for use read
                    entity matrix1 is
                    port(clk:in std_logic;
                    outelement,outelement2:inout integer range 0 to 255);
                    end matrix1;
                    architecture mat_read of matrix1 is
                    type px is array(511 downto 0,511 downto 0)of integer range 0 to 255;------array for save matrix
                    type read_col is array(511 downto 0)of integer range 0 to 255;--------array for read column in each line
                    signal read_column:read_col;
                    signal pxmat:px;
                    signal row,col:integer range 0 to 511:=0;------------their show row and column
                    begin
                    process(clk)
                    file data_out: text;
                    variable fstatus: FILE_OPEN_STATUS;
                    variable count: integer range 0 to 511:= 0;
                    variable buf: LINE;---------- buffer between the program and file
                    begin
                    file_open(fstatus, data_out, "mat2.txt", read_mode);-----------open file and save it in data_out-------data_out and "mat" have same format
                    if( clk'event and clk='1' )then
                    readline(data_out,buf);--------read from data_out and write in buf

                    for i in 0 to 511 loop
                    read(buf,count);--------transfer into count
                    read_column(i)<=count;---------each element of read_column is one element of column
                    outelement<=read_column(i);------------for show output(just uses in simulating)
                    pxmat(row,i)<=read_column(i);------------transfer into array
                    outelement2<=pxmat(row,i);------------for show output(just uses in simulating)
                    end loop;
                    col<=col+1;-------for change column
                    if ((col=511)and(row<511))then----------for chek and change row
                    row<=row+1;
                    col<=0;
                    end if;
                    end if;
                    end process;
                    end mat_read;
                    ايميل من:peymankzv@gmail.com

                    دیدگاه


                      #11
                      پاسخ : پردازش تصویر با استفاده از vhdl

                      به نظر میاد که تو برنامه ای که گذاشتید، میخواهید تمام مانریس را در
                      [glow=red,2,300]یک کلاک[/glow]
                      خونده و اونو تو سیگنال
                      pxmat قرار بدید
                      .
                      چون پروسس اصلی برنامه به ازای هر پالس کلاک یک بار اجرا میشه.

                      توجه کنید که شما مقداری رو که از فایل میخونید به یک سیگنال اختصاص دادید
                      (read_column(i))
                      که این سیگنال در پالس کلاک حاضر هنوز مقدار نگرقته و از همون استفاده کردید برای مقدار دهی به سیگنالهای دیگه

                      تو این برنامه
                      outelement و outelement2
                      نمیتونن مقدار بگیرن.

                      توضیح بدید که چطوری میخواهید ماتریس خونده بشه. مثلا به ازای هر پالس کلاک یک مقدار در خروجی قرار بگیره؟

                      من تغییراتی تو برنامه دادم و براتون میفرستم(با توجه به برداشتی که داشتم). تست کنید تا ببینید مشکلتون حل شده.

                      library IEEE;
                      use ieee.std_logic_1164.all;
                      use IEEE.std_logic_signed.all;
                      use std.textio.all;-----------need for use read

                      entity matrix1 is
                      port( clk:in std_logic;
                      outelement,outelement2:inout integer range 0 to 255);
                      end matrix1;
                      architecture mat_read of matrix1 is
                      type px is array(511 downto 0,511 downto 0)of integer range 0 to 255;------array for save matrix
                      type read_col is array(511 downto 0)of integer range 0 to 255;--------array for read column in each line
                      signal read_column:read_col;
                      signal pxmat:px;
                      signal row,col:integer range 0 to 511:=0;------------their show row and column
                      begin
                      process
                      file data_out: text;
                      variable fstatus: FILE_OPEN_STATUS;
                      variable count: integer range 0 to 511:= 0;
                      variable buf: LINE;---------- buffer between the program and file

                      begin
                      file_open(fstatus, data_out, "mat2.txt", read_mode);-----------open file and save it in data_out-------data_out and "mat" have same format
                      for iRow in 0 to 511 loop
                      readline(data_out,buf);--------read from data_out and write in buf

                      for iCol in 0 to 511 loop
                      read(buf,count);--------transfer into count
                      pxmat(iRow,iCol) <=count;------------transfer into array
                      end loop;--col

                      end loop;--row
                      wait;
                      end process;

                      process (clk)

                      begin
                      if( clk'event and clk='1' )then
                      if col/=511 then
                      col<=col+1;
                      else
                      col<=0;
                      if row/=511 then
                      row<=row+1;
                      else
                      row<=0;
                      end if;
                      end if;
                      outelement<=pxmat(row,col);
                      end if;
                      end process;

                      end mat_read[/left][/left]
                      یا علی.

                      دیدگاه


                        #12
                        پاسخ : پردازش تصویر با استفاده از vhdl

                        داداش دست مریزاد
                        گل کاشتی :applause:
                        انصافا حسابی گیج شده بودم
                        برنامه را اجرا کردم جواب داد و شبیه سازی هم مطلوب بود
                        سپاس فراوان
                        پس تا اینجا خوندن تصویر از روی حافظه حل شد
                        حالا باید بریم سراغ مرحله بعد-اینا را می نویسم برای دوستان علاقه مند که استفاده کنند-
                        ايميل من:peymankzv@gmail.com

                        دیدگاه


                          #13
                          پاسخ : پردازش تصویر با استفاده از vhdl

                          اگر بخواهیم برعکس کار بالا را بکنیم یعنی یک آرایه دوبعدی را داخل یک فایل متنی بنویسیم چه کاری باید انجام دهیم
                          کارم فوریه
                          ايميل من:peymankzv@gmail.com

                          دیدگاه


                            #14
                            پاسخ : پردازش تصویر با استفاده از vhdl

                            شما میتونی از دستور wirite ,writeline استفاده کنی. مثال زیر


                            کد:
                            ARCHITECTURE BehaveOF Files	IS
                            TYPE	Times	IS FILE OF	TIME;
                            TYPE	Stimuli	IS FILE OF	BIT_VECTOR(3	DOWNTO	0);
                            FILE outFile	: Stimuli	OPEN	WRITE_MODEIS ”C:\proj\out.bin”;
                            FILE	timeFile	:	Times	OPEN	READ_MODE	 IS	”C:\proj\time.bin”;
                            FILE	inData	 :	Stimuli;
                            BEGIN
                            ...
                            VARIABLE	ok	:	FILE_OPEN_STATUS;
                            VARIABLE	t	:	TIME;
                            VARIABLE	bv	:	BIT_VECTOR(3	DOWNTO	0);
                            ...
                            FILE_OPEN(ok,inData,”C:\proj\indata.bin”,READ_MODE);
                            IF	ok	=	OPEN_OK	THEN
                            WHILE (NOT	ENDFILE(inData)	AND	NOT	ENDFILE(timeFile))	LOOP
                            READ(timeFile,t);
                            READ(inData,bv);
                            WAIT FOR	t;
                            WRITE(outFile,bv);
                            ...
                            FILE_CLOSE(outFile);
                            FILE_CLOSE(timeFile);
                            FILE_CLOSE(inData);
                            ...
                            END ARCHITECTURE	Behave;
                            یا علی.

                            دیدگاه


                              #15
                              پاسخ : پردازش تصویر با استفاده از vhdl

                              سلام مهندس اگه بتونی نتایج شیبه سازیتونم بزارین خیلی عالی میشه .. بعد یه موضوعی من متوجه نشدم که تست بنچ این برنامه چجوری میشه؟

                              دیدگاه

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