写在前面
学过一门或多门软件语言的数字设计初学者经常会犯一些错误 ,例如硬件语言的并发性,可综合以及不可综合语句区分,循环语句的使用等等。本文的建议将带你区别并扫除这些易错点,助你成为一名优秀的硬件设计师。
正文
可综合以及不可综合的代码
了解如何编写可在FPGA或ASIC上运行的代码?
当您编写Verilog或VHDL代码时,您正在编写将被转换为门,寄存器,RAM等的代码。执行此任务的程序称为综合工具。综合工具的工作是将您的Verilog或VHDL代码转换为FPGA可以理解的代码。但是,Verilog和VHDL的某些部分FPGA根本无法实现。当您这样编写代码时,它称为不可综合的代码。
那么,为什么您要使用一种语言,该语言包含无法综合的代码?原因是它使您的测试平台功能更强大。当您编写用于仿真的测试平台时,通常使用不可合成的代码结构会使您的测试平台更好,并使您更轻松地完成工作。
延迟声明
最基本的不可合成代码是延迟语句。 FPGA没有时间概念,因此不可能告诉FPGA等待10纳秒。 相反,您需要使用时钟和触发器来实现您的目标。 下面是一个不可合成代码的示例,该代码已被转换为可以由工具合成的代码。
-- Non-Synthesizable Delay Statement:
r_Enable <= '0';
wait for 100 ns;
r_Enable <= '1';
-- Converted to Synthesizable code (assuming 100 MHz clock):
always@(posedge clk) begin
if( index < 10 ) begin
index <= index + 1;
r_Enable <= 0;
end
else begin
r_Enable <= 1;
index <= 0;
end
end
循环语句
数字设计初学者经常滥用的另一段代码是循环语句,例如while,for,repeat等。可综合代码中的循环实际上无法像在C等软件语言中那样使用。 硬件开发初学者面临的巨大问题是, 他们已经在C语言中看到了数百次循环,因此他们认为在Verilog和VHDL中它们是相同的。 在这里让我清楚:循环在硬件中的行为与在软件中的行为不同。 在您了解循环语句如何工作之前,您不应该使用它们。
知道综合和不可综合代码之间的区别对于成为一名优秀的数字设计师非常重要。 仅在编写将在FPGA上运行的代码时使用可综合的构造!
每个软件程序员需要了解的有关硬件设计的内容
对于数字设计新手而言最重要的部分
尝试使用VHDL或Verilog进行编程的每个了解C或Java语言的软件开发人员都会遇到相同的问题。他们对代码的工作原理进行了假设。这些假设通常适用于所有软件语言。不幸的是,这些假设不适用于硬件描述语言。如果您不熟悉硬件开发,但懂一种或两种软件语言,请先阅读本文提供了代码示例,并解释了代码在软件世界和硬件世界中如何工作,以向您展示它们之间的区别。
假设1:串行与并行逻辑
这可能是硬件和软件编程语言之间最根本的区别。软件设计师仅见过串行代码,但他们可能没有意识到这一事实。串行代码的意思是代码行一次执行一行。例如,第2行只能在第1行完成后才能执行。VHDL和Verilog不会这样!它们被称为并行逻辑语言,所有代码行都可以并且将同时执行。这称为并发。这是演示串行和并行逻辑之间区别的示例。假设一位设计师希望每十个时钟点亮一次LED。
示例软件代码:
while (1)
{
if (count == 9)
{
LED_on = 1;
count = 0;
}
else
{
LED_on = 0;
count = count + 1;
}
}
与其等价的Verilog代码为:
always@(posedge clk ) begin
if(count < 9) begin
count <= count + 1;
end
else begin