به نام خدا!
سلام عرض میکنم خدمت شما دوستان عزیز و هموطنان گرامی!
شاید شما هم بخواید توی یه پروژه از قابلیت های دو زبان قدرتمند 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 تون هست!
همین تموم شد!
موفق باشید!
یا علی مدد...!