نوشته های من

:)
نوشته های من

YouTube: Mahdi TR
Telegram: https://t.me/MahdiTR619

Manners Maketh Man

بایگانی
آخرین مطالب
  • ۹۹/۱۰/۲۵
    Soul
محبوب ترین مطالب
مطالب پربحث‌تر

۲۹ مطلب با موضوع «مهندسی طور :: الکترونیک عمومی» ثبت شده است

مهاجرت به VHDL قسمت دوم البته ناقص

سه شنبه, ۶ فروردين ۱۳۹۸، ۱۱:۳۵ ب.ظ

 

سلام 

**

اوکی یه یه ماهی هست که میخوام این پست رو کاملش کنم نمیشه. دیگه همینجوری ناقص میزارمش

**

 

http://www.klabs.org/mapld05/presento/189_lewis_p.pdf

تو این پست میخوام یکی از قابلیتای جالب VHDL رو براتون بگم که تو سیگنال پروسسینگ خیلی کار رو ساده میکنه.

برای شروع، اگه میخواستیم که عدد اعشاری رو به صورت فیکسد پوینت بنویسیم تو باینری اینجوری میشد دیگه:

(12.375)_10=(110.011)_2

درسته؟

یعنی اعداد سمت راست ممیز 0.5 و 0.25 و 0.125 و ... میشن

حالا دو تا عدد رو میخوایم دو هم ضرب کنیم، میشه خیلی ساده مثل دو تا وکتور باینری باهاشون برخورد کرد و مثلا اگه جفتشون 3 تا ممیز دارن، برای این که نتیجه هم سه تا ممیز داشته باشه، وکتور نهایی که 6 تا ممیز داره رو 3 تاش رو ترانکیت میکنیم که خروجی عدد با مفهومی بشه.

ولی خب همه ی این کارا و بررسی این که این وسط overflow شده و این که حواسمون به ممیز ها باشه، خیلی کار اذیت کننده ایه. چیز نشدنی ای نیست ولی آزار دهندس.

مثال:

12.5x23.7 = 1100.100 x 10111.101

اول این که با سه تا ممیز نمیشه 23.7 رو نشون داد و نتیجه دقیق نیستش. 

برای این که این ضرب رو بتونیم بکنیم میایم عددا رو تو 2^3 ضرب میکنیم، که ممیزشون بپره

= 1100100 x 10111101 = 100 1001 1101 0100

بعدش میایم 3 تا بیت رو از سمت راست حذف میکنیم چون محاسباتمون fixed point هست و باید تعداد ممیز ها ثابت باشه

= 1001 0011 1010

که چون میدونیم 3 تا ممیز داریم عدد واقعی هست :

= 1 0010 0111.010 = 295.25

عدد درست 296.25 هست. حالا چون تعداد ممیز ها کم بود یکم دقت پایین بود ولی بالاخره تو FPGA چیزی که خدا زیاد گذاشته بیته. 

 

حالا یه شخصی به اسم آقای David Bishop اومدش یه لایبرری برای VHDL درست کرد که توش این کارای ضرب و جمع و ترانکیت کردن و ریسایز کردن و تبدیل فیکس به فلوت و ... رو قرار دادش.

من راجع به fixed point ها مینویسم. float قطعا دقت بیشتر داره و بهتره ولی خب سنتزش فکر میکنم خیلی سنگین میشه. شایدم نمیشه. نمیدونم.

 

این لایبرری اسمش fixed_pkg هست. 

توی مدل سیم میشه راحت سیمولیت کرد ولی تو کوآرتس سر سنتز گیر میده که نمیشناسه. چون که آقایون توی ورژن prime 15+ فقط گذاشتنش. ولی شما میتونید دستی ادش کنید از همین گیتهاب آقای بیشاپ https://github.com/FPHDL/fphdl

 

همچنین تو کوآرتس نمیتونید توی بلوک دیاگرام باس های fixed point و ... رو نمیتونید داشته باشید فقط تو کد میتونید. پس باید مثلا به وکتور تبدیلش کنید اگه تو شماتیک میاریدش. 

برای استفاده از کدا باید اول کتابخونه رو ادد کنید.

use IEEE.fixed_float_types.all;
use ieee.fixed_pkg.all;

ببخشید رنگ نداره!

بعد سیگنالاتون رو اینجوری تعریف میکنید:

 

signal a1 : sfixed(10 downto -20);

 

اول این که sfixed میگه که عدد سایند هست و ufixed هم داریم. دوم این که 10 یعنی 10 تا سمت چپ ممیز و منفی 20 یعنی 20 تا راست ممیز داره. که اگه با تایپ های نرمالی که قبلا دیده بودیم مقایسه بکنیم یکم جالبه.

حالا مثلا دو تا عدد sfixed اینجوری با هم جمع میشن

 

