اطلاعیه

Collapse
No announcement yet.

کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

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

    کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

    :question:

    سلام .
    من یک کد verilog نوشتم که پریود یک کلاک ورودی رو برمی گردونه.
    ولی خروجی x میده. نمیدونم چرا؟ اگر کسی کمک کنه ممنون می شم.

    کد زیر:

    module f_c2(clk,clk_prd);
    input clk;
    output [3:0] clk_prd ;
    reg [3:0] count_1,count_2,clk_prd,count_3,count_4;
    reg [3:0] count;
    //-----------------------------------------
    initial
    begin
    assign count =0;
    assign count_1 =0;
    assign count_2 =0;
    assign count_3 =0;
    assign count_4 =0;
    end
    //--------------counter--------------------
    always count<= #1 count+1;

    //-----------------------------------------
    always @(posedge clk)
    begin
    count_1 <= count;
    #(clk);
    count_2 <= #(!clk)count;
    end
    //-----------------------------------------
    always @(posedge clk)
    begin
    #(clk);#(!clk);#2;
    clk_prd =(count_2-count_1);
    end

    //-----------------------------------------
    endmodule

    #2
    پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

    این هم یک کد دیگه که همون کار بالا رو باید بکنه اما 3999 تا warning میده :eek:

    البته من هر دو تا برنامه رو با MAXPLUS نوشتم.

    کد زیر:

    module f_c(clk,clk_prd,clk_sys);
    input clk,clk_sys;
    output [3:0] clk_prd ;
    reg [3:0] count_1,count_2,clk_prd,count_3,count_4;
    reg [3:0] count;
    //-----------------------------------------
    initial
    begin
    assign count =0;
    assign count_1 =0;
    assign count_2 =0;
    assign count_3 =0;
    assign count_4 =0;
    end
    //--------------counter--------------------
    always @(posedge clk_sys)
    count<= #1 count+1;

    //-----------------------------------------
    always @(posedge clk)
    begin
    count_1 <= count;
    end
    //-----------------------------------------
    always @(negedge clk)
    begin
    count_3 <= count;
    end
    //-----------------------------------------
    always @(posedge clk)
    begin
    clk_prd =(count_3-count_1);
    end

    //-----------------------------------------
    endmodule


    دیدگاه


      #3
      پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

      با سلام
      جدا از سوالآ‌ شما، شما این کد را برای سیمولیشن میآ‌خواهید و یا برای سنتز کردن بر روی FPGA؟ چون این کد با این روش کلا سنتز شدنی نیست.
      من دوست دارم آزاد فکر کنم، نرمآ‌افزارآ‌ و سختآ‌افزارهای آزاد را به کار ببرم و اگر توانستم نرمآ‌افزار، سختآ‌افزار و محتوای آزاد درست کنم!

      دیدگاه


        #4
        پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

        این کد بخشی از برنامه ایست که جمع دو فرکانس ورودی را در خروجی قرار میدهد.
        و قرار است که بر روی fpga سنتز شود.حالا که نمیشود چطور اصلاحش کنم که بشود :question:

        دیدگاه


          #5
          پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

          با سلام
          کلا شما برای اینکه کد قابل سنتز داشته باشید نباید در کد زمانآ‌ تاخیر داشته باشید چون قابل سنتز نیست. علاوه بر این قسمت initial نیز قابل سنتز نیست. البته مشکلی ایجاد نمیآ‌کند و ابزار سنتز فقط به شما پیغام میآ‌دهد. از این رو اگر مقدار آ‌دهی اولیه دارید حتما باید برای ماژول سیگنال reset قرار دهید و عمل مقدارآ‌دهی اولیه را با ریست انجام دهید.
          حالا بر میآ‌گردیم سر سوال شما، به نظرم برای کاری که شما میآ‌خواهید انجام دهید بهترین روش استفاده از یک فرکانس مرجع است به این معنی که یک پین ورودی با فرکانس مشخص به عنوان ورودی ماژول مشخص کنید و تعداد پالسآ‌های این ورودی را بین دو پالس سیگنال مورد نظرتون شمارش کنید. علاوه بر این شما باید تغییرات سیگنال ورودی (که میآ‌خواهید فرکانس آن را اندازه بگیرید) با کلاک مرجع سنکرون کنید. در واقع نباید بلوکآ‌هایی حساس به لبهآ‌ی بالارونده کلاک ورودی داشته باشید بلکه همه بلوکآ‌ها باید حساس به لبه کلاک مرجع باشند.
          برای سنکرون کردن نیز میآ‌توانید به این صورت عمل کنید: فرض کنید از کلاک ورودی با لبهآ‌های کلاک مرجع نمونه میآ‌گیرید و در یک شیفت رجیستر دو بیتی قرار میآ‌دهید. حالا با مقایسه خروجی دو بیت این شیفت رجیستر میآ‌توانید لبهآ‌ را بر روی کلاک ورودی پیدا کنید.
          فکر کنم خیلی بد توضیح داده باشم!
          من دوست دارم آزاد فکر کنم، نرمآ‌افزارآ‌ و سختآ‌افزارهای آزاد را به کار ببرم و اگر توانستم نرمآ‌افزار، سختآ‌افزار و محتوای آزاد درست کنم!

          دیدگاه


            #6
            پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

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

            درباره قسمت دیگر یعنی گذاشتن یک شیفت رجیستر دو بیتی:

            چطور طراحی اش کنم(در داخل خود ماژول اصلی یا در برنامه ای جدا و آنرا با فراخوانی در برنامه اصلی استفاده کنم؟)

            ببینید درباره ی مقایسه اش درست است:
            1- اگر خروجی 01 بود یعنی کلاک در سطح 1 است
            2- اگر خروجی 00 بود یعنی کلاک در سطح 0 است
            3- در غیر اینصورت یا در لبه بالا رونده است یا در لبه پایین رونده (تفاوتش را از کجا باید بفهمد؟)

            لطفاً درباره ی این شیفت رجیستر یک کم بیشتر توضیح دهید یا اگر کد آنرا دارید به من بدهید

            در آخر ممنونم از پاسخ های سریع و به موقع شما اگر بشود این برنامه تا شنبه جواب بگیرد کار به تمدید پروژه برای ترم بعد نخواهد کشید.

            باز هم ممنون

            دیدگاه


              #7
              پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

              نوشته اصلی توسط f.fater
              سلام.
              درباره ی قسمت اول صحبت ها ی شما باید بگویم که clk_sys همان کلاک مرجع در برنامه دوم است که تفاوتش با برنامه اول در استفاده از همین کلاک است .

              درباره قسمت دیگر یعنی گذاشتن یک شیفت رجیستر دو بیتی:

              چطور طراحی اش کنم(در داخل خود ماژول اصلی یا در برنامه ای جدا و آنرا با فراخوانی در برنامه اصلی استفاده کنم؟)

              ببینید درباره ی مقایسه اش درست است:
              1- اگر خروجی 01 بود یعنی کلاک در سطح 1 است
              2- اگر خروجی 00 بود یعنی کلاک در سطح 0 است
              3- در غیر اینصورت یا در لبه بالا رونده است یا در لبه پایین رونده (تفاوتش را از کجا باید بفهمد؟)

              لطفاً درباره ی این شیفت رجیستر یک کم بیشتر توضیح دهید یا اگر کد آنرا دارید به من بدهید

              در آخر ممنونم از پاسخ های سریع و به موقع شما اگر بشود این برنامه تا شنبه جواب بگیرد کار به تمدید پروژه برای ترم بعد نخواهد کشید.

              باز هم ممنون
              با سلام
              شرمنده من دومین کد شما را ندیده بودم!
              لازم نیست که شیفت رجستر را خارج ماژول درست کنید، میآ‌توانید در داخل ماژول به این صورت درستش کنید. من یه مثال توی سایت www.fpga4fun.com دیده بودم که در انجا نیز باید ورودی با کلاک سنکرون میآ‌شد. در آنجا ۳ تا بیت رجیستر قرار داده بود (حالا چرا یکی بیشتر دقیق نمیآ‌دانم!)، من هم در این مثال ۳ بیت در نظر میآ‌گیرم.
              درباره مقایسه هم خیلی ساده است نمیآ‌دانم مشکل چی هست؟ 01 و یا 10 لبه را مشخص میآ‌کند بقیه حالات هم سطح 1 و یا 0 هستند که شما باهاشون کاری ندارید. شما میآ‌توانید یک سیگنال درست کنید که لبه بالارونده و یا پایین رونده را با 01 و یا 10 مشخص کند. در مثال زیر clkPos وقتی ۱ میآ‌شود که یک لبه بالارونده بر روی سیگنال clk ببیند (و البته با clk_sys هم سنکرون است).


              reg[2:0] shReg;
              wire clkPos;
              always @(posedge clk_sys) shReg <= {shReg[1:0],clk};
              assign clkPos = shReg[2] & ~shReg[1];



              بقیه کار دیگه ساده است. شما در نظر بگیرید که یک state machine دارید که با ۱ شدن سیگنال clkPos وارد state شمارش کانتر میآ‌شود و آنقدر در آن استیت میآ‌ماند تا دوباره سینگنال clkPos فعال شود.
              صفحهآ‌ای که به آن اشاره کردم: http://www.fpga4fun.com/QuadratureDecoder.html
              امیدوارم خوب توضیح داده باشم.
              من دوست دارم آزاد فکر کنم، نرمآ‌افزارآ‌ و سختآ‌افزارهای آزاد را به کار ببرم و اگر توانستم نرمآ‌افزار، سختآ‌افزار و محتوای آزاد درست کنم!

              دیدگاه


                #8
                پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

                سلام.
                با توضیحات شما کد زیر را نوشتم.
                اما warning زیر را میدهد:
                Ignored unnessary input pin 'clk'
                یعنی clk ورودی را در نظر نمی گیرد.
                اگه ممکن است ببینید برنامه ای که نوشتم درسته؟
                فکر میکنم اشکال از خط زیر باشه:
                else if (clk_sys) count = count + 'b1;

                کد:

                module f_c(clk,clk_sys,reset,clk_prd);
                input clk,clk_sys,reset;
                output [3:0] clk_prd ;
                reg [3:0] count;

                //-----------------------------------------

                reg [2:0] shReg;
                wire clkPos;
                always @(posedge clk_sys)
                shReg <= {shReg[1:0],clk};
                assign clkPos = shReg[1] & ~shReg[0];

                //--------------counter-------------------

                always @(clkPos)
                begin
                if (reset)
                count = 'b0;
                else if (clk_sys) count = count + 'b1;
                else count = count + 'b0;
                end

                assign clk_prd = count;

                endmodule



                ممنونم از توضیحات صریح و کامل شما

                دیدگاه


                  #9
                  پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

                  با سلام
                  تعجب میآ‌کنم چرا همچین warning میآ‌ده ولی خوب شما یه اشتباه کردی. بلوک always که در میان کد هست، نباید حساس به posClk باشد بلکه باید حساس به clk_sys باشه، چون قرار که کلا مدار با این کلاک سنکرون باشه، شمارنده شما هم قرار تعداد پالسآ‌های این کلاک را در بین دولبه کلاک ورودی clk بشمارد.
                  شما باید یه state machine بنویسی، که با دیدن فعال شدن clkPos به استیت شمارش برود. در استیت شمارش نیز آن قدر بماند تا دوباره clkPos فعال شود. استیت ماشین شما هم باید حساس به clk_sys باشد.

                  من دوست دارم آزاد فکر کنم، نرمآ‌افزارآ‌ و سختآ‌افزارهای آزاد را به کار ببرم و اگر توانستم نرمآ‌افزار، سختآ‌افزار و محتوای آزاد درست کنم!

                  دیدگاه


                    #10
                    پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

                    ممنونم.
                    میرم بنویسم ببینم چی میشه.
                    بازم ممنون از حوصله ی شما

                    دیدگاه


                      #11
                      پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

                      سلام
                      منظور من یه همچین استیت ماشینی هست:

                      من دوست دارم آزاد فکر کنم، نرمآ‌افزارآ‌ و سختآ‌افزارهای آزاد را به کار ببرم و اگر توانستم نرمآ‌افزار، سختآ‌افزار و محتوای آزاد درست کنم!

                      دیدگاه


                        #12
                        پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

                        سلام.
                        ممنونم

                        کد زیر رو نوشتم اما دوباره مثل قبل warning زیر را میدهد:
                        Ignored unnessary input pin 'clk' :eek:


                        کد:

                        module f_c(clk,clk_sys,reset,clk_prd);
                        input clk,clk_sys,reset;
                        output [3:0] clk_prd ;
                        reg [3:0] count,next_state,state,clk_prd;
                        parameter [1:0] s0=2'b00,s1=2'b01,counter=2'b10,exi t=2'b11;
                        //-----------------------------------------

                        reg [2:0] shReg;
                        wire clkPos;
                        always @(posedge clk_sys)
                        shReg = {shReg[1:0],clk};
                        assign clkPos = shReg[1] & ~shReg[0];

                        //-----------------------------------------

                        always @(posedge clk_sys)
                        begin
                        state = s0 ;
                        if (reset)begin
                        next_state =s0;

                        case(state)

                        s0 :
                        begin

                        count = 4'b0000;
                        next_state = s1 ;

                        end


                        s1 :
                        begin
                        if (clkPos)
                        begin
                        next_state = counter;
                        end
                        else next_state = s1;
                        end

                        counter :
                        begin
                        count = count + 1;
                        if (clkPos)
                        next_state = exit;
                        else
                        next_state = counter;
                        end

                        exit :
                        begin
                        clk_prd = count;
                        end

                        endcase
                        end
                        end
                        endmodule



                        حالا باید چطور اصلاحش کنم؟ :sad:

                        با تشکر

                        دیدگاه


                          #13
                          پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

                          با سلام
                          نظری درباره این warning ندارم، چون به نظرم خیلی عجیب به نظر میآ‌رسه.
                          من فقط یه حدسی میآ‌زنم. شاید این به نوعی باگ ابزار سنتز هست، شما اسم سیگنال clk_sys رو به clk عوض کنید و سیگنال clk را هم به عنوان مثال به inputClk تبدیل کنید.
                          علاوه بر این اگر شما بر روی تراشهآ‌های Altera کار میآ‌کنید، چرا از ابزار Quartus استفاده نمیآ‌کنید؟ چون فکر کنم دیگه MaxPlus ادامه پیدا نکرده است.
                          البته این فقط یه حدس است.
                          من دوست دارم آزاد فکر کنم، نرمآ‌افزارآ‌ و سختآ‌افزارهای آزاد را به کار ببرم و اگر توانستم نرمآ‌افزار، سختآ‌افزار و محتوای آزاد درست کنم!

                          دیدگاه


                            #14
                            پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

                            سلام
                            می تو نیم با استفاده از نرم افزارmodelsimتراشهfpgaرو پروگرمر کرد.
                            برنامه ها تو quartusهم errorمیده

                            دیدگاه


                              #15
                              پاسخ : کد verilog که دوره تناوب یک کلاک ورودی رو برمی گردونه

                              سلام.
                              مادلسیم تا ائنجا که من میدونم قادر به سنتز نیست و فقط برای سیمولیشن و دیباگ کردن به کار میره

                              دیدگاه

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