به نام خدا!

سلام عرض میکنم خدمت شما دوستان عزیز و هموطنان گرامی!

شاید شما هم بخواید توی یه پروژه از قابلیت های دو زبان قدرتمند  VHDL و Verilog بهره ببرید! روش کارش رو امروز ما میگیم! (البته هیچ کار خاصی نداره)!

- استفاده وریلوگ در زبان VHDL

 به عبارت دیگر VHDL زبان مادر یا حلال است

همون طور که میدونید برنامه ISE از دو زبان  VHDL و Verilog پشتیبانی میکنه! فقط برای استفاده از این دو زبان بعد از ایجاد پروژه هنگام ساخت ماژول میتونید VHDL Module یا Verilog Module رو انتخاب کنید! و در نهایت بعد از اینکه کدتون رو نوشتید میتونید اونو به هم وصل کنید! اینکار دقیقا مثل وصل کردن دو VHDL Module هست! به عنوان مثال یک پروژه ایجاد کنید و (زبان برنامه نویسی در هنگام ایجاد پروژه زیاد مهم نیست! شما روی اون زبانی بزارید که بیشتر ازش استفاده میکنید و قصد دارید پروژه رو با اون زبان بنویسید) و دو ماژول ایجاد کنید (ابتدا  VHDL Module و سپس Verilog Module) بعد توی Verilog Module کد زیر رو بنویسید!

`timescale 1ns / 1ps
module Counter(
    input  a ,
input  CLK,
input  reset,
    output reg Q
    );

always  @(posedge CLK or posedge reset)
 if (reset)
   Q <= 0;
else
 Q <= ~ a;
endmodule

و در VHDL Module کد زیر رو قرار بدید!

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity Counter_VHDL is
    Port (   ax     : in  STD_LOGIC;
CLKx   : in  STD_LOGIC;
resetx : in  STD_LOGIC;
Qx     : out  STD_LOGIC);
end Counter_VHDL;
architecture Behavioral of Counter_VHDL is
component Counter port (
    a     : in  STD_LOGIC;
CLK   : in  STD_LOGIC;
reset : in  STD_LOGIC;
    Q     : out  STD_LOGIC
);
end component;

begin
Counterx : Counter port map (
    a     => ax,
CLK   => CLKx,
reset => resetx,
    Q     => Qx
);
 
end Behavioral;


اینطوری کد وریلوگ، یک زیر مجموعه برای توصیف ماژول اصلی است!

این هم لینک کل پروژه!


- استفاده VHDL در زبان وریلوگ

اینجا زبان وریلوگ زبان مادر یا حلال (حل کننده) است!

خیلی مثل هم هستن! ولی من اینجا میزارم تا راحت باشید!

کافیه کد VHDL تون رو باز کنید و اسم entity تون رو کپی کنید و برید توی کد وریلوگ اونجا یه خط مثل خط زیر بنویسید!

port_name( external_signal_name )

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

adder6 adder( data_a, data_b, carry_i, , carry_o);

adder6 adder( .a(data_a), .b(data_b), .sum(summation), .ci(carry_i), .co(carry_o));

اگه به دو خط بالا نگاه کنید متوجه میشید فرقش چیه! توی اون اولیه پورت ها به ترتیب نوشته شده یعنی مثلا توی کد VHDL ورودی a اول تعریف شده بعدش به ترتیب b و sum و ci و pout و co تعریف شدن! و اگر به خط اولی نگاه کنید میبینید قبل از  carry_o دو تا , داره یعنی در واقع اون پین رو نادیده گرفته و هیچ پورتی رو بهش ربط نداده! و توی پایینی هم اصلا اسمش از pout نیاورده یعنی اصلا تعرفیش نکرده!

دقت کنید که اون adder6 اسمی هست که شما برای ماژولتون میزارید و adder اسم اصلی entity تون هست!

همین تموم شد!

موفق باشید!

یا علی مدد...!