热度 28
2014-8-6 16:43
16451 次阅读|
0 个评论
最近在准备找工作,复习了一下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 d; output q1,q2; wire d1; wire d2; assign d1=d ; assign d2=d ; 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 a; output reg c; integer j; reg int1; always @(a) begin int1=1; for(j=0;j if(a ==0) int1=0; c=int1; end endmodule module top_andx(d,q1,q2); input d; output q1,q2; andx #(2) u1(d ,q1); andx #(6) u2(d ,q2); endmodule ;j=j+1)