当我们刚开始学习FPGA时,一定会碰着一个问题:
学习Verilog还是VHDL?
等我们学习FPGA到一定程度参加口试时,口试者也会问你一个问题:
你以前用Verilog还是VHDL开拓?
你已经习气某种措辞,也创造措辞不是学习FPGA时须要考虑的问题,它仅仅是硬件描述措辞工具而已。可是,当你创造一份和你利用措辞不同的代码作为参考时,你又开始想:
我往后的事情是不是要二种措辞都会,这样事情才会得心应手?
事实上,两种措辞之间是可以相互转换的。
对付我们做FPGA开拓职员来说,如何快速在Verilog和VHDL之间互转,加快开拓产品的进度,而不是由于只懂某一种措辞而局限了自己的开拓。
Vivado可以看两种措辞的差异Verilog与VHDL语法是互通且相互对应的,如何查看二者对同一硬件构造的描述,可以借助EDA工具,如Vivado,打开Vivado后它里面的措辞模板后,也可以比拟查看Verilog和VHDL之间的差异。
XHDL软件转换所用软件如下图所示:
上图是把转换成VHDL格式的代码,再转换回verilog后与原代码比拟的图,可以看出,一些注释之类的信息都没有了,原来的代码规范和风格也发生了变革。
在转换的过程,该软件对代码中的汉语注释不支持,如果涌现汉字就无法转换。
笔者之前就曾试着写过Verilog转VHDL代码的工具,见:Verilog HDL代码转VHDL代码,无奈由于不是软件开拓出身,写出来的东西通用性和完善性很差。写到此处,再次想起汉天下董事长杨清华所说的话,互联网讲究的是差异化的商业模式,很牛的产品定义,早期不看发卖额而看流量,越快越好。这对IC是很恐怖的事情,让全体家当变得很暴躁。互联网的模式,在某种程度上是毒瘤。发展集成电路芯片,须要把互联网的模式认知去除。芯片行业须要长期积累、持续关注,须要八年、十年的积累,这个耐心和耐性很主要。
试想一下,如果这么一个大略的小软件是互联网领域常常用到的,估计早已经各处都是了吧,并且也都很好用呢!
以下仅对Verilog转VHDL过程中涌现的问题进行解释。
Xhdl软件转换后状态机的问题含有状态机的Verilog代码被xhdl软件转换后会涌现两种情形:
1、当verilog代码中parameter常量写在紧挨着端口位置时,xhdl软件会将其转换为vhdl中的generic内的可通报的参数,如图:
2、当parameter在其它地方涌现时,xhdl会将其转换为constant常量,如图:
无论哪种办法,将个中有缺点的地方改正后,都不会涌近况况机运行出错,也便是不用将这种状态机书写办法变动为vhdl语法中专门的状态机书写办法。
function转换位置涌现问题在用xhdl软件完成转换后会涌现function写在了process块内的情形,涌现此问题应将function改在architecture下面(与定义旗子暗记在相同的位置)。
旗子暗记只能赋值给与它位宽类型相同的旗子暗记如下图中的两个旗子暗记:
b <= a;
在verilog中此种赋值办法意思是将a的前3位赋值给b,但是在vhdl中此种赋值办法会报出位宽不匹配的缺点,应将其变动为:
b <= a(2 downto 0);
同时须要把稳a、b的数据类型必须相同,如图中必须都为std_logic_vector类型。
没有逻辑与,需用其它办法办理在vhdl中没有逻辑与(verilog中的&&),只有按位与(verilog中的&,vhdl中的and),以是verilog中的逻辑与,在vhdl中有时须要用等价的办法更换,比如:
须要更换为:
把稳数据类型转换符号利用的是否精确在vhdl中有多种数据类型,它们之间可以通过数据类型转换符号相互转换。在xhdl软件中,数据类型转换一样平常都会涌现缺点,详细的缘故原由是转换符号利用缺点,而在vhdl的语法书上先容的并不全面。下面先容几中常用的数据类型转换符号:
1、IEEE.std_logic_1164.all库中包含的:
(1)bit_vector to std_logic_vector :
<slv_sig> = to_stdlogicvector(bv_sig);
(2)std_logic_vector to bit_vector :
<bv_sig> = to_bitvector(<slv_sig>);
2、IEEE.std_logic_arith.all库中包含的:
integer to std_logic_vector :
<slv_sig> = CONV_STD_LOGIC_VECTOR(<int_sig>,<integer_size>);
3、IEEE.std_logic_signed.all库中包含的:
std_logic_vector to integer :
<int_sig> = CONV_INTEGER(<slv_sig>);
把稳:选用某种数据类型转换符号的时候一定要确认是否包含了相应的库。
其它转换符号可以在如下图的ise软件相应的目录下查找
if后的判断语句在某些情形会涌现语法没缺点逻辑涌现缺点此种情形比较少见,但是一样平常很难创造,只有通过大量仿真找到缺点。详细情形如下图:
原verilog代码:
if((MDR_port_i & outport) == 32'b0)
Xhdl软件转换后语法无缺点逻辑涌现缺点:
IF((MDR_port_i /= \"大众0000000000000000000000000000000\"大众) AND outport /= \公众0000000000000000000000000000000\"大众 = false)
修正后:
IF((MDR_port_i AND outport) = \公众0000000000000000000000000000000\"大众 )
个人总结:在原verilog代码中,当if后的判断句涌现按位与(&)时,Xhdl软件转换成vhdl后很大可能会涌现语法精确逻辑缺点。
并置运算时碰着的问题由于在verilog语法中,位宽不同的两个旗子暗记也可以相互赋值,但是在vhdl中对此有严格哀求位宽相同,而xhdl软件在转换的时候不会检测这些,以是常常会涌现位宽不匹配的情形,尤其是在并置运算时,以是要严格检讨并置后的位宽与所赋值旗子暗记是否相同。
在verilog中某一旗子暗记可以赋值给几个并置的旗子暗记,但是在vhdl中不许可这么做,除非左侧并置的都为std_logic类型旗子暗记,右侧为std_logic_vector类型旗子暗记,把稳此时在vhdl中并不是用“&”这个并置运算符,而是“,”。(bit以及bit_vector是否有相似功能暂时未知)详细情形如图:
缺点,由于b是std_logic_vector类型
精确情形如下图:
Bool类型的利用以及会涌现的问题在verilog中几个旗子暗记经由关系运算后返回的值是1或者0,但是在vhdl中返回的确是bool类型的值,也便是说返回的是true或者false。
1、vhdl中在if后的判断条件末了必须为布尔类型,如图:
2、verilog和vhdl中旗子暗记经由关系运算后返回值的差异,如图:
When-else语句不能用在process块内软件转换后的when-else语句常常被放在process块内,导致涌现问题。由于when-else语句是并行旗子暗记赋值语句,它本身就相称于一个进程process,因此不能放在进程体中。进程是不能够嵌套的。
位移操作左侧为bit类型,右侧为integer类型Verilog中的位移运算经xhdl软件转换后必涌现缺点,缺点的缘故原由是转换成vhdl代码后位移符号两侧数据类型出错,如图
缺点情形:
修正后的精确格式:
位移符号左侧该当是bit类型,以是将std_logic_vector类型的旗子暗记转换为bit类型,数字“63”默认为integer类型,位移后的结果仍旧为bit类型,以是须要将其装换为std_logic_vector类型,并赋值给相同类型的旗子暗记。
真双口RAM的IP核的使能旗子暗记把稳真双口RAM的IP核的使能旗子暗记的数据类型,在顶层例化时要把稳要只取使能旗子暗记第0位的与旗子暗记连接的办法。
由于真双口RAM在例化后“wea”“web”为std_logic_vector(0 downto 0),以是要取这两个端口的0位与旗子暗记连接。
while循环在vhdl中不要利用while循环,会涌现问题,将while循环换为for循环
top层输入输出端口不接旗子暗记的情形1、在top层,例化的某个模块输出端口不连旗子暗记时,只须要在例化此模块处将此端口删除或注释掉即可,如图:
2、当在top层例化的某一模块的输入端口无旗子暗记连接时,必须将此端口处连接“U(未初始化)”状态(理论上讲将“U”换为“Z”也可以,但实际上会报出语法缺点,在vhdl语法书上说是连接“open”状态,实际测试也会报错),如图:
case语句的把稳事变在vhdl的case语句的语法中,只有分支将所有条件都覆盖后才可以不该用“when others =>”(相称于verilog的default),但是实际中险些不可能包括所有情形(由于必须连高阻,不定态等状态都包含进去),以是须要在case语句分支条件增加“when others =>”。对付原verilog代码中default后没有任何表达式的情形,在vhdl中对应的地方写上“null”,如图:
组合逻辑转换时碰着的问题当含有“always()”这类组合逻辑的verilog代码经xhdl软件转换后以下两种情形须要把稳:
1、当是三段式状态机中的“always()”被转换时,把稳去除个中的状态常量。
2、由于vhdl规定case后的判断条件必须是单一旗子暗记,以是当原verilog代码中,case后面的判断条件不是单一旗子暗记,而是几个旗子暗记的组合时,xhdl软件会将这几个旗子暗记的组合用组合逻辑赋给一个新的旗子暗记,后将新的旗子暗记放在case的判断逻辑处,此时须要把稳查看组合逻辑块的触发旗子暗记是否包含此新天生的旗子暗记,详细如图:
仿真时把稳时钟的问题(上板不会涌现此问题)在利用modelsim对vhdl代码进行仿真时,会涌现如图的情形:
详细的操作便是对c_o旗子暗记打拍,可以创造第一拍没有打上(实际是打上了),该测试程序的事理图如图:
C将时钟clk_c_to_b和一个旗子暗记c_o通报给b,c_o利用时钟clk天生的,在b内用c给的时钟来给c_o打拍。末了创造仿真之以是会涌现上面的情形,紧张是由于在模块c内对时钟clk进行了一次处理后赋给b(如在c内部进行了clk_c_to_b <= clk),导致涌现了如下的波形情形:
如果你在利用VHDL与Verilog转换过程中碰着了上面没有提到的问题,欢迎留言谈论。或者你有更好的办法完成两种措辞之间的转换,也请不吝见教!
全文完。