最近在准备找工作,复习了一下VHDL与Verilog的语法知识,以前大多用Verilog写代码,突然写VHDL总是有点不适应,特别在运算符,操作符上,两种语言差别比较大,还有一些常用的语句,比如if,begin end 等容易混淆。
对比着学习两种语言更能深入理解每种语言,这次选择端口映射和参数传递方面做个比较。
VHDL的参数传递需要声明和映射,声明语句generic(n:integer:=8);初始值可有可无,映射语句为generic map(n=>4) 。VHDL的端口映射有位置关联方式和名字关联方式,
位置关联为port map(a1);a1为本模块信号。
名字关联方式为port map(a=>a1); a为例化元件端口,a1为本模块连接端口的信号。
verilog的参数传递使用parameter和#,parameter 定义参数,必须要赋初值,
parameter n=8; 映射的时候#(4)就可以了。verilog的端口映射也分为位置映射和名字关联映射。
位置关联为u1(a1,b1);a1,b1为本模块中连接端口的信号;
名字关联是u1(.a(a1),.b(b1));a,b为例化元件信号,a1,b1,连接端口的信号。
带例化元件
module andx(a,c);
顶层设计
input [7:0]d;
output q1,q2;
wire [1:0]d1;
wire [5:0]d2;
assign d1=d[1:0];
assign d2=d[7:2];
andx #(2) u1(.a(d1),.c(q1));
andx #(6) u2(.a(d2),.c(q2));
这两种语言的例化方式基本相同,都是将带例化的端口信号放在前面包含.a(a1)或指向a=>a1要连接端口的信号。
下面用一个与门作为例子。两种语言实现相同的功能。
VHDL
library ieee;
use ieee.std_logic_1164.all;
entity andn is
generic (n:integer);
port(
a:in std_logic_vector(n-1 downto 0);
c:out std_logic
);
end andn;
architecture behav of andn is
begin
process(a)
variable int:std_logic;
begin
int :='1';
for i in 0 to a'length-1 loop
if a(i)='0' then int :='0';
end if;
end loop;
c<=int;
end process;
end behav;
library ieee;
use ieee.std_logic_1164.all;
entity exn is
port(
d1,d2,d3,d4,d5,d6,d7:in std_logic;
q1,q2:out std_logic
);
end exn;
architecture behav of exn is
component andn
generic (n:integer);
port(
a:in std_logic_vector(n-1 downto 0);
c:out std_logic
);
end component;
begin
U1:andn generic map(n=>2) port map(a(0)=>d1,a(1)=>d2,c=>q1);
U2:andn generic map(n=>5) port map(a(0)=>d3,a(1)=>d4,a(2)=>d5,a(3)=>d6,a(4)=>d7,c=>q2);
end behav;
Verilog:
module andx(a,c);
parameter n=8;
input [n-1:0]a;
output reg c;
integer j;
reg int1;
always @(a)
begin
int1=1;
for(j=0;j
if(a[j]==0) int1=0;
c<=int1;
end
endmodule
module top_andx(d,q1,q2);
input [7:0]d;
output q1,q2;
andx #(2) u1(d[1:0],q1);
andx #(6) u2(d[7:2],q2);
endmodule
;j=j+1)<>
文章评论(0条评论)
登录后参与讨论