اطلاعیه

Collapse
No announcement yet.

ایجاد تعداد زیادی pwm موازی در fpga

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

    #16
    پاسخ : ایجاد تعداد زیادی pwm موازی در fpga

    ممنون از جوابتون. ولی 1 میلی ثانیه برای من فکر کنم زیاد باشه . چون دور موتور حداقل 2000 rpm هستش و پس یک دور رو در زمان 30 میلی ثانیه طی میکنه . هر یک دور هم اگه 150 قسمت کنیم میشه 200 میکرو ثانیه. پس اون زمان 3.8 میکرو ثانیه باید در 200 میکرو ثانیه رفرش بشه یعنی تعداد رفرش میشه 200/3.8 بار .

    با mega128 اگه کار کنیم 4 تا تایمر داره . 2 تا 8 بیتی و 2 تا 16 بیتی . میشه 8 تا pwm داشته باشیم؟ بعد یه مولتی پلکسر هم میزاریم تا چند تا سطر داشته باشیم. نظر شما همینه؟

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

    دیدگاه


      #17
      پاسخ : ایجاد تعداد زیادی pwm موازی در fpga

      دور موتور؟؟؟؟؟

      مطمئنی داریم راجع به یه چیز واحد تبادل نظر میکنیم؟؟؟؟؟؟؟

      دیدگاه


        #18
        پاسخ : ایجاد تعداد زیادی pwm موازی در fpga

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

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

        دیدگاه


          #19
          پاسخ : ایجاد تعداد زیادی pwm موازی در fpga

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

          نه آقا جون شاید بشه تو این سرعت با میکرو کار کرد ولی میتونی با میکرو جمعش کنی چون دردسرش کمتره. ولی فکر کنم آخرش باید سراغ همون fpga بری. اون کلاک 1 میلی ثانیه رو همونطور که گفتم باید خودت بسازی. پس اینجا میتونی بجای 1 میلی ثانیه از 200 میکرو ثانیه استفاده کنی. حالا بالا و پایینش هم خواستی بکنی میشه فقط ممکنه تصویرت بهم بریزه. که اونم مسلما اختیار و مشکل خودته.

          اصلا بذار من مدلشو اینجا قید میکنم. بدرد من که نمیخوره. ترشی هم نمیشه باهاش انداخت!


          module main(
          _CS,
          _SRAM_RD, _SRAM_Addr, _CLK_SRAM, _SRAM_Data,
          _CLK_PWM, PWM_Out, qSelects);

          parameter N_PIXELS=16, N_PWM=48, N_ADDR=4;

          input _CS; // module chip select
          output _SRAM_RD; // SRAM read strobe
          output[N_ADDR-1:0] _SRAM_Addr; // each byte contains a set of RGB values
          input[7:0] _SRAM_Data; // SRAM data bus (needed bits only)
          input _CLK_SRAM; // SRAM timing clock
          input _CLK_PWM; // PWM refresh clock
          output[N_PWM-1:0] PWM_Out; // 32 PWM channels (uses 32 bytes of memory)
          reg [N_PWM-1:0] PWM_Out;
          output[2:0] qSelects;
          reg[2:0] qSelects;

          reg[2:0] PWM_Counter;
          reg[1:0] s_cstate;
          reg[1:0] s_nstate;
          reg pixel_trigger;
          reg r_pwm;
          reg g_pwm;
          reg b_pwm;

          reg [N_ADDR-1:0] sram_adr;
          reg sram_rd;

          bufif0( _SRAM_Addr[3], sram_adr[3], _CS);
          bufif0( _SRAM_Addr[2], sram_adr[2], _CS);
          bufif0( _SRAM_Addr[1], sram_adr[1], _CS);
          bufif0( _SRAM_Addr[0], sram_adr[0], _CS);

          bufif0( _SRAM_RD, sram_rd, _CS);

          always @(posedge _CLK_PWM)
          PWM_Counter <= PWM_Counter + 1;

          always @(posedge pixel_trigger)
          begin
          r_pwm <= (PWM_Counter >= _SRAM_Data[2:0]) ? 1 : 0;
          g_pwm <= (PWM_Counter >= _SRAM_Data[5:3]) ? 1 : 0;
          b_pwm <= (PWM_Counter >= {_SRAM_Data[7:6],0}) ? 1 : 0;
          end

          wire sram_clk = _CLK_SRAM | _CS;

          always @(posedge sram_clk)
          begin
          case(s_cstate)
          0: // apply address
          begin
          sram_rd <= 1;
          pixel_trigger <= 0;
          end
          1: // assert RD
          begin
          sram_rd <= 0;
          end
          2: // de-assert RD, fetch data, trigger pixel computing
          begin
          pixel_trigger <= 1;
          sram_rd <= 1;
          end
          3:
          begin
          {qSelects,sram_adr} <= {qSelects,sram_adr} + 1;
          end
          endcase
          s_nstate <= s_cstate + 1;
          end

          wire[2:0] rgb_out = {r_pwm,g_pwm,b_pwm};

          always @(negedge sram_clk)
          begin
          case(sram_adr)
          0: PWM_Out[ 2: 0] <= rgb_out;
          1: PWM_Out[ 5: 3] <= rgb_out;
          2: PWM_Out[ 8: 6] <= rgb_out;
          3: PWM_Out[11: 9] <= rgb_out;
          4: PWM_Out[14:12] <= rgb_out;
          5: PWM_Out[17:15] <= rgb_out;
          6: PWM_Out[20:18] <= rgb_out;
          7: PWM_Out[23:21] <= rgb_out;
          8: PWM_Out[26:24] <= rgb_out;
          9: PWM_Out[29:27] <= rgb_out;
          10: PWM_Out[32:30] <= rgb_out;
          11: PWM_Out[35:33] <= rgb_out;
          12: PWM_Out[38:36] <= rgb_out;
          13: PWM_Out[41:39] <= rgb_out;
          14: PWM_Out[44:42] <= rgb_out;
          15: PWM_Out[47:45] <= rgb_out;
          endcase
          end

          always @(s_nstate)
          begin
          s_cstate <= s_nstate;
          end

          endmodule

          دیدگاه


            #20
            پاسخ : ایجاد تعداد زیادی pwm موازی در fpga

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

            always @(posedge pixel_trigger)
            begin
            r_pwm <= (PWM_Counter >= _SRAM_Data[2:0]) ? 1 : 0;
            g_pwm <= (PWM_Counter >= _SRAM_Data[5:3]) ? 1 : 0;
            b_pwm <= (PWM_Counter >= {_SRAM_Data[7:6],0}) ? 1 : 0;
            end

            تا اونجایی که من فهمیدم خانه حافظه 0 تا 2 برای led قرمز هستش (یعنی 3 بیت) ولی متوجه نمیشم که نقش pwm_counter اینجا چیه؟ مقایسه میکنه؟

            always @(posedge sram_clk)
            begin
            case(s_cstate)
            0: // apply address
            begin
            sram_rd <= 1;
            pixel_trigger <= 0;
            end
            1: // assert RD
            begin
            sram_rd <= 0;
            end
            2: // de-assert RD, fetch data, trigger pixel computing
            begin
            pixel_trigger <= 1;
            sram_rd <= 1;
            end
            3:
            begin
            {qSelects,sram_adr} <= {qSelects,sram_adr} + 1;
            end
            endcase
            s_nstate <= s_cstate + 1;
            end

            میشه یه توضیحی هم راجع به این دستورها بدین؟ خیلی ممنون از بابت برنامه ای که گذاشتین. شروع خوبیه.
            "در عجبم از مردمی که خود زیر شلاق ظلم و ستم زندگی می کنند و بر حسینی می گریند که آزادنه زیست" شریعتی
            در جهان روشنایی هایی وجوددارد که در عمیق ترین ظلمات نهانند.

            دیدگاه


              #21
              پاسخ : ایجاد تعداد زیادی pwm موازی در fpga

              من یه توضیح کلی میدم. اولا من خیلی راجع به fpga چیزی نمیدونم. دوم اینکه با verilog یکی دو تا مدل سنتز کردم که جواب داده. سوم:

              سیگنالهای ورودی و خروجی که مشخصه. یک سری مال sram هستش و یک کلاک برای زمانبندی دسترسی به sram که خودتون باید بسازین. مثلا 50 مگا هرتز برای dram های cache 20 نانو ثانیه کفایت میکنه. تئوری pwm اینجوریه (لااقل من اینجوری فکر میکنم) که یک autoreload-counter داریم که در یک پریود زمانی خاص بطور تکراری بایستی مقدار این شمارنده با مقدار preset مربوط به pwm مقایسه بشه تا مشخص بشه که چه موقعی بایستی سیگنال خروجی یک بشه. مثلا برای ایجاد یک سیگنال خروجی با duty cycle برابر با 33 درصد کافیه با توجه به یک کانتر با مقدار نهایی 7 چک بشه که اگه مقدار این کانتر از 33 درصد کل مقادیر یعنی 7/3 کمتر بود خروجی یک و در غیر این صورت صفر بشه.

              ضمنا اون سایت هم آدرسش اینه:

              www.reza_agha.brain.com/fpga_idea_for_ECA_user

              !!!!!!

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


              for(;
              {
              // phase 1
              sram_rd = 1; // disable sram read access
              pixel_trigger = 0; // read_pixels_data();

              // phase 2
              sram_rd = 0; // enable sram read access

              // phase 3
              sram_rd = 1; // disable sram read access
              pixel_trigger = 1; // read_pixels_data();

              // phase 4
              if( sram_adr == 15 )
              {
              sram_adr = 0;
              qSelects++;
              }
              else
              sram_adr ++;
              }


              منتهی چون این کد رو نمیشه در سخت افزار پیاده کرد از یک ماشین وضعیت ساده استفاده میکنم. که میشه گفت مثل کد زیر هست (همون منطق):

              for(;
              {
              for(int phase=0; phase<4; phase++)
              {
              switch( phase )
              {
              case 0: // phase 1
              sram_rd = 1; // disable sram read access
              pixel_trigger = 0; // read_pixels_data();
              break;
              case 1: // phase 2
              sram_rd = 0; // enable sram read access
              break;
              case 2: // phase 3
              sram_rd = 1; // disable sram read access
              pixel_trigger = 1; // read_pixels_data();
              break;
              case 3: // phase 4
              if( sram_adr == 15 )
              {
              sram_adr = 0;
              qSelects++;
              }
              else
              sram_adr ++;
              break;
              }
              }
              }


              چون اینجا نمیشه تابع فراخوانی کرد یک رجیستر بنام pixel_trigger تعریف کردم که با استفاده از تغییر مقدار اون بتونم یک مکانیسم دیگه رو فعال یا غیر فعال کنم. و این مکانیسم خروجی سه کانال pwm رو ایجاد میکنه.

              دیدگاه


                #22
                پاسخ : ایجاد تعداد زیادی pwm موازی در fpga

                راستی فکر میکنم این مدل یکی دو تا اشکال کوچولو داره اگه خواستی پروگرامش کنی یه pm بهم بده تا کاملش کنم که از نحوه کارش 100 درصد مطمئن باشم.

                دیدگاه

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