前言
写代码的时候,经常遇到VHDL的代码和Verilog代码混用的情况。因为,平时接触VHDL,或者Verilog少就会导致工作效率变低。这个帖子是平时工作的一些心得。
废话不多说,上活
看RTL代码,往往第一件事是看结构
Verilog的结构相比大家都很熟。
下面把VHDL 的语法结构与Verilog的语法结构对比,做成一个字典,方便大家读代码
Verilog | VHDL |
module() | entity xxx is port(A: in std_logic); end entity |
时序逻辑,或者组合逻辑 always@()begin A<=B end | 时序逻辑,或者组合逻辑 process() begin A<=B end process; |
组合逻辑 assign A=B; | 组合逻辑 A<=B; |
例化 原件名 XXX #(.A (A) ) ( .B (B), ) | Vhdl 需要例化声明+例化调用 --例化声明 component XXX is port() end component; --例化调用 XXX: 原件名 generic map(A=>A ) port map(B => B, ); |
VHDL 的其他不同点
1,VHDL 是不区分reg,wire, 在VHDL 中一律命名为 signal
有人问,那怎么区分阻塞不阻塞赋值。
在VHDL 中全部使用 A<= B; 赋值
2, VHDL代码分为 声明部分,和逻辑部分
VHDL有点像C, 我们在编写main()之前要定义一些全局变量,常数。
VHDL中在主体逻辑architecture之前也要定义信号。
entity XXX is
port();
end entity;
architecture XXX_arch of XXX is
signal A : std_logic;
signal B : std_logic_vector;
声明原件
begin --声明部分和逻辑部分的分界线 上面是声明,下面是逻辑
A<=B
原件例化
process()
begin
end process;
end architecture;
3 VHDL --是注释标记
总结 要想把一个Verilog 改成VHDL
step1: module --》entity XX is
port()
End entity;
step2:添加architecture XXX_arch of XXX is
把wire,reg改成signal , 把调用的原件声明一边
在wire 和reg定义的后面加上一个begin
step3:always 改成 process
删掉 assign, 全部改成<=