اطلاعیه

Collapse
No announcement yet.

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

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

    #16
    پاسخ : پردازش تصویر با استفاده از 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;

    دوستان این نوع کد هرگز رو سخت افزار سنتز نمیشه. فقط تو سیموله بهتون جواب میده. اگه رو سخت افزار کار نکرد اصلا تعجب نکنیدا
    خدا گفت : به جهنم ببریدش، او برگشت و با تعجب به خدا نگاه کرد. خدا گفت : به بهشت ببریدش. فرشتگان پرسیدند: چرا؟! خدا گفت : او هنوز به من امیدوار است...

    دیدگاه


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

      یک حلقه 512 تایی یعنی تولید 512 سخت افزار که اصلا منطقی نیست. شما باید با کانتر و مالتی پلکسر از یک سخت افزار 512 بار استفاده میکردین. fpga کنترلر نیست که مثل برنامه براش کد بنویسید. همه چیز طراحی دیجیتاله. اینا هرگز سنتز نخواهد شد
      خدا گفت : به جهنم ببریدش، او برگشت و با تعجب به خدا نگاه کرد. خدا گفت : به بهشت ببریدش. فرشتگان پرسیدند: چرا؟! خدا گفت : او هنوز به من امیدوار است...

      دیدگاه


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

        آقای نجفی درست میگن.این کدای loop و ... تا جایی که من میدونم توی استاندارد قبلی ieee حتی اصن قابل سنتز نبودن ولی الان قابل سنتز شدن ولی ابزار سنتز هنگام سنتز به ازای هر بار که loop تکرار میشه یک بار سخت افزار رو کپی میکنه.درسته که اینجوری سرعتکارتون شاید افزایش پیدا کنه ولی سخت افزار به شدت اشغال میشه و ممکنه اصن پیاده سازی نشه...
        البته بحث خیلی ادامه داره....

        دیدگاه


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

          من این برنامه رو کامپایل کردم، متاسفانه خطا داد .. پشت سر هم . . هنوز موفق نشدم خطاها رو رفع کنم. :NO:

          نوشته اصلی توسط مهندس 80

          به نظر میاد که تو برنامه ای که گذاشتید، میخواهید تمام مانریس را در
          [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]

          دیدگاه

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