signal a,b : sfixed(5 downto -6);

signal c : sfixed(6 downto -6);

 

a<= sfixed(2.32,a); -- Size of the sfixed number must be determined here

b<= sfixed(1.55,5,-6); -- either this way or you can just do it like the previous line

c <= a+b;

 

دقت کنید عدد قبل ممیز نتیجه رو 6 بیتی گرفتم. اگه چیز دیگه ای بزارید اررور میده و کار نمیکنه چون جمع اینا که 5 بیتی هستن باید 6 بیتی باشه. من خودم 2 روز فکر کنم گیر این بودم چرا کار نمیکنه.

 

 حالا فرض کنید میدونید که میخواید نتیجه رو تو یه چیز 5 بیتی بریزید. از دیزاین خودتون آگاهید به قولی

signal c : sfixed(5,-6);

c <= resize(arg => a+b, size_res => c, overflow_style => fixed_saturate, round_style => fixed_round);

 

میخواستم یه کد برای فیلتر IIR بزارم ولی کده تو لپتاپمه و میدونید قضیه لپتاپ رو (آب و ..) خلاصه که نشد. ولی چیزی نداره خودتون میتونید بزنید. فقط عکسی که از خروجیش گرفته بودم رو میزارم

 

 

 
  • مهدی

مهاجرت به VHDL

شنبه, ۱۱ اسفند ۱۳۹۷، ۰۹:۴۹ ب.ظ

سلام

برای این کاری که دارم انجام میدم لازم شد که VHDL یاد بگیرم.

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

البته در حال بسیار نچسب بودن بسیار قوی و پر از امکاناته.

تو این پست یه نکته هایی که شاید بتونه مهاجرت از Verilog به VHDL رو آسون تر کنه رو مینویسم که خودم زیاد بهش برخورد کردم.

این پست هم خیلی سادس و چیزایی که خودم بلد بودم از درس مدار منطقی رو دارم میگم. خیلی امکانات دیباگ زیادی داره که اصلا نمیدونم که چیا رو نمیدونم. ولی بنظرم یه jump start خیلی خوبه برای کسی که میخواد از وریلاگ کوچ کنه VHDL.

1- ساختار یه ماژول: 

توی وریلاگ همه چیز رو توی یه ماژول مینوشتیم. مثلا از ساییت asic-world:

 1 //-----------------------------------------------------
  2 // Design Name : up_counter
  3 // File Name   : up_counter.v
  4 // Function    : Up counter
  5 // Coder�     : Deepak
  6 //-----------------------------------------------------
  7 module up_counter    (
  8 out     ,  // Output of the counter
  9 enable  ,  // enable for counter
 10 clk     ,  // clock Input
 11 reset      // reset Input
 12 );
 13 //----------Output Ports--------------
 14     output [7:0] out;
 15 //------------Input Ports--------------
 16      input enable, clk, reset;
 17 //------------Internal Variables--------
 18     reg [7:0] out;
 19 //-------------Code Starts Here-------
 20 always @(posedge clk)
 21 if (reset) begin
 22   out <= 8'b0 ;
 23 end else if (enable) begin
 24   out <= out + 1;
 25 end
 26 
 27 
 28 endmodule 

ورودی خروجی ها توی خط اول تعریف شدن و بعدش اومده گفته که چی هستن و چند بیتی هستن و بعدش reg تعریف کرده و بعدشم یه مدار sequential درست کرده که حساس به لبه ی بالا رونده کلاک هست و enable داره.

 

حالا همین مدار تو VHDL 

1 -------------------------------------------------------
  2 -- Design Name : up_counter
  3 -- File Name   : up_counter.vhd
  4 -- Function    : Up counter
  5 -- Coder       : Deepak Kumar Tala (Verilog)
  6 -- Translator  : Alexander H Pham (VHDL)
  7 -------------------------------------------------------
  8 library ieee;
  9     use ieee.std_logic_1164.all;
 10     use ieee.std_logic_unsigned.all;
 11 
 12 entity up_counter is
 13     port (
 14         cout   :out std_logic_vector (7 downto 0); -- Output of the counter
 15         enable :in  std_logic;                     -- Enable counting
 16         clk    :in  std_logic;                     -- Input clock
 17         reset  :in  std_logic                      -- Input reset
 18     );
 19 end entity;
 20 
 21 architecture rtl of up_counter is
 22     signal count :std_logic_vector (7 downto 0);
 23 begin
 24     process (clk, reset) begin
 25         if (reset = '1') then
 26             count <= (others=>'0');
 27         elsif (rising_edge(clk)) then
 28             if (enable = '1') then
 29                 count <= count + 1;
 30             end if;
 31         end if;
 32     end process;
 33     cout <= count;
 34 end architecture;

