اطلاعیه

Collapse
No announcement yet.

برنامه نویسی به زبان VHDL

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

    برنامه نویسی به زبان VHDL

    دوستان ممکنه کد VHDL ابن دو برنامه رو اینجا قرار بدید.
    1)کد VHDL یک up-down cnt با قابلیت load را بنویسد
    2)کد وی اچ دی ال shift_register با قابلیت شیفت به چپ وراست را بنویسد
    .........
    ممنون میشم راهنمایی کنید
    خیلی لازم دارم
    صبرت که تمام شد نرو!
    "معرفت"
    تازه از آن لحظه آغاز می شود...

    #2
    پاسخ : برنامه نویسی به زبان VHDL

    کد کانتر معمولی:
    http://baranelec.mihanblog.com/post/38
    هرچی می خوای میتونی با استفاده از دستور when بهش اضافه کنی.( باید برنامه مورد نظرتو به قسمت when- else اضافه کنی)
    ساده هست. تلاشتو بکن موفق می شی :applause:
    مهم نيست که کجايي هستي، چه رنگي هستي، به چه زبوني حرف مي زني. مهم اينه که انسان باشي.
    http://baranelec.mihanblog.com/
    آینده ای خواهم ساخت که گذشته ام در برابرش زانو بزند...

    دیدگاه


      #3
      پاسخ : برنامه نویسی به زبان VHDL

      ممنون از راهنمایی تون ولی این برنامه رو قبل از اینکه شما پاسخ بدیدبا موفقیت انجامش دادم ولی با این حال بازم ممنونننننننن...
      البته یه راهنمایی ازتون در مورد نحوه نوشتن برنامه دیکدر 4x16 با دو تا دیکدر 3x8 داشتم....ممنون میشم راهنمایی کنید.
      صبرت که تمام شد نرو!
      "معرفت"
      تازه از آن لحظه آغاز می شود...

      دیدگاه


        #4
        پاسخ : برنامه نویسی به زبان VHDL

        1- هر کدام از دیکودرهای 3به 8 به یک پایه enable نیاز دارند که وقتی غیر فعال باشد، خروجی صفر باشد.
        بیت پر ارزش یعنی Y3 را به یکی از این پایه ها وصل کن و not آن را به پایه دیگر.
        2- بقیه ورودی ها یعنی Y0 تا Y2 را مستقیم به ورودی هر دو دیکدر وصل کن.

        با نوشتن یک برنامه دیکدر 3 به 8 و استفاده از port map به راحتی میشه برنامه رو بنویسی.
        مهم نيست که کجايي هستي، چه رنگي هستي، به چه زبوني حرف مي زني. مهم اينه که انسان باشي.
        http://baranelec.mihanblog.com/
        آینده ای خواهم ساخت که گذشته ام در برابرش زانو بزند...

        دیدگاه


          #5
          پاسخ : برنامه نویسی به زبان VHDL

          سلام
          شما نیازی به نوشتن این کدها ندارید ..
          میتونید از code example های خود ise استفاده کنید. ( همون لامپ زرد رنگ بالای صفحه)...
          پیشنهاد دیگه استفاده از ip core برای این کاره..
          راه اول ساده تره ولی راه دوم از لحاظ پیاده سازی بهینه تره ...
          واسه کار شما همون روش اول بهتره...

          دیدگاه


            #6
            یک سوال

            سلام به همه دوستان. 1 سوال کلی دارم.
            اگه تو یه برنامه 2 تا پروسس داشته باشی و بخای از خروجی
            یکی از اون ها به عنوان ورودی یکی دیگه استفاده کنی راهش چیه؟
            اگه از یک سیگنال برا هر دو استفاده کنی خطای مولتی سورس میده.
            اگه در هر پروسس متغیر تعریف کنی و بعد خروجی اولی رو بریزی تو یه سیگنال
            و تو پروسس دوم مقدار اون سیگنال رو بریزی تو متغیر پروسس دوم بازم مشکل پیش میاد.
            چون هر بار پروسس دوم اجرا میشه مقدار متغیرش دوباره میشه مقدار متغیر پروسس اول ...
            ممنون میشم راهنماییم کنید

            دیدگاه


              #7
              پاسخ : برنامه نویسی به زبان VHDL

              یک سگنال تعریف کن
              سیگنال تو پروسس اول تغییر می کنه.
              از سیگنال تو پروسس دوم استفاده کن ولی تغییرش نده.
              به همین سادگی
              مهم نيست که کجايي هستي، چه رنگي هستي، به چه زبوني حرف مي زني. مهم اينه که انسان باشي.
              http://baranelec.mihanblog.com/
              آینده ای خواهم ساخت که گذشته ام در برابرش زانو بزند...

              دیدگاه


                #8
                پاسخ : برنامه نویسی به زبان VHDL

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

                دیدگاه


                  #9
                  پاسخ : برنامه نویسی به زبان VHDL

                  ممنون از راهنماییتون.
                  چیزی که میگید درسته اما برا کاری که من میخام جواب نمیده.
                  من تو پروسس اول میخام 100 بیت دیتا که به صورت سریال و سنکرون
                  (از طریق دو پین) به fpga وارد میشه رو بخون. برا این قیمت یه شیفت رجیستر نوشتم.
                  بعد از 100 کلاک، میخام مقدار این رجیستر وارد متغیر پروسس دوم بشه و این دفعه با
                  کلاک خود fpga به صورت سریال سنکرون ارسال بشه. بنابر این اون مقداری که باید تو پروسس دوم
                  کپی بسه فقط یه بار باید ریخته بشه. اگه ما تو پروسس دوم بنویسم DataOut <= DataIn و بعد شیفت بدیم
                  هر وقت کلاک بیاد مقدار DataOut برابر DataIn میشه. و هر چقدر شیفت بدی همش بیت اول ارسال میشه.
                  چجوری میشه که مقدار دهی DataOut فقط 1 بار انجام بشه و بعد 100 بار شیفت پیدا کنه؟
                  امیدوارم منظورم درست گفته باشم. با تشکر از راهنماییتون

                  دیدگاه


                    #10
                    پاسخ : برنامه نویسی به زبان VHDL

                    این طور که من فهمیدم کاری که داری میکنی اینه که یک مقدار 100 بیتی به صورت سنکرون و با یک کلاک غیر از کلاک اصلی دریافت می کنی و بعد از کامل شدن دریافت داده (دریافت 100 بیت) این داده 100 بیتی رو میخوای در پروسسی با همون کلاک اصلی به یک پورت خروجی بفرستی.
                    در پروسس اول احتمالاً یک شمارنده گذاشتی که تعداد بیت های دریافتی رو میشماره (با هر کلاک سنکرون با دیتا یکی زیاد میشه) و هر وقت به 100 رسید مقدار 100 بیت در شیفت رجیستر DataIn قرار گرفته و سیگنالی (مثلاً به اسم start) یک میشه که به پروسس دوم میفهمونه که حالا شروع به انتقال دیتا کن. مشکل اینه که اگه مقدار start رو بخوای توی همین پروسس در کلاک بعدی صفر کنی پروسس دوم که کلاک دیگه ای داره، چند بار اجرا شده و اگه بخوای توی پروسس دوم یه شرط بذاری که هر وقت مقدار start یک بود صفرش کنه، باز هم نمیشه چون نمیشه به یک سیگنال در دو پروسس دسترسی داشت.
                    راه حل پیشنهادی:
                    چون توضیحش طولانی میشه کد رو میذارم خودت تحلیل کن، اگه دوستان راه های ساده تر دارن حتماً بگن.
                    کد:
                    library IEEE;
                    use IEEE.STD_LOGIC_1164.ALL;
                    
                    entity Top is
                      Port ( clk : in STD_LOGIC;
                          sData : in STD_LOGIC;
                    			 sClk : in STD_LOGIC;
                          Dout : out STD_LOGIC
                    	);
                    end Top;
                    
                    architecture Behavioral of Top is
                    	signal start,p_start,sDout : std_logic := '0';
                    	signal DataIn : std_logic_vector(0 to 99) := (others => '0');
                    begin
                    
                    
                    Receive_proc: process(sclk)
                    	variable i : integer range 0 to 100 := 0;
                    begin
                    	if rising_edge(sClk) then
                    		DataIn(i) <= sData;
                    		if i = 99 then
                    			start <= '1';
                    			i := 0;
                    		else
                    			start <= '0';
                    			i := i + 1;
                    		end if;
                    	end if;
                    end process;
                    
                    Send_proc: process(clk)
                    	variable Send : std_logic := '0';
                    	variable i : integer range 0 to 100 := 0;
                    begin
                    	if rising_edge(clk) then
                    		p_start <= start;
                    		if p_start = '0' and start = '1' then
                    			Send := '1';
                    			sDout <= DataIn(i);
                    			i := i + 1;
                    		elsif i = 100 then
                    			i := 0;
                    			Send := '0';
                    		elsif Send = '1' then
                    			sDout <= DataIn(i);
                    			i := i + 1;
                    		end if;
                    	end if;
                    end process;
                    
                    Dout <= sDout;
                    
                    end Behavioral;
                    این هم TestBench:

                    کد:
                    LIBRARY ieee;
                    USE ieee.std_logic_1164.ALL;
                     
                    ENTITY tb_Top IS
                    END tb_Top;
                     
                    ARCHITECTURE behavior OF tb_Top IS 
                     
                      COMPONENT Top
                      PORT(
                         clk : IN std_logic;
                         sData : IN std_logic;
                         sClk : IN std_logic;
                         Dout : OUT std_logic
                        );
                      END COMPONENT;
                      
                    
                      --Inputs
                      signal clk : std_logic := '0';
                      signal sData : std_logic := '0';
                      signal sClk : std_logic := '0';
                    
                     	--Outputs
                      signal Dout : std_logic;
                    
                      -- Clock period definitions
                      constant clk_period : time := 10 ns;
                      constant sClk_period : time := 100 ns;
                      signal sda : std_logic_vector(0 to 99) := X"FEDCBA9876543210FEDCBA987";
                    BEGIN
                     
                    	-- Instantiate the Unit Under Test (UUT)
                      uut: Top PORT MAP (
                         clk => clk,
                         sData => sData,
                         sClk => sClk,
                         Dout => Dout
                        );
                    
                      -- Clock process definitions
                      clk_process :process
                      begin
                    		clk <= '0';
                    		wait for clk_period/2;
                    		clk <= '1';
                    		wait for clk_period/2;
                      end process;
                     
                      sClk_process :process
                      begin
                    		sClk <= '0';
                    		wait for sClk_period/2;
                    		sClk <= '1';
                    		wait for sClk_period/2;
                      end process;
                     
                    
                      -- Stimulus process
                      stim_proc: process
                      begin		
                       -- hold reset state for 100 ns.
                       wait for 100 ns;	
                    
                       wait for clk_period*10;
                    
                       -- insert stimulus here 
                    		
                       wait;
                      end process;
                    	
                    	Receive_proc: process(sClk)
                    		variable i : integer range 0 to 100 := 0;
                    	begin
                    		if rising_edge(sClk) then
                    			if i = 100 then
                    --				i := 0;
                    			else
                    				sData <= sda(i);
                    				i := i + 1;
                    			end if;
                    		end if;
                    	end process;
                    END;
                    و نتیجه شبیه سازی:

                    لطفاً برای انجام پروژه های دانشجویی پیام خصوصی نفرستید.
                    لطفاً سؤالاتی که در انجمن قابل طرح شدن هستند پیام خصوصی نکنید.
                    با تمام وجود گناه کرديم اما نه نعمتش را از ما گرفت نه گناهان ما را فاش کرد اطاعتش کنيم چه مي کند؟"دکتر شريعتي"
                    اگر جايي که ايستاده ايد را نمي پسنديد، عوضش کنيد شما درخت نيستيد!! "پاسكال"
                    يا به اندازه ي آرزوهايت تلاش کن يا به اندازه تلاشت آرزو کن. "شکسپير"

                    دیدگاه


                      #11
                      پاسخ : برنامه نویسی به زبان VHDL

                      سلام خدمت استاد هادی
                      دقیقا کاری که گفتین رو میخام انجام بدم.
                      ممنون از کدی که گذاشتین. امیدوارم ازش سر در بیارم.
                      یه راه هم به ذهن خودم رسیده. تو پروسس دوم با لبه بالا رونده start دیتای ورودی رو کپی کنم.
                      DataOut <= DataIn . اینجوری فقط یه بار دیتا کپی میشه. بعد سیگنال DataOut رو 100 بار شیفت بدم
                      و بفرستم رو پین خروجی. برای ارسال مجدد دیتا از PC به fpga باید یه سیگنال ریست ارسال بشه که کل
                      سیگنال ها صفر بشن. فکر می کنید اینجوری هم جواب بده؟
                      فردا تست می کنم. ممنون از همه دوستان.

                      دیدگاه


                        #12
                        پاسخ : برنامه نویسی به زبان VHDL

                        با سلام دوباره.
                        آقا هادی فهمیدم چیکار کردین. روش جالبی بود. در واقع شما
                        لبه بالا رونده start رو شناسایی کردین و بعد یه سیگنال send تعریف کردین
                        که کنترل ارسال دیتای خروجی رو انجام میده. یه رجیستر 100 تایی هم بیشتر
                        تعریف نکردین. عالی بود.
                        تشکر تشکر تشکر

                        دیدگاه


                          #13
                          پاسخ : برنامه نویسی به زبان VHDL

                          سلام دوستان. سال نو مبارک.
                          من میخام یه سری اطلاعات رو به صورت سریال آسنکرون از avr بفرستم
                          و با fpga بخونم. core هایی که بود رو دیدم چیزی سر در نیاوردم. خودم
                          کدش رو نوشتم. مشکلی که هست اینه که اگر یه دیتای ثابت رو پشت
                          سر هم بفرستم درست دریافت نمیشه اما اگه تاخیر زیادی(ms 50) بین هر فریم داده
                          بذارم درست میشه. کسی کد بهتری سراغ داره؟ ممنون میشم راهنمایی کنید.
                          با تشکر از همه دوستان.

                          دیدگاه


                            #14
                            پاسخ : برنامه نویسی به زبان VHDL

                            سلام. سال نو شما هم مبارک.
                            خودم از این core استفاده می کنم. کدش یه مقدار پیچیده نوشته شده ولی جواب میده.
                            ضمناً میتونی کد خودت رو هم بذاری تا بررسی بشه.
                            لطفاً برای انجام پروژه های دانشجویی پیام خصوصی نفرستید.
                            لطفاً سؤالاتی که در انجمن قابل طرح شدن هستند پیام خصوصی نکنید.
                            با تمام وجود گناه کرديم اما نه نعمتش را از ما گرفت نه گناهان ما را فاش کرد اطاعتش کنيم چه مي کند؟"دکتر شريعتي"
                            اگر جايي که ايستاده ايد را نمي پسنديد، عوضش کنيد شما درخت نيستيد!! "پاسكال"
                            يا به اندازه ي آرزوهايت تلاش کن يا به اندازه تلاشت آرزو کن. "شکسپير"

                            دیدگاه


                              #15
                              پاسخ : برنامه نویسی به زبان VHDL

                              سلام. ممنون از لطفتون

                              دیدگاه

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