اطلاعیه

Collapse
No announcement yet.

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

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

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

    من قصد ندارم به صورت حرفه ایی دنبال کنم vhdl را البته فعلا
    این ترم این درسو دارم و استادمم 3 تا تمرین گفته حل کنم که توی سومی موندم و اصلا نمیدونم چه طوری بنویسمش و اولی و دوم تقریبا حل شده است
    نرم افزاری هم که استاد بهمون داد و گفت ازش استفاده کنم مادل سیمه که به بدبختی نصبش کردم :surprised:
    بله من تقریبا سینتکس هاررو بلدم و منظورم این بود که متوجه نشدم که شما در مورد سوال سه چی گفتید یعنی چه جوری بنویسمش وگرنه میدونم case را چه طوری باید استفاده کنم
    میشه منو راهنمایی کنید؟

    دیدگاه


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

      خب بیا همون کد صفحه قبل رو تبدیل به ی ماشین حالت ساده کنیم که بهتر متوجه شی که چیکار باید بکنی.
      این کد خام:
      کد:
        case (<2-bit select>) is 
         when "00" =>
           <statement>;
         when "01" =>
           <statement>;
         when "10" =>
           <statement>;
         when "11" =>
           <statement>;
         when others =>
           <statement>;
        end case;
      حالا بیا فرض کنیم می خوایم چهار حالت پشت سر هم اجرا بشن.

      کد:
        case (state) is 
         when "00" =>
           state<="01";
         when "01" =>
           state<="10";
         when "10" =>
           state<="11";
         when "11" =>
           state<="00";
         when others =>
           null;
        end case;
      حالا اگه این پروسس داخل ی شرط حساس به کلاک باشه تو هر کلاک state ی مرحله میره جلوتر. می تونیم اونجاهایی که state مقدار می گیره شرط هم بذاریم و بسته به شرطمون state رو مقداردهی کنیم.
      می تونی تو تمرین سوم هم از این شیوه استفاده کنی، یعنی تو state اول منتظر بمونی که مقدار ورودی ی مقدار خاص بشه، اگه این اتفاق افتاد بره به state بعدی و همینطور ادامه بده. اگه هم شرط بر قرار نبود بسته به شرایط بره state بعدی یا کلا" برگرده به state اول.

      دیدگاه


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

        والا من نمیخوام به صورت حرفه ایی vhdl کار کنم استاد فقط این ترم سینتکس ها رو یادمون داده
        من این ترم این درسو دارم و استاد هم یک سری سوال داده که اولی حل شده دومی خیلی کار داره ارور میده ( من برنامه را خیلی تغییر دادم و چون از یک برنامه دیگه در برنامه اصلی استفاده کرده بودم گفتم شاید چون پوشه های این دو برنامه از هم جداست در یک پوشه تعریفشون کردم و یک تابع برای resolve بعضی از سیگنالها نوشتم که بهشون خطا میگرفت اما باز یک سری ارور دیگه میده )
        و مونده برنامه سوم که اصلا هیچی نمیدونم راجعبش اصلا من چه طوری باید بنویسمش؟؟؟میشه بیشتر راهنمایی کنید

        دیدگاه


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

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

          دیدگاه


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

            خیلی ممنون
            باشه من باز روش کار میکنم :redface:

            دیدگاه


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

              ببینید من در مورد تمرین سوم اینطوری فکر کردم ایا فکرم درسته؟
              من یک case is تعریف میکنم که در شرط اول میاد چک میکنه که ایا بایت اولش 055h هست یا نه اگر بود میاد داخل این قسمت اولcase یک ارایه تعریف میکنم به نام ra, بعد حلقه تعریف مکنم که به اطلاعات را از یک پورت ورودی بگیره و بریزه داخل این اریه ram من، یعنی درواقع دارم اون اطلاعاتی که به عنوان سریال برام اومده را ذخیره میکنم و شرط دیگه هم واسه Case چک کردن انتهای اون اطلاعات ارسالی باشه یعنی 0aah
              ایا به نظرتون اینها درسته؟؟؟جایی کمو کاست نداره؟
              فقط چند تا نکته میمونه
              1-در صورت سوال گفته که من n بایت اطلاعات باید به صورت سریال بگیرم و ذخیره کنم .خوب من در هنگام تعریف ارایه بهش محدوده نمیدم ولی وقتی میخوام بزارم توی حلقه for باید بگم تا چه زمانی این حلقه ادامه پیدا کنه ی رنج بهش بدم مگه نه ؟؟؟این n که برام مشخص نیست را چه طوری بیارمش توی کار؟؟؟
              2-من کل case را باید بزارم توی یک حلقه همیشه درست دیگه نه؟؟؟که مدام اطلاعات سریال را بگیره؟؟؟؟
              3-در قسمت کیس اول من باید یک حلقه دیگم بنویسم که اطلاعات هر بایت را با هم جمع کنه و بریزه در داخل بایت cksum دیگه؟؟؟
              ایا شما نکته دیگه ایی بنظرتون میرسه؟؟
              لطفا منو راهنمایی کنید اگه جایش نقص داره یا اگه جاش لازمه کار دیگه ایی بکنم تا من بعدا بشینم برنامشو بنویسم واگه ارور داشت باز ازتون راهنمایی بخواهم
              خیلی لطف میکنید :redface:

              دیدگاه


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

                ببینید من در مورد تمرین سوم اینطوری فکر کردم ایا فکرم درسته؟
                من یک case is تعریف میکنم که در شرط اول میاد چک میکنه که ایا بایت اولش 055h هست یا نه اگر بود میاد داخل این قسمت اولcase یک ارایه تعریف میکنم به نامram بعد حلقه تعریف مکنم که اطلاعات را از یک پورت ورودی بگیره و بریزه داخل این اریه ram من، یعنی درواقع دارم اون اطلاعاتی که به عنوان سریال برام اومده را ذخیره میکنم و شرط دیگه هم واسه Case چک کردن انتهای اون اطلاعات ارسالی باشه یعنی 0aah
                ایا به نظرتون اینها درسته؟؟؟جایی کمو کاست نداره؟
                فقط چند تا نکته میمونه
                1-در صورت سوال گفته که من n بایت اطلاعات باید به صورت سریال بگیرم و ذخیره کنم .خوب من در هنگام تعریف ارایه بهش محدوده نمیدم ولی وقتی میخوام بزارم توی حلقه for باید بگم تا چه زمانی این حلقه ادامه پیدا کنه ی رنج بهش بدم مگه نه ؟؟؟این n که برام مشخص نیست را چه طوری بیارمش توی کار؟؟؟
                2-من کل case را باید بزارم توی یک حلقه همیشه درست دیگه نه؟؟؟که مدام اطلاعات سریال را بگیره؟؟؟؟
                3-در قسمت کیس اول من باید یک حلقه دیگم بنویسم که اطلاعات هر بایت را با هم جمع کنه و بریزه در داخل بایت cksum دیگه؟؟؟
                ایا شما نکته دیگه ایی بنظرتون میرسه؟؟
                لطفا منو راهنمایی کنید اگه جایش نقص داره یا اگه جاش لازمه کار دیگه ایی بکنم تا من بعدا بشینم برنامشو بنویسم واگه ارور داشت باز ازتون راهنمایی بخواهم
                خیلی لطف میکنید :redface:

                دیدگاه


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

                  کد:
                  library ieee;
                  use ieee.std_logic_1164.all;
                  use ieee.numeric_bit_unsigned.all;
                  
                  package test is
                   subtype byte is bit_vector(0 to 7);
                  end package;
                  
                  use work.test.all;
                  
                  entity serial is
                   port (d_in:in byte,clock : in bit);
                   end entity;
                   
                   architecture behavior of serial
                   
                   signal cksum:byte:=x"00";
                   signal correct:byte:=x"00";
                   type ram_array is array (natural range <>) of byte;
                   begin
                    process is
                     variable index_range: integer:=0;
                     begin
                       loop
                        if (d_in =x"55) then
                         wait on clock;
                         index_renge:=conv_integer(d_in);
                         signal ram:ram_array(index_renge -4);
                         for i in ram'renge loop
                          wait on clock;
                          ram(i)<= d_in;
                          cksum<= "+"(cksum,d_in);
                         end loop;
                        else 
                         wait on clock;
                       end loop;
                      end process;
                     end architecture;
                  برنامه ای که نوشتم اینه درسته ایا همه موارد را در نظر گرفتم؟؟؟از نظر مفهومی درسته ؟؟؟
                  ایا لازمه چیزی بهش اضافه کنم؟
                  لطفا منو راهنمایی کنید این تمرین ممکنه توی سوال امتحانی فردا بیاد
                  صورت این برنامه در پست اول است

                  دیدگاه


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

                    من در انیجا شرط stop byte را چک نکردم به نظرم لازم نبود
                    ایا لازمه؟؟؟
                    من گفتم چون گفته سنکرون با هر پالس ساعت یک بایت میاد به عنوان d_in اگه باید ورودی بود که میاد داخل if ومیگم باز صبر کن تا یک کلاک بگذره وقتی کلاک گذشت بایت بعدی در d_in همان تعداد اطلاعات است اومدم این تعداد اطلاعات را از ش 4 تا کم کردم واسه اینکه توی شکل میبینید که علاوه بر اطلاعات من 2 بایت اول و2 بایت اخر دارم که اضافه است و اطلاعات نیست که ذخیرش کنم بعد هم جمع کردم اطلاعات را چون صورت مسئه خواست که درcksum بزیرم و بعد دوباره wait on clock واسه اینکه بره برسه به باید شروع بعدی و همه اینها در یک loop است ایا درسته؟؟؟این استدلال ها
                    لطفا ایا جایی کمو کاست داره کاره دیگه ایی باید انجام بده؟؟؟؟

                    دیدگاه


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

                      ی کد برات ایمیل کردم. ببین اگه سوالی داشتی به همون ایمیلم pm بده.
                      ولی انصافا" کار داشتما :cry2:
                      فرصت نکردم سنتزش کنم(تو note pad نوشتم) ولی فکر نکنم ارور بده.

                      دیدگاه


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

                        یاهو میگه ایمیلت وجود نداره! ی آدرس ایمیل که کار می کنه بده ! :eek:

                        دیدگاه


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

                          این برنامه من است و من این ارور ها رو میگیرم باید چه کنم ارور ها بره؟
                          ارورهای من:

                          ** Error: D:/Nasha/VHDL/tamrinat in terme khodemon/test/buffer.vhd(49): Cannot resolve indexed name as type ieee.std_logic_1164.std_logic_vector.
                          ** Error: D:/Nasha/VHDL/tamrinat in terme khodemon/test/buffer.vhd(68): Cannot resolve indexed name as type ieee.std_logic_1164.std_logic_vector.
                          ** Error: D:/Nasha/VHDL/tamrinat in terme khodemon/test/buffer.vhd(94): Illegal target for signal assignment.
                          ** Error: D:/Nasha/VHDL/tamrinat in terme khodemon/test/buffer.vhd(94): Prefix of indexed name must be an array.
                          ** Error: D:/Nasha/VHDL/tamrinat in terme khodemon/test/buffer.vhd(113): Illegal target for signal assignment.
                          ** Error: D:/Nasha/VHDL/tamrinat in terme khodemon/test/buffer.vhd(113): Prefix of indexed name must be an array.
                          ** Error: D:/Nasha/VHDL/tamrinat in terme khodemon/test/buffer.vhd(155): VHDL Compiler exiting
                          برنامه من:
                          کد:
                          library ieee;
                          use ieee.std_logic_1164.all;
                          use ieee.std_logic_arith.all;
                          use ieee.std_logic_unsigned.all;
                          use ieee.numeric_bit.all;
                           
                          
                          entity DualBuffer is
                           port(d_in : in std_logic_vector(0 to 7);
                              d_out: out std_logic_vector(0 to 7);
                              wr_addr:in natural range 1 to 16;
                              rd_addr:in natural range 1 to 16;
                              wr_clk :in std_logic;
                              rd_clk :in std_logic);
                           end entity ;
                           
                           architecture struct of DualBuffer is
                            signal empty,full :bit;
                            signal counter1,counter2 :std_logic_vector(0 to 3):="0000";
                            signal flag : bit:='1';
                            signal wr_en1:std_logic;
                            signal wr_en2:std_logic;
                            signal rd_en1:std_logic;
                            signal rd_en2:std_logic;
                            
                           
                            component Ram is
                             port( d_in :in std_logic_vector(0 to 7);
                              d_out :out std_logic_vector(0 to 7);
                              wr_clk,rd_clk :in std_logic ;
                              wr_en,rd_en:in std_logic;
                              wr_addr:in natural range 1 to 16;
                              rd_addr :in natural range 1 to 16);
                             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 /="0000") then
                                  d_out<=Ram1(rd_addr);
                                  counter1<= counter1 -"0001";
                                  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 <="0000";
                                 end if;
                                end if;
                               elsif (rd_en2='1') then
                                if(wr_en2='0') then
                                 if(counter2 /="0000")then
                                  if (flag /='1')then
                                   d_out<=Ram2(rd_addr);
                                   counter2<= counter2 -"0001";
                                  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 <="0000";
                                  end if;
                                 end if;
                                end if;
                               end if;
                              end if;
                              wait on rd_clk;
                              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 /="1111") then
                                         Ram1(wr_addr)<= d_in;
                                         counter1<=counter1+"0001";
                                      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<="1111";
                                       wait for 10 ns;
                                      end if;
                                   end if;
                           
                                 elsif(wr_en2='1')then
                                    if(rd_en2='0')then
                                      if(counter2 /="1111")then
                                        Ram2(wr_addr)<=d_in;
                                        counter2<=counter2+"0001";
                                      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<="1111";
                                       wait for 10 ns;
                                      end if;
                                    end if;
                                 end if;
                               end if;
                               wait on wr_clk;
                               end process ;
                                
                                fullempty:process is
                                begin
                                
                                if(rd_en2='1' and wr_en1='1')then
                                 if(counter1="1111" and counter2 /="0000") then
                                   full<='1';
                                 end if;
                                elsif(rd_en1='1' and wr_en2='1')then
                                  if(counter1 /="0000" and counter2="1111")then
                                   full<='1';
                                  end if;
                                elsif (rd_en2='1' and wr_en1='1' )then
                                  if( counter1 /="1111" and counter2="0000") then
                                    empty<= '1';
                                  end if;
                                elsif(rd_en1='1' and wr_en2 ='1') then
                                  if(counter1="0000" and counter2 /="1111") 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 ;

                          دیدگاه


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

                            کسی نیست منو راهنمایی کنه :sad:

                            دیدگاه


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

                              بچه ها سلام

                              می خواستم بپرسم که این error هاب الکی که (نه حتی در حین کامپایل) بلکه در حین شبیه سازی! میاد چه دلیلی می تونه داشته باشه؟!

                              ....

                              آقا من سوالمو پس می گیرم!! ( یک اشتباه کاملا فردی بود )
                              پینوکیو چوبی بمان... دنیای آدمآ‌ها سنگی ست!

                              دیدگاه

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