همون طور که دیده میشه تو نگاه اول 2-3 برابر بیشتر کد تایپ کردیم. گویا دکتر نوابی که خودش از اونایی بوده که استانداردای VHDL رو در اوردن، به این زبون میگن Verbose یعنی وراج. چون خیلی باید کد زده بشه.

اول کد یه سری لایبرری Add شده. 

این یکی از ویژگی های جالب VHDL هست که باید برای چیزایی که میخواید استفاده کنید حتما لایبرری هاشون رو اضافه کنید. تو یه پست بعدی مثلا یه لایبرری میگم که محاسبات fixed و floating پوینت رو انجام میده. بدون درد سر!

مثلا اینجا چون لازم بوده یه add انجام بشه، لایبرری unsigned logic اضافه شده.

 

تو نگاه دوم! میبینیم که ماژول در واقع یه تیکه نیست، دو تیکه هست. تو بخش اول entity تعریف میشه و تو بخش دوم architecture. 

entity از دو بخش(تا جایی که میدونم) تشکیل میشه. اولیش Generic ها هست و دومیش Port ها هست. Generic ها پارامتر هایی هستن که دیزاینتون با اونا تعریف میشه. مثلا میتونید تعداد بیت های یک رجیستر رو تو اون بگید. موقعی که دارید instance میگیرید از این ماژولتون، میتونید Generic ها رو ست کنید یا اگه کاری نداشته باشید میتونه default value داشته باشه.

بخش دوم Port ها هست که همون ورودی خروجی ها هست. این جا حتما باید سایزشون و تایپشون رو مشخص کنید. چندین روش برای تعریف کردن سایز وجود داره مثلا میتونید تعداد بیت ها رو بگید مثلا 

7 downto 0

یا میتونید range تعریف کنید که از فلان عدد تا فلان عدد باشه. بسته به نوع تایپ چیزی که تعریف میکنید داره. مثلا تو کتابخونه fixed point که میگم بعدا میتونید بگید

7 downto -24

یعنی 7 بیت برای بخش integer و 24 بیت برای بخش fractional.

آها راستی دقت کنید تو لیست ورودی ها، خط آخر ; نداره ! که بسیار آزار دهندس.

 

بریم پایین تر Architecture شروع میشه. آرکیتکچر در واقع نحوه ی کار کرد entity رو میگه. فکر میکنم میتونید چند تا Architecture مختلف تعریف کنید برای شرایط مختلف مثل اون چیزه تو C++

بعد از خط تعریف، باید signal ها رو تعریف کنید.

مفهوم سیگنال برای من خیلی ناراحت کننده بود در قدم اول. بخاطر این که وریلاگ، reg و wire داشت که کاملا کارکردشون مشخص بود ولی VHDL فقط همین signal رو داره که بسته به شرایطی که استفاده میشه، اگه مدار combinational باشه بدون رجیستر و اگه مدار sequential باشه با رجیستر میشه.

 

بعد ازون process رو میبینیم، این یه چیزی تو مایه های always هست تو وریلاگ ولی فکر میکنم مستقیم نمیتونید به posedege مثلا حساسش کنید. به یه سری سیگنال حساسش میکنید و بعد تو شرط ها posedge بودن یه چیزای دیگه رو چک میکنید.

 

بقیش خیلی شبیه وریلاگ هست. فقط باید حواستون باشه مثلا if ها then دارن و elsif درسته نه elseif یا else if(کار دیگه میکنه). و endif; هم داریم. که دقت کنید ; داره.

 

2- تایپ ها

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

 مثلا 

signal x : std_logic_vector(7 downto 0);

..

x <= 4;

کار نمیکنه چون 4 دسیمال هست.

باید بنویسید

x <= "00000100";

یا مثلا همچین چیزی هم با معنی هست.

x <= (2 => '1', 7 downto 4 => '1', others => '0');

که در نگاه اول بسیار اذیت میکنه. ولی خب در نهایت کمک میکنه سیگنالا اشتباه نشن.

این که keyword های زیادی داره خیلی گیج کنندس ولی کم کم عادت میکنید.

دقت کنید چون بیت بودن اونا توی ' ' قرار گرفتن. اون یکی چون وکتور بود توی " "  بود. اولیه چون عدد بود توی هیچی نبود. 

اگرم میخواید عدد بریزید باید کست کنید دیگه

x <= to_slv(4);

x <= std_logic_vector(4);

فکر کنم جفتشون کار میکنن.

 

3- وصل کردن چیزا.

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

 

4- مدارای combinational و sequential

باید توجه کنید که سینتکس هایی که برای این دوتا استفاده میشه فرق میکنه مثلا 

http://insights.sigasi.com/tech/signal-assignments-vhdl-withselect-whenelse-and-case.html