اطلاعیه

Collapse
No announcement yet.

راهنمایی برای رفع مشکلا برنامه های vhdl

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

    راهنمایی برای رفع مشکلا برنامه های vhdl

    سلام
    من3 تا سوال برنامه نویسی vhdl برای یکی از درسهام دارم برنامه 2 تا از سوالهارو نوشتم ولی ارور میده میشه منو راهنمایی کنید بگید باید چه کار کنم و اشکالات کجاست لطفا
    سوالات
    http://uploadkon.ir/?file=Doc1_4.pdf
    http://uploadkon.ir/?file=Doc1_1.doc

    در برنامه اول من از یک fanction استفاده کردم به نام to_integer واسه تبدیل bit_vector به natural این تابع در پکیج ieee.numeric_bit_unsigned است ولی برنامه نمیتونه این پکیج را پیداکنه و ارور میده چرا؟؟؟
    کد برنامه اول
    کد:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_bit_unsigned.all;
    
    entity Dual_Port_Ram is
     port (wr_ck : in bit;
     rd_ck : in bit ;
      wr_addr : in bit_vector(3 downto 0);
     rd_addr : in bit_vector (3 downto 0);
     d_out : out bit_vector(7 downto 0);
      d_in : in bit_vector(7 downto 0);
      wr_en,rd_en :in bit);
     end entity Dual_Port_Ram ;
     
     architecture behavior of Dual_Port_Ram is
      type memory_type is array (15 downto 0) of bit_vector (7 downto 0) ;
      signal ram :memory_type ;
      begin
       write: process(wr_ck) is
       begin
        if wr_ck'event and wr_ck ='1' then
         if wr_en='1' then
          if wr_addr /=rd_addr then
           ram(to_integer(wr_addr)) <= d_in;
          end if;
         end if;
        end if ;
       end process write ;
    این هم عکس ارورش
    http://uploadkon.ir/?file=Untitled_213.png
    لطفا منو راهنمایی کنید بگید اشکال کار کجاست من حتما بادی جواب بگیرم و بتونم برنامه را کامپیال کنم و برای استادم بفرستم

    #2
    پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl

    حالا برنامه سوال دوم
    این جا هم علاوه بر داشتم مشکل قبلی کلی ارور دیگه دارم که اصلا نمیفهمم چرا

    کد برنامه سوال دوم

    کد:
    library ieee;
    use ieee.std_logic_1164.all;
    
    
    entity DualBuffer is
     port (d_in : in bit_vector(0 to 7);
      d_out: out bit_vector(0 to 7);
      wr_addr,ad_addr: in bit_vector( 0 to 3);
      wr_en1:in bit;
      wr_en2:in bit;
      rd_en1: in bit;
      rd_en2:in bit;
      wr_clk : in bit;
      rd_clk : in bit);
     end entity ;
     
     architecture struct of DualBuffer is
      signal empty,full :bit;
      signal counter1,counter2 : integer :=0;
      signal flag : bit:='1';
      component Ram is
       port( d_in :in bit_vector (0 to 7);
        d_out :out bit_vector(0 to 7);
        wr_clk,rd_clk : in bit ;
        wr_en,rd_en:in bit;
        wr_addr:in bit_vector(0 to 3);
        rd_addr :in bit_vector (0 to 3));
       end component Ram;
       
       begin
        Ram1 : component Ram
        port map (d_in =>d_in,d_out=>d_out,wr_en=>wr_en1,rd_en=>rd_en1,wr_addr=>wr_addr,rd_addr=>rd_addr,wr_clk=>wr_clk,rd_clk=>rd_clk);
        
        Ram2 :component Ram
        port map (d_in =>d_in ,d_out=>d_out,wr_en=>wr_en2,rd_en=>rd_en2,wr_addr=>wr_addr,rd_addr=>rd_addr,wr_clk=>wr_clk,rd_clk=>rd_clk);
        
        read : process (rd_clk) is
        begin
         if (rd_clk'event and rd_clk='1') then
          if (rd_en1='1') then
           if (wr_en1='0') then
            if (counter1 /=0) then
            d_in<=Ram1(to_integer(rd_addr));
            counter1<= counter1 -1;
            flag <='0';
            else --Ram1 is empty
            wr_en1 <='1';
            rd_en1<= '0';
            wr_en2 <='0';
            rd_en2<='1';
            counter1 <=0;
           end if;
          end if;
         elsif (rd_en2='1') then
          if(wr_en2='0') then
           if(counter2 /=0)then
            if (flag /='1')then
             d_in<=Ram2(to_integer(rd_addr));
             counter2<= counter2 -1;
            else --Ram2 is empty
             rd_en2<= '0';
             wr_en2<= '1';
             wr_en1<= '0';
             rd_en1<= '1';
             counter2 <=0;
            end if;
           end if;
          end if;
         end if;
        end process ;
        
         write:process (wr_clk) is
         begin
         if(wr_clk'event and wr_clk='1')then
          if(wr_en1='1')then
           if(rd_en='0')then
           Ram1(to_integer(wr_addr))<=d_out;
           counter1<=counter1+1;
          else --Ram1 is full
            wr_en1 <='0';
            rd_en1<='1';
            wr_en2<='1';
            rd_en<='0';
            counter1<=16;
           end if;
          end if;
         elsif(wr_en2='1')then
           if(rd_en2='0')then
             if(counter2 /=16)then
             Ram2(to_integer(wr_addr))<=d_out;
             counter2<=counter2+1;
            else --Ram2 is full
               wr_en2 <='0';
               rd_en2 <='1';
               wr_en1 <='1'
               rd_en1 <='0';
               counter2<=16;
              end if;
             end if;
            end if;
           end if;
          end process ;
          
          fullempty:process() is
          begin
          
          if(rd_en2='1' and wr_en1='1')then
           if(counter1=16 and counter2 /=0) then
           full<='1';
          end if;
         elsif(rd_en1='1' and wr_en2='1')then
            if(counter1 /=0 and counter2=16)then
             full<='1';
            end if;
         elsif (rd_en2='1' and wr_en1='1' )then
            if( counter1 /=16 and counter2='0') then
              empty<= '1';
            end if;
         elsif(rd_en1='1' and wr_en2 ='1') then
            if(counter1=0 and counter2 /=16) then
            empty <='1';
            end if;
        end if;
       end process fullempty;
      end architecture;
      
      configuration conection of DualBuffer is
       for struct
         for Ram1,Ram2:Ram
           use entity work.Dual_Port_Ram(behavior);
          end for;
         end for ;
        end configuration conection ;
    و اما عکس ارور های این برنامه
    http://uploadkon.ir/?file=erorr buffer_1.png
    نمیفهمم چرا خطهای 47-50 و61-64و80-82و90-95 ارور میده من که این متغرهارا به صورت پورت ورودی تعریف کردم

    دیدگاه


      #3
      پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl

      و در مورد سوال سوم
      من اصلا نمیدونم واسه این باید چه کار کنم
      یکی یکم منو راهنمایی کنه :sad:
      :cry:

      دیدگاه


        #4
        پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl

        هیچ کسی نیست منو راهنمایی کنه؟؟؟
        یعنی این سوالات اینقدر سخته :sad:
        لطفا منو واسه سوالهای 2-3 راهنمایی کنید :cry:

        دیدگاه


          #5
          پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl


          هیچ کسی نیست منو راهنمایی کنه؟؟؟
          یعنی این سوالات اینقدر سخته :sad:
          لطفا منو واسه سوالهای 2-3 راهنمایی کنید :cry:

          دیدگاه


            #6
            پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl

            یعنی هیچ کس نیست منو راهنمایی کنه؟؟؟؟؟؟؟؟؟؟؟؟؟/ :cry:


            کمی تغییر دادم اما باز ارور های نا مفهوم زیاد میده
            این کد برنامه

            کد:
             library ieee;
             use ieee.std_logic_1164.all;
             entity DualBuffer is
              port (d_in : in bit_vector(0 to 7);
               d_out: out bit_vector(0 to 7);
               wr_addr:inout bit_vector( 0 to 3);
               rd_addr:inout bit_vector( 0 to 3);
               wr_en1:inout bit;
               wr_en2:inout bit;
               rd_en1:inout bit;
               rd_en2:inout bit;
               wr_clk :inout bit;
               rd_clk :inout bit);
              end entity ;
              
              architecture struct of DualBuffer is
               signal empty,full :bit;
               signal counter1,counter2 : integer;
               signal flag : bit:='1';
               
               function bv_to_natural (bv: in bit_vector) return natural is
                 variable result : natural :=0;
                 begin
                  for index in bv'range loop
                   result :=result*2 +bit'pos(bv(index));
                  end loop;
                  return result;
                 end function bv_to_natural;
               
               component Ram is
                port( d_in :in bit_vector (0 to 7);
                 d_out :out bit_vector(0 to 7);
                 wr_clk,rd_clk :inout bit ;
                 wr_en,rd_en:inout bit;
                 wr_addr:inout bit_vector(0 to 3);
                 rd_addr :inout bit_vector (0 to 3));
                end component Ram;
                
                begin
                 Ram1 : component Ram
                 port map (d_in =>d_in,d_out=>d_out,wr_en=>wr_en1,rd_en=>rd_en1,wr_addr=>wr_addr,rd_addr=>rd_addr,wr_clk=>wr_clk,rd_clk=>rd_clk);
                 
                 Ram2 :component Ram
                 port map (d_in =>d_in ,d_out=>d_out,wr_en=>wr_en2,rd_en=>rd_en2,wr_addr=>wr_addr,rd_addr=>rd_addr,wr_clk=>wr_clk,rd_clk=>rd_clk);
                 
                 read : process is
                 begin
                  if (rd_clk'event and rd_clk='1') then
                   if (rd_en1='1') then
                    if (wr_en1='0') then
                     if (counter1 /=0) then
                     d_out<=Ram1(bv_to_natural(rd_addr));
                     counter1<= counter1 -1;
                     flag <='0';
                    else --Ram1 is empty
                     wr_en1 <='1';
                     wait for 10 ns;
                     rd_en1<= '0';
                     wait for 10 ns;
                     wr_en2 <='0';
                     wait for 10 ns;
                     rd_en2<='1';
                     wait for 10 ns;
                     counter1 <=0;
                    end if;
                   end if;
                  elsif (rd_en2='1') then
                   if(wr_en2='0') then
                    if(counter2 /=0)then
                     if (flag /='1')then
                      d_out<=Ram2(bv_to_natural(rd_addr));
                      counter2<= counter2 -1;
                     else --Ram2 is empty
                      rd_en2<= '0';
                      wait for 10 ns;
                      wr_en2<= '1';
                      wait for 10 ns;
                      wr_en1<= '0';
                      wait for 10 ns;
                      rd_en1<= '1';
                      wait for 10 ns;
                      counter2 <=0;
                     end if;
                    end if;
                   end if;
                  end if;
                 end if;
                 wait on rd_clk,rd_en1,wr_en1,counter1,rd_en2,wr_en2,counter2;
                 end process ;
                 
                 write:process is
                 begin
                 if(wr_clk'event and wr_clk='1')then
                    if(wr_en1='1')then
                      if(rd_en1='0')then
                        if(counter1 /=16) then
                           Ram1(bv_to_natural(wr_addr))<= d_in;
                           counter1<=counter1+1;
                        else --Ram1 is full
                          wr_en1 <='0';
                          wait for 10 ns;
                          rd_en1<='1';
                          wait for 10 ns;
                          wr_en2<='1';
                          wait for 10 ns;
                          rd_en2<='0';
                          wait for 10 ns;
                          counter1<=16;
                          wait for 10 ns;
                        end if;
                      end if;
             
                    elsif(wr_en2='1')then
                      if(rd_en2='0')then
                        if(counter2 /=16)then
                          Ram2(bv_to_natural(wr_addr))<=d_in;
                          counter2<=counter2+1;
                        else --Ram2 is full
                          wr_en2 <='0';
                          wait for 10 ns;
                          rd_en2 <='1';
                          wait for 10 ns;
                          wr_en1 <='1';
                          wait for 10 ns;
                          rd_en1 <='0';
                          wait for 10 ns;
                          counter2<=16;
                          wait for 10 ns;
                        end if;
                      end if;
                    end if;
                 end if;
                 wait on wr_clk,wr_en1,rd_en1,counter1,wr_en2,rd_en2,counter2;
                 end process ;
                  
                  fullempty:process is
                  begin
                  
                  if(rd_en2='1' and wr_en1='1')then
                    if(counter1=16 and counter2 /=0) then
                     full<='1';
                    end if;
                  elsif(rd_en1='1' and wr_en2='1')then
                     if(counter1 /=0 and counter2=16)then
                      full<='1';
                     end if;
                  elsif (rd_en2='1' and wr_en1='1' )then
                     if( counter1 /=16 and counter2=0) then
                       empty<= '1';
                     end if;
                  elsif(rd_en1='1' and wr_en2 ='1') then
                    if(counter1=0 and counter2 /=16) then
                    empty <='1';
                    end if;
                  end if;
                  wait ;
                end process fullempty;
              end architecture;
               
               configuration conection of DualBuffer is
                for struct
                  for Ram1,Ram2:Ram
                   use entity work.Dual_Port_Ram(behavior);
                  end for;
                 end for ;
               end configuration conection ;
            اینم عکس ارور هاش
            http://uploadkon.ir/?file=IMAG0004.jpg
            من نمیدونم چرا برای خط 53-72 ارور میده من که از یک تابع برای تبدیل بیت وکتور به نچرال استفاده کردم
            چرا به خطوط 7-8-9-10 و...... ارور های nonresolved میده؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
            یکی منو راهنمایی کنه لطفا

            دیدگاه


              #7
              پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl

              سلام
              ارور اول که به تبدیل bv_to_natural میگیره واسه اینه که تو کتابخونه use ieee.std_logic_1164.all چنین تبدیلی وجود نداره(من این تبدیل رو اولین باره که می بینم، نمی دونم اصلا" چنین تبدیلی وجود داره یا نه!)
              به نظر من این برنامه ای که نوشتی اصلا" اصول برنامه نویسی VHDL رو رعایت نمی کنه! اینو باید بدونی که این کد رو فقط می تونی simulation کنی و قابل پیاده سازی روی سخت افزار نیست(چون از time استفاده کردی!)
              اگه فقط هدفت شبیه سازیه که اصلا" بهتر بود از همون اول از integer استفاده می کردی، نه bit_vector!
              اگه می خوای کدی بنویسی که قابل پیاده سازی رو FPGA باشه بهتر بود از std_logic_vector و std_logic استفاده می کردی و واسه تبدیل از تبدیل هایی که تو کتابخونه های IEEE.numeric_std یا IEEE.STD_LOGIC_ARITH.ALL به اضافه IEEE.std_logic_unsigned واسه مثبت شدن اعداد استفاده می کردی.

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

              دیدگاه


                #8
                پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl

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

                دیدگاه


                  #9
                  پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl

                  من همانطور که در پست شماره اول گفتم در برنامه اول من از یک fanction استفاده کردم به نام to_integer واسه تبدیل bit_vector به natural این تابع در پکیج ieee.numeric_bit_unsigned است ولی برنامه نمیتونه این پکیج را پیداکنه و ارور میده در نیتجه مجبور شدم خودم این تابع را بنویسم و این تابع در برنامه اول جواب داد اما در برنامه شماره 2 ارور میده + کلی ارور بی منطق دیگه در مورد nonresolved
                  اگه شما اطلاعاتی دارید ممنون میشم منو راهنمایی کنید که چطوری ارور هاشو رفع کنم

                  دیدگاه


                    #10
                    پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl

                    در مورد ارروهای مربوط به کتابخونه ها ، احتمال میدم اگه طبق عکسی که گذاشتم عمل کنی مشکلت حل بشه(فقط دقت کن که اون بالا رو simulation هستا!)

                    دیدگاه


                      #11
                      پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl

                      در مورد سوال سوم هم این چیزی که می خواد ی انتقال داده سریاله! با این تفاوت که بجای ی بیت ی بایت(8 بیت) باید بفرستی.
                      باید ی ماشین حالت بنویسی (ترجیحا" با case) که چند تا وضعیت داشته باشه.
                      تو گام اول باید شرط start چک بشه و تا وقتی که شرط برقرار نشده باید تو وضعیت چک این شرط باقی بمونه.
                      اگه حالت اول برقرار بود میره به حالت های بعدی و به ازای هر دریافت کامل ی AF به فرستنده بر می گردونی.
                      چون سنکرون هم هست دیگه نیاز به flag هم نیست.

                      دیدگاه


                        #12
                        پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl

                        خیلی ممنونم از راهنمایی هاتون من دوباره روی تمریناتم کار میکنم و سعی میکنم برنامه سوم را بنویسم اگه باز مشکلی داشتم امیدوارم بازم راهنمایی کنید :redface:

                        دیدگاه


                          #13
                          پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl

                          حتما"

                          دیدگاه


                            #14
                            پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl

                            این تصاویر مربوط به چی است؟
                            من از نرم افزار مادل سیم استفاده میکنم این قسمت ها رو تا به حال ندیدم
                            در برنامه اول من یک رم تعریف کردم با یک سری پورت مربوط به خودش و نوشتن و خواندن از رم در برنامه دوم اومدم از برنامه اول کمک گرفتم همونطور که میبینید به صورت کامپوننت تعریف کردم اول این برنامه ها در 2 پوشه جدا بود و قسمت work این 2 پوشه جدا بود اما گفتم شاید اشکال از این موضو ع باشه اومدم جفت برنامه ها را در یک پوشه تعریف کردم و work هر دو یکی شد ولی باز م ارور میده
                            این ارور های nonresolved واسه چیه؟؟اخه من که به سیگناهایم چند مقدار نداده ام که بخواد تصمیم بگیره که کدام مقدار میشه مقدار نهایی؟

                            در مورد سوال 3 میشه بیشتر توضیح بدید من متوجه نشدم
                            میدونم چطوری case is بنویسم اما نفهمیدم این برنامه را چه طوری نبویسم؟ ماشین حالت چیه؟ من چه طوری یک باید بفرستم
                            خیلی ممنون میشم منو سر این برنامه اخر بیشتر راهنمایی کنید :redface:

                            دیدگاه


                              #15
                              پاسخ : راهنمایی برای رفع مشکلا برنامه های vhdl

                              از modelsim بیشتر واسه شبیه سازی استفاده میشه. بهتره از ise استفاده کنی که مال xilinx هست.
                              این ی نمونه از case هست که می تونی شیوه کارشو ببینی:
                              کد:
                                case (<2-bit select>) is 
                                 when "00" =>
                                   <statement>;
                                 when "01" =>
                                   <statement>;
                                 when "10" =>
                                   <statement>;
                                 when "11" =>
                                   <statement>;
                                 when others =>
                                   <statement>;
                                end case;
                              اما ی چیزی! اینکه هنوز خیلی از چیزای پایه ای واست سواله، نشون میده که هنوز رو VHDL مسلط نیستی. پیشنهاد میدم ی کتابی مثه کتاب سیدرضی رو ی بار بخونی. فکر کنم اینجوری زودتر به نتیجه برسی.

                              دیدگاه

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