اطلاعیه

Collapse
No announcement yet.

IF statement is not synthesizable

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

    IF statement is not synthesizable

    سلام به همگی

    آقا من میخوام یه ماژول داشته باشم که وقتی clk1 میاد، خروجی 0 بشه و 0 بمونه تا clk2 بیاد و خروجی رو 1 کنه و 1 بمونه تا باز دوباره clk1 بیاد.
    کد VHDL ش رو اینطور نوشتم:

    [left]
    entity clocking is
    Port ( clk1 : in STD_LOGIC;
    clk2 : in STD_LOGIC;
    result : out STD_LOGIC);
    end clocking;

    architecture Behavioral of clocking is

    begin

    process
    begin

    if( rising_edge(clk1) ) then
    result <= '0';
    end if;
    if( rising_edge(clk2) ) then
    result <= '1';
    end if;

    end process;


    end Behavioral;

    تو شبیه سازی جواب میده اما موقع سنتز کردن error زیر رو میده:

    "statement is not synthesizable since it does not hold its value under NOT(clock-edge) condition"

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

    #2
    پاسخ : IF statement is not synthesizable

    اگه درست یادم مونده باشه باید جلوی process مقادیر متغیرتون رو قرار بدید تا هر بار با تغییر اونها وارد process بشه. یعنی clk1 ,clk2
    It's nice to be important but it's important to be nice!

    از اینکه نمی رسم جواب دوستان را بدم معذرت می خوام.

    دیدگاه


      #3
      پاسخ : IF statement is not synthesizable

      من زیاد vhdl بلد نیستم اما فکر میکنم این کارو کنی درست بشه
      if دوم رو بعد از else بذار و بعد از اون هم یه else بذار که مقدار result رو تغییر نده (result <= result)
      https://www.linkedin.com/in/mohammadhosseini69

      http://zakhar.blog.ir

      دیدگاه


        #4
        پاسخ : IF statement is not synthesizable

        نوشته اصلی توسط ehbas
        سلام به همگی

        آقا من میخوام یه ماژول داشته باشم که وقتی clk1 میاد، خروجی 0 بشه و 0 بمونه تا clk2 بیاد و خروجی رو 1 کنه و 1 بمونه تا باز دوباره clk1 بیاد.
        کد VHDL ش رو اینطور نوشتم:

        [left]
        entity clocking is
        Port ( clk1 : in STD_LOGIC;
        clk2 : in STD_LOGIC;
        result : out STD_LOGIC);
        end clocking;

        architecture Behavioral of clocking is

        begin

        process
        begin

        if( rising_edge(clk1) ) then
        result <= '0';
        end if;
        if( rising_edge(clk2) ) then
        result <= '1';
        end if;

        end process;


        end Behavioral;

        تو شبیه سازی جواب میده اما موقع سنتز کردن error زیر رو میده:

        "statement is not synthesizable since it does not hold its value under NOT(clock-edge) condition"

        واقعاٌ نمی فهمم مشکل چیه؟ کسی راه دیگه ای بنظرش نمیرسه که این بلوک رو پیاده کنم. به نظر خیلی سادست ولی نمیشه نوشتش.
        ممنون
        فکر کنم درستش این باشه:

        entity clocking is
        Port ( clk1 : in STD_LOGIC;
        clk2 : in STD_LOGIC;
        result : out STD_LOGIC);
        end clocking;

        architecture Behavioral of clocking is
        signal c1: STD_LOGIC := '0';
        signal c2: STD_LOGIC := '0';
        begin

        result <= c1 xor c2;

        process(clk1, clk2)
        begin

        if( rising_edge(clk1) ) then
        c1 <= c2;
        end if;

        if( rising_edge(clk2) ) then
        c2 <= not c1;
        end if;

        end process;


        end Behavioral;

        موفق باشید.

        اسمایل، تومورو ویل بی وُرس

        دیدگاه


          #5
          پاسخ : IF statement is not synthesizable

          نوشته اصلی توسط محمد حسینی
          if دوم رو بعد از else بذار و بعد از اون هم یه else بذار که مقدار result رو تغییر نده (result <= result)
          ELSE گذاشتن برای IF میتونه جلوی خیلی از اشتباه ها و ورود برنامه به حالت های غیرمجاز رو بگیره.
          It's nice to be important but it's important to be nice!

          از اینکه نمی رسم جواب دوستان را بدم معذرت می خوام.

          دیدگاه


            #6
            پاسخ : IF statement is not synthesizable

            نوشته اصلی توسط ژوپیتر
            فکر کنم درستش این باشه:

            entity clocking is
            Port ( clk1 : in STD_LOGIC;
            clk2 : in STD_LOGIC;
            result : out STD_LOGIC);
            end clocking;

            architecture Behavioral of clocking is
            signal c1: STD_LOGIC := '0';
            signal c2: STD_LOGIC := '0';
            begin

            result <= c1 xor c2;

            process(clk1, clk2)
            begin

            if( rising_edge(clk1) ) then
            c1 <= c2;
            end if;

            if( rising_edge(clk2) ) then
            c2 <= not c1;
            end if;

            end process;


            end Behavioral;

            موفق باشید.
            سلام
            آقا دستت درد نکنه. خدا خیرت بده. :job:
            معلومه این کاریه
            حالا که ماهی رو بهمون دادی، بیزحمت ماهی گیری رو هم یادمون بده. مشکل کد من چی بود؟ فرقشون تو این بود که من می خواستم خروجی رو مستقیما تغییر بدم اما شما با واسطه این کار رو انجام دادی؟ اروری که داد، دقیقا میخواد چی بگه؟

            دیدگاه


              #7
              پاسخ : IF statement is not synthesizable

              سلام،

              statement is not synthesizable since it does not hold its value under NOT(clock-edge) condition"
              این ارور میگه استیتهای متغییر(در لاگ ارور اسم متغییر رو مینویسه که همون result هستش) result قابل سنتز نیست برای اینکه در حالت معکوس شرط لبه مقدارش رو نگه نمیداره، یعنی در لبه بالا رونده کلاک اول result مقدار دهی شده(برابر صفر) ولی خارج از این شرط result مقدارش تغییر میکنه و قابل سنتز نیست( همون مقدار دهی در شرط کلاک بالا رونده کلاک دوم برابر یک شده). در مدارهای لاجیک این کار غیر ممکنه که یک متغییر هم زمان با 2 یا چند کلاک نوشته بشه، ولی خوندنش ممکنه، مثلا در شرط چند کلاک مختلف میشه یک متغییر مشترک رو خوند ولی نمیشه در چند کلاک اون رو مقدار دهی کرد.
              حالا برای این کار از ادغام مدارهای ترکیبی و ترتیبی با هم استفاده میکنند که منهم همین کار رو کردم، نتیجه مدار ترکیبی حاصل c1 و c2 هست که در result ریخته شده و محاسبات جداگانه ترتیبی هم که با دو کلاک جدا انجام شده.

              موفق باشید.
              اسمایل، تومورو ویل بی وُرس

              دیدگاه


                #8
                پاسخ : IF statement is not synthesizable

                نوشته اصلی توسط ژوپیتر
                سلام،

                این ارور میگه استیتهای متغییر(در لاگ ارور اسم متغییر رو مینویسه که همون result هستش) result قابل سنتز نیست برای اینکه در حالت معکوس شرط لبه مقدارش رو نگه نمیداره، یعنی در لبه بالا رونده کلاک اول result مقدار دهی شده(برابر صفر) ولی خارج از این شرط result مقدارش تغییر میکنه و قابل سنتز نیست( همون مقدار دهی در شرط کلاک بالا رونده کلاک دوم برابر یک شده). در مدارهای لاجیک این کار غیر ممکنه که یک متغییر هم زمان با 2 یا چند کلاک نوشته بشه، ولی خوندنش ممکنه، مثلا در شرط چند کلاک مختلف میشه یک متغییر مشترک رو خوند ولی نمیشه در چند کلاک اون رو مقدار دهی کرد.
                حالا برای این کار از ادغام مدارهای ترکیبی و ترتیبی با هم استفاده میکنند که منهم همین کار رو کردم، نتیجه مدار ترکیبی حاصل c1 و c2 هست که در result ریخته شده و محاسبات جداگانه ترتیبی هم که با دو کلاک جدا انجام شده.

                موفق باشید.
                سلام یه سوال:
                چرا جمله result رو بعد از end process نذاشتین؟ فرقی میکنه؟!!

                دیدگاه


                  #9
                  پاسخ : IF statement is not synthesizable

                  نوشته اصلی توسط samaneh174
                  سلام یه سوال:
                  چرا جمله result رو بعد از end process نذاشتین؟ فرقی میکنه؟!!
                  سلام
                  اگه منظورتون بیرون از پروسس هست، فرقی نداره که قبل از پروسس بنویسید یا بعدش، مهم اینه که دیگه ترتیبی نیست و ترکیبیه.
                  اسمایل، تومورو ویل بی وُرس

                  دیدگاه

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