اطلاعیه

Collapse
No announcement yet.

شمارنده حساس به هر دو لبه با VHDL

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

    شمارنده حساس به هر دو لبه با VHDL

    سلام
    دو سوال از خدمت دوستان داشتم:
    1-آیا می توان در VHDL شمارنده ای افزایشی نوشت که در یک PROCESS به هر دو لبه بالا رونده و پایین رونده کلاک حساس باشد و هر دو را بشمارد چگونه این امر امکان پذیر است .

    2-همانگونه که می دانید بلوک PROCESS بهترین شیوه برای پیاده سازی بخش های Sequential (ترتیبی) است .از طرف دیگر بخش های Concurrent (همزمان یا ترکیبی) یک مدار دیجیتال را نیز می توان با PROCESS نوشت . آیا در یک زمان یک بلوک PROCESS می تواند هم بخشی Concurrent و هم بخشی Sequential (ترتیبی) را در خود داشته باشد. یا اینکه هر بلوک PROCESS در هر لحظه باید در یکی از این دو حالت باشد .
    با تشکر از همه دوستان
    توان هر کس به وسعت همت اوست امام علی (ع)

    #2
    پاسخ : شمارنده حساس به هر دو لبه با VHDL

    1. یه چیزی هست به اسم attribute همونطوری که واسه لبه بالا رونده داریم واسه لبه پائین رونده هم هست و مشکلی نیست مثلا:
    process(clk)
    if (rising_edge='1&#039 then
    ........
    if (falling_edge='1&#039 then
    ......

    البته هر نرم افزاری ممکنه یکم فرق داشته باشه یعنی توی مثلا quartus با یه تابع این پیاده یا حداقل شبیه سازی میشه
    توی استاندار ۹۳ یه اتریب داریم مثل 'event احتمالا اینو دیدید:
    clk'event
    خوب با همین هم میشه هر دو لبه را شناسائی کرد مثلا وقتی سطح H هست و این clk'event رخ داده خوب یه لبه پائین رونده بوده و بلعکس...


    ۲. توجه کنید که خود دستور پروسس یک دستور concurrent هست و در داخل این دستور دستورهای seq نوشته میشوند مثلا دستور architecture یک دستور موازی است ولی وقتی داخل process می آید به شکل seq با آن رفتار میشود.
    تمام دستورهای ترتیبی را باید داخل process نوشت
    توجه کنید که دستورهائی هم داریم که هم seq و هم conc. میتوانند باشند مثل دستورات attribute , مقداردهی و تایپ و ثوابت و....
    ولی دستورات ,when with if , loop و... همزمان هستند.

    جواب سولاتون هم همون مثال architecture هست که داخل بدنه process نوشته میشه و علیرغم همزمان بودن ولی چون توی پروسس اومده خود دستور به ترتیب دستورات داخل پروسس اجرا میشه.....پس با این مثال جواب سوالتون بله هست
    ولی باید به این نکته ی فلسفی :mrgreen: هم دقت کنید که :
    دستور پروسس در واقع برای به کار بردن دستورات ترتیبی در یه ساختار همزمان هست
    در صورتی که کامپایلر هم ایرادی نگیرد که نمیگیرد شما فرض کنید که اینو نوشتید:
    process(....)
    sig<=d when sel='001' else U
    q<=a when sel='101' else Z
    ........
    همینطوری تا آخر خوب وقتی اینو داخل process مینویسید به شکل ترتیبی اجرا میشه و تمام معنی خودشو از دست میده چون دستورات به ترتیب اجرا میشن در حالیکه توی مدار دیچیتال شما میخواین همه این شرایط در یک لحظه و همزمان اجرا شوند اصلا اگه این برنامه سنتر هم بشه مدار درستی هم به شما نمیده....

    دیدگاه


      #3
      پاسخ : شمارنده حساس به هر دو لبه با VHDL

      با تشکر از پاسخ کامل شما
      به نظر شما ایراد برنامه ای که من نوشته ام چیست که در ISE سنتز نمی شود. یه برنامه خیلی ساده که می خوام با لبه بالا رونده خروجیPosEdge یک شود و با لبه پایین رونده خروجی NegEdge.

      آیا نمی توان در یک بلوک PROCESS دو لبه یک سیگنال را تشخیص داد . البته می تونم با دو تا PROCESS مشکل را حل کنم اما می خوام ببینم مشکل کارم چیه؟
      لطفا یه نگاهی به برنامه من بندازید:
      کد:
      entity DualEdge is
      Port (Clock:in STD_LOGIC;
      Reset:in STD_LOGIC;
      PosEdge:out STD_LOGIC);
      end DualEdge;
      
      architecture Behavioral of DualEdge is
      
      begin
      process(Clock,Reset)
      begin
      if(Reset='1') then
      PosEdge<='0';
      NegEdge<='0';
      elsif(Clock'event and Clock='1') then
      PosEdge<='1';
      elsif(Clock'event and Clock='0') then
      NegEdge<='1';
      end if;
      
      end process;
      
      end Behavioral;
      البته ببخشید علایم ( جا به جا شدند .
      توان هر کس به وسعت همت اوست امام علی (ع)

      دیدگاه


        #4
        پاسخ : شمارنده حساس به هر دو لبه با VHDL

        ورودی/خروجی هات رو bit تعریف کن.
        زندگی لذت مشترکی است که حاصل یاری بی چشمداشت به دیگران است.

        دیدگاه


          #5
          پاسخ : شمارنده حساس به هر دو لبه با VHDL

          دو پروسس مجزا تعریف کن،تو که 2 تا خروجی مجزا داری!
          اینا رو از تو code-wizard برنامه ISE بری خیلی بهتره،هم ظاهر خوبی داره و هم احتمالا بهتر سنتز بشه

          دیدگاه


            #6
            پاسخ : شمارنده حساس به هر دو لبه با VHDL

            یه مشکل تابلو توی کدت اینه که NegEdge رو معرفی نکردی بهرحال اگه واسه خروجی میخوای ببرش توی entity ضمنا اگه اسم entity با اسم فایلت یکی باشه بد نیست.
            واسه اینکه روند طراحی و توصیه IEEE هم رعایت کرده باشی عوض end behavior بنویس end architecture begavior البته ضروری نیست ولی خوب حفظ سنته :mrgreen:
            اینم خروجی سنتر که خیلی ساده س حالا میتونی معماری ساختاریشو پیاده کنی:


            لینک:
            http://i38.tinypic.com/1zp08ix.png

            دیدگاه


              #7
              پاسخ : شمارنده حساس به هر دو لبه با VHDL

              یه مشکل تابلو توی کدت اینه که NegEdge رو معرفی نکردی بهرحال اگه واسه خروجی میخوای ببرش توی entity ضمنا اگه اسم entity با اسم فایلت یکی باشه بد نیست.
              :redface: البته می بخشید در برنامه اصلیم NegEdge را تعریف کرده ام موقع Cut و Paste جا افتاده.

              دو پروسس مجزا تعریف کن،تو که 2 تا خروجی مجزا داری!
              بله اینو می دونم ولی می خوام بدونم چرا در یک Process نمیشه دو لبه یک سیگنال که هر کدام روی یه خروجی خاص عملکرد دارند را سنتز کرد آیا قلق خاصی داره یا هر Process در آن واحد فقط با یک EVENT میتونه کار کنه
              توان هر کس به وسعت همت اوست امام علی (ع)

              دیدگاه


                #8
                پاسخ : شمارنده حساس به هر دو لبه با VHDL

                من اون شماتیک نکشیدم نتیجه سنتز هست..... :agree:
                کی گفته نمیشه :question:
                اینجا که شده...
                برنامه مشکلی نداره من فقط دو کار کردم:
                ۱.NegEdge رو به entity اضافه کردم
                ۲.محض اطمینان نام entity رو با نام فایل یکی کردم (بعضی از نرم افزراها مشکل top level میگیرن)

                کامپایل و سنتز شد...مشکلی نداره

                دیدگاه


                  #9
                  پاسخ : شمارنده حساس به هر دو لبه با VHDL

                  نوشته اصلی توسط sadid
                  من اون شماتیک نکشیدم نتیجه سنتز هست..... :agree:
                  کی گفته نمیشه :question:
                  اینجا که شده...
                  برنامه مشکلی نداره من فقط دو کار کردم:
                  ۱.NegEdge رو به entity اضافه کردم
                  ۲.محض اطمینان نام entity رو با نام فایل یکی کردم (بعضی از نرم افزراها مشکل top level میگیرن)

                  کامپایل و سنتز شد...مشکلی نداره
                  با تشکر فراوان از شما دوست عزیز من کد را اصلاح کردم و نام entity را هم با نام فایلم یکی کردم ببینید:
                  کد:
                  entity DualEdge is
                  Port (Clock:in STD_LOGIC;
                  Reset:in STD_LOGIC;
                  NegEdge:out STD_LOGIC;
                  PosEdge:out STD_LOGIC);
                  end DualEdge;
                  
                  architecture Behavioral of DualEdge is
                  begin
                  process(Clock,Reset)
                  begin
                  if(Reset='1') then
                  PosEdge<='0';
                  NegEdge<='0';
                  	elsif(Clock'event and Clock='1') then
                  	PosEdge<='1';
                  		elsif(Clock'event and Clock='0') then
                  		NegEdge<='1';
                  end if;
                  end process;
                  end Behavioral;
                  ولی مشکل همچنان باقی است من از ISE10.1 استفاده می کنم و در حین سنتز error زیر را می دهد:
                  Signal NegEdge cannot be synthesized, bad synchronous description. The description style you are using to describe a synchronous element (register, memory, etc.) is not supported in the current software release.

                  شما از چه نرم افزاری استفاده می کنید ما که مبهوت و حیران مانده ایم توی ISE7.1 هم همین Error را میده :cry2:
                  توان هر کس به وسعت همت اوست امام علی (ع)

                  دیدگاه


                    #10
                    پاسخ : شمارنده حساس به هر دو لبه با VHDL

                    نمیدونم :sad:
                    شما ترجیحا اگه امکان داره با Quartus یا FPGA Advantage امتحان کنید.
                    اون نتیجه سنتز رو با Quartus گرفتم.
                    ورژن 10 ISE جدیده....شاید مشکلی داشته باشه...بهرحال با یکی از برنامه های بالا یا مثلا با ISE 9 امتحان کنید (هر چند با این اروری که گرفته به نظر میاد مشکل ریشه ای باشه).

                    دیدگاه

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