اطلاعیه

Collapse
No announcement yet.

تبدیل یک کلاک با دوره تناوب بزرگتر به یک کلاک با دوره تناوب کوچکتر

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

    تبدیل یک کلاک با دوره تناوب بزرگتر به یک کلاک با دوره تناوب کوچکتر

    سلام.
    چطور می شه از یک کلاک با دوره تناوب بزرگتر یک کلاک با دوره تناوب کوچکتر تولید کرد؟آن هم وقتی هیچ

    کلاک خارجی دیگری به این مدار وصل نباشد؟

    عکس این کار را بلدم.آن هم زمانی است که یک کلاک خارجی داشته باشیم.

    مثلاً می خوام که از یک کلاک با دوره تناوب 10 نانو یک کلاک با دوره تناوب 1 نانو تولید کنم.

    چنین چیزی ممکنه؟؟؟

    توضیح اینکه اگر هم ممکنه با زبان وریلاگ یا vhdl

    اگه کسی میتونه کمک کنه

    ممنون

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

    نوشته اصلی توسط f.fater
    سلام.
    چطور می شه از یک کلاک با دوره تناوب بزرگتر یک کلاک با دوره تناوب کوچکتر تولید کرد؟آن هم وقتی هیچ

    کلاک خارجی دیگری به این مدار وصل نباشد؟

    عکس این کار را بلدم.آن هم زمانی است که یک کلاک خارجی داشته باشیم.

    مثلاً می خوام که از یک کلاک با دوره تناوب 10 نانو یک کلاک با دوره تناوب 1 نانو تولید کنم.

    چنین چیزی ممکنه؟؟؟

    توضیح اینکه اگر هم ممکنه با زبان وریلاگ یا vhdl

    اگه کسی میتونه کمک کنه

    ممنون
    با سلام
    این کار رو برای سیمولیشن میآ‌خواهید و یا در واقعیت بر روی FPGA نیاز به افزایش فرکانس دارید؟
    برای گزینه دوم، اکثر تراشهآ‌های FPGA جدید، قسمتآ‌هایی برای کنترل کلاک دارند. اسم دقیق را نمیآ‌دانم ولی این قسمتآ‌ها شامل PLL است که میآ‌توانید فرکانس ورودی را در یک ضریب ضرب کنید.
    به هر حال برای این کار شما باید به دیتاآ‌شیت تراشهآ‌ مورد نظرتون مراجعه کنید. ولی اگر این قسمت بر روی تراشه وجود نداشته باشد بعید میآ‌دانم بتوان آن را به کمک گیتآ‌ها درست کرد.
    من دوست دارم آزاد فکر کنم، نرمآ‌افزارآ‌ و سختآ‌افزارهای آزاد را به کار ببرم و اگر توانستم نرمآ‌افزار، سختآ‌افزار و محتوای آزاد درست کنم!

    دیدگاه


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

      سلام.
      این بخش نیز در راستای انجام پروژه ای است که برای جمع دو کلاک ورودی با فرکانس های مجزا صورت میگیرد.
      در واقع من برنامه را در مادلسیم نوشتم (با وریلاگ) و در نرم افزار لئوناردو برای سنتز برنامه را چک کردم.
      پیغام هایی داد مبنی بر اینکه در کل برنامه نمی شود هم از دستورات بلاکینگ و هم نان بلاکینگ استفاده کرد . یعنی در صورت استفاده از هر دو صورت

      این برنامه قابل سنتز نیست.
      و یک مورد هم درباره ی استفاده از دستور initial که این مورد قابل جبران است با اضافه کردن یک کنترلی مثل ریست.
      اما درباره ی blocking , non-bloking ها نمیدانم چه کنم .
      اگه همه را یکدست کنم جواب غلط میدهد.

      ================================================== ==========

      حال قسمت دوم :

      از آنجا که کلاک سیستم(کلاک مرجع این برنامه)(clk_sys) باید کمترین مقدار ممکن را داشته باشد و در عمل،کمترین مقدار حدود 1 مگا هرتز است(من

      رشتم الکترونیک نیست نمیدونم درست میگم یا نه ولی اینو یه دوستی گفت که الکترونیک میخونه گفت)و من میخوام که در حوزه ی زمان این مقدار به 1 نانو

      و حتی 1 پیکو ثانیه برسه. که کانتر شمارنده ی دوره تناوب کلاک ها ، دقیق تر عمل کرده و محدودیت ها از بین برود یعنی رنجی که برنامه در آن جواب

      درس دهد بیشتر گردد.
      چون اگر من بخوام که کلاک سیستم برنامه 1 مگا هرتز یا بیشتر باشد باید کلاک های دیگه مضربی از این فرکانس باشند.که خوب محدودیتی در برنامه

      ایجاد میشه که این یه پوئن منفی برای برنامه میشه!

      ================================================== ==========

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

      این روش خوبی نیست و راه بهتری سراغ دارید راهنماییم بفرمایید.

      و نیز درباره ی حل مشکل بلاکینگ و نان بلاکینگ ها؟؟؟

      با تشکر از شما

      ================================================== ==========
      کد:

      module f_c1(clk1,clk2,clk_sys,reset,cl2);
      input clk1,clk2,clk_sys,reset;
      output cl2 ;
      reg [100:0]count,count_1,next_state,state,next_state_1,state_ 1,clk_prd_1,clk_prd_2;
      reg [100:0]clk_prd_total,cl2_count;
      reg cl2;
      parameter [3:0] s0=1,s1=2,counter=3,exit=4;
      parameter [3:0] s00=5,ss=6,counter1=7,exit1=8;
      reg rst;
      reg rst_1;
      reg cl2_en;
      //-----------------------------------------

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

      always @(posedge clk_sys)
      shReg_1 = {shReg_1[1:0],clk2};
      assign clkPos_1 = ~shReg_1[1] & shReg_1[0];
      //-----------------------------------------
      initial
      begin
      state<=s0;next_state <= s0 ;
      rst=reset;
      end

      initial
      begin
      rst_1=reset;
      state_1=s00;next_state_1 = s00 ;
      end

      always @(posedge clk_sys)
      begin

      if (rst==1'b1)
      begin
      next_state <= s0;
      end
      else
      begin
      state <= next_state;
      end


      case(state)

      s0 :
      begin

      count = 0;
      next_state = s1 ;

      end

      s1 :
      begin

      if (clkPos==1'b1)
      begin
      next_state = counter;
      end
      else next_state = s1 ;
      end

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

      exit :
      begin
      clk_prd_1 = count*4;
      rst = 1'b1;
      end

      endcase

      end

      always @(posedge clk_sys)
      begin

      if (rst_1==1'b1)
      begin
      next_state_1 <= s00;
      end
      else
      begin
      state_1 <= next_state_1;
      end

      case(state_1)

      s00 :
      begin

      count_1 = 0;
      next_state_1 = ss ;

      end

      ss :
      begin
      if (clkPos_1==1'b1)
      begin
      next_state_1 = counter1;
      end
      else next_state_1 = ss ;

      end

      counter1 :
      begin
      count_1 = count_1 + 1;
      if (clkPos_1==1'b1)
      next_state_1 = exit1;
      else
      next_state_1 = counter1;
      end

      exit1 :
      begin
      clk_prd_2 = count_1 * 4;
      rst_1=1'b1;
      end

      endcase

      assign clk_prd_total=(clk_prd_1*clk_prd_2)/(clk_prd_1+clk_prd_2);


      if (reset==1)
      begin
      cl2_count = 0 ;
      cl2_en = 1'b0 ;
      end
      else if (clk_prd_total != 0)
      begin
      if (cl2_count != clk_prd_total)
      cl2_count <= cl2_count + 1 ;
      else
      begin
      cl2_en <= 1'b1 ;
      cl2_count <= 1'b0 ;
      end

      cl2_en = 0 ;
      end

      assign cl2 = cl2_en;
      end


      endmodule

      ================================================== ===
      این هم سیموله ی برنامه :
      کلاک اول:
      8 میکرو ثانیه دوره تناوب:

      کلاک دوم:
      10 میکرو ثانیه دوره تناوب:

      کلاک سیستم:
      4 میکرو ثانیه دوره تناوب:
      http://www.gigaimage.com/images/dw8i58tbufi3cxmbjb0.jpg


      مشاهده میشود که چون کلاک سیستم خیلی بزرگ است نتوانسته جواب درستی تولید کند(clk_prd_2=16 شده که می بایست 10شود)



      دیدگاه


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

        با سلام
        من دو سه تا نکته رو از گفتهآ‌های شما متوجه نمیآ‌شوم؟؟؟
        ۱. اولا فراکانس کاری ورودی چرا ۱ مگ باشه؟؟؟ خوب شما میآ‌توانید تا حداکثر ممکن که تراشه اجازه میآ‌دهد، فرکانس را بالا ببرید (مثلا ۱۰۰ مگ) سپس با توجه به نیاز خودتون فرکانس رو کم کنید.
        ۲. علاوه بر این قسمتی که به آن اشارهآ‌ کردم (به عنوان مثال در تراشهآ‌های Xilinx اسم این قسمت DCM یا Digital Clock Manager ) میآ‌توانند فرکانس را در یک کسر ضرب کند به این منعی که فرکانس ورودی را در یک عدد ضرب کرده و بر یک عدد تقسیم کند (به عنوان مثال در سری spartan 3 که نگاه میآ‌کردم صورت و مخرج این کسر میآ‌توانست بین ۲ تا ۳۲ باشد، در این حالت به عنوان مثال شما اگر بخواهید فرکانس را ۲/۳ کنید ابتدا آن را دوبرابر کرده و سپس به ۳ تقسیم میآ‌کنید). خوب این دقیقا کاری که شما نیاز دارید است.
        ۳. کد شما خیلی عجیب است، در بلوک always شما از assign استفاده کردهآ‌اید. علاوه بر این، سمت چپ assign حتما باید wire باشد نه reg! علیآ‌القاعده (عجب کلمهآ‌ی خزی! ) این کد باید دهآ‌ها خطا ایجاد کند.


        -- دوست عزیز بهتر است که کدآ‌ها را به صورت چپ به راست در سایت کپی کنید به این صورت اصلا قابل خواندن نیست و باید به یک محیط چپ به راست منتقلش کرد. برای این که کدآ‌آ‌های مورد نظرتون چپ به راست شوند دور کد کنتر [ ltr] و [ \ltr] قرار دهید. روش قرار دادن درست کد را در اینجا توضیح دادهآ‌ام: http://www.eca.ir/forum2/index.php?topic=17442.0
        من دوست دارم آزاد فکر کنم، نرمآ‌افزارآ‌ و سختآ‌افزارهای آزاد را به کار ببرم و اگر توانستم نرمآ‌افزار، سختآ‌افزار و محتوای آزاد درست کنم!

        دیدگاه


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

          از توضیحات و تذکر اخیرتون ممنون
          چشم ،ایندفعه درست تر می نویسم.
          نمیدانم سیموله را دیدید یا نه با این حال دوباره آدرسش رو میگم:

          http://www.gigaimage.com/images/dw8i58tbufi3cxmbjb0.jpg

          من احتیاج به کلاک سیستمی در حدود 1 پیکو و یا 1 نانو دارم که اگر عکسش کنیم میشود 1 گیگا هرتز !
          آیا تراشه و یا تراشه هایی که چنین امکانی دارند می توانند چنین کلاکی را تولید کنند؟؟

          درباره ی assign:
          error نداد!!!
          تازه سیموله هم شد!!!
          و تازه در سیموله هم اگر کلاک سیستمم 1 پیکو یا 1 نانو باشه و کلاک های ورودی بیشتر از این مقدار جواب درستی هم میده!!!

          جناب مانیان:
          همه ی این ها هم اگه حل بشه،استادمون امروز گفت چرا با verilog نوشتی؟
          verilog زبان ساده ای است اما مشکلات زیادی برای سنتزش آن هم با لئوناردو داره!
          گفت که به vhdl تبدیلش کنم

          اولاً : آیا این گفته صحیح است ؟
          دوماً: مشکلی که vhdl داره اینه که در محیطی مثل ماکس پلاس (با کو آرتوس کار نکردم و بلد نیستم)
          گذاشتن یک چیزی معادل always که لیست حساسیت داره و دائماً چک میکنه ،بعیده
          چون شاید بگید که از loop و یک پروسسی استفاده کنم که کار always رو بکنه .
          اما به جز حلقه ی for سایر حلقه ها مثل while , loop ,... ساپورت نمیشه

          پیشنهادتون چیه؟؟؟
          تا حالا کد verilog رو سنتز کردید؟

          میدونید که آیا میشه همین راهی رو که تاحالا اومدم ادامه بدم یا بهتره برم سراغ vhdl

          با تشکر

          دیدگاه


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

            با سلام

            نوشته اصلی توسط f.fater
            من احتیاج به کلاک سیستمی در حدود 1 پیکو و یا 1 نانو دارم که اگر عکسش کنیم میشود 1 گیگا هرتز !
            آیا تراشه و یا تراشه هایی که چنین امکانی دارند می توانند چنین کلاکی را تولید کنند؟؟
            این فرکانس به نسبت بالا است. فکر کنم اکثر تراشهآ‌ها FPGA توانایی کار در این فرکانس را ندارند. شما دقیقا برای چه کاری میآ‌خواهید جمع فرکانس درست کنید؟ رادیو FSK ؟


            واقعا تفاوتی در سنتز و یا استفاده از verilog و vhdl نیست. در ضمن من حدس میآ‌زنم که در صنعت از verilog بیشتر از VHDL برای سنتز و ساخت مدارآ‌های دیجیتال استفاده میآ‌شود. به هر حال تفاوت خیلی خاصی برای طراحی مدارآ‌های دیجیتال بین این دو زبان نیست. خیلی از حرفآ‌هایی که در مقایسه Verilog و VHDL گفته میآ‌شود، معمولا بر اساس علایق شخصی است. من خودم به شخصه به verilog خیلی علاقه دارم و به نظرم کار با این زبان سادهآ‌تر است، ولی خوب به این معنی نیست که در VHDL کمبود و یا مشکلی وجود داشته باشد.
            نکتهآ‌ی دیگر که وجود دارد این است که شما باید دقت کنید که کدآ‌ها را قابل سنتز شدن بنویسید. مثلا همین پایه reset که به آن اشاره شد. من چند تجربه کوچک در زمینه verilog با fpgaهای altera و cpldهای xilinx داشتهآ‌ام. مشکل خاصی هم در سنتز شدن کد نداشتهآ‌ام.

            در مورد سوال شما درباره VHDL من باید بگم که این زبون رو بلد نیست. ولی خوب شاید شما سعی میآ‌کنید که ساختارآ‌های verilog را مستقیما به VHDL انتقال دهید در حالی که ممکن است شکل ساختارها کاملا در آنجا متقاوت باشد (یعنی یک عملکرد با دو ساختار کاملا متفاوت در دو زبان پیاده شود).

            درباره پروژه شما:
            کاری که شما میآ‌خواهید انجام دهید اصلا کار روتینی نیست. در ابتدا فرض کنید که تراشه FPGA شما بلوک کنترل کلاک ندارد.
            شما حتما باید در طرحآ‌تان یک کلاک خیلی بزرگتر از دو کلاک ورودی داشته باشید و دو کلاک ورودی را با این کلاک اندازه بگیرید و سپس با توجه به اندازهآ‌گیریآ‌های انجام شده کلاک فرکانس بالا را به اندازه جمع دو کالاک کوچک کنید. این روش کاملا ساده و قابل سنتز است.
            حالا اگر تراشه شما بلوک کنترل کلاک داشتهآ‌ باشد قضیه تا حدودی متفاوت میآ‌تواند باشد چون در اینجا شما میتوانید یکی از فرکانسآ‌ها را در یک ضریب ضرب کنید و فرکانس آن را افزایش دهید. ولی در این حالت نیز باید حداقل یکی از فرکانسآ‌ها را اندازه بگیرید که آن هم نیاز به یک کلاک مرجع دارد.

            به نظر پروژه شما تا حدودی شبیه به یک مدولاتور FSK است. شاید بد نباشد که پروژهآ‌هایی که در آن فرستندآ‌های دیجتال در FPGA وجود دارد را برسی کنید. علاوه بر این مباحث software radio نیز شاید تا حدودی کار گشا باشد.


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

            دیدگاه

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