如果你有软件背景,使用CPLD/ fpga(复杂可编程逻辑器件/现场可编程门阵列)进行数字设计,那么你需要采用不同的思维方式来设计逻辑。虽然Verilog和VHDL看起来像一种传统的编程语言,但它们的解释方式是不同的。对于微处理器来说,软件的操作是严格顺序的。连续执行十个指令,一个接一个。然而,在Verilog和VHDL中,代码被编译成能够同时满足整个代码的东西。这并不意味着如果你是这样写的事情就不是顺序的,而是像
A = B;
B = a + 1;
会引起混乱。通过传统的软件,如果B的值为10,则A也将成为值10,然后B将成为11.但是,对于CPLD,代码将尝试找到一些逻辑,该逻辑将同时满足两个语句,这是棘手的,所以你很可能会出错。
所以,你需要记住,你正在设计一些逻辑,你所描述的最终将成为大量的逻辑门和触发器,它们将一起工作,以满足你的描述。其好处是速度。一个复杂的操作,在软件中需要几十个操作,将需要很长的时间来完成,而如果它可以表示为一个数字逻辑块,它可以在单个时钟周期内完成。
这并不是说你不会在CPLD中使用顺序操作。例如,如果您希望具有16位结果的两个8位数字的乘法函数,您可以简单地完成大量逻辑的全部,它可以很快完成。但是,空间或CPLD大小比特定应用程序的该操作的速度更重要,因此您可以通过班次实现乘法并添加方法,这需要更长但较少的逻辑。
如果您来自数字电子背景,那么描述与陈述的软件的逻辑似乎似乎很奇怪。在过去,可编程逻辑器件(PLD)很小,可以手动编码,也可以用相当低的级别语言进行编码,在那里,您可以直接控制D型触发器。电流装置的尺寸和复杂性意味着很少使用方法,并且采用更高的水平方法。不幸的是,使用CPLD的工具已经变得有点碎片,并且您经常会发现您正在为设计的一个工具工作,然后是另一个用于综合,另一个用于仿真。这些软件通常可以来自具有不同用户界面的不同供应商。

以上面非常简单的半加法器为例。在Verilog中可以简单地描述为
模块半_der(a,b,s,c);
输入A,B;
输出S、C;
分配s = a ^ b;
分配C = A&B;
终点
您可能会注意到它与微控制器软件不同。但是,如前所述,顺序写入的陈述不一定产生顺序结果。例如,上面的S和C将以与逻辑图相同的方式以并行逻辑实现。■在C之前不会被分配,甚至认为陈述按此顺序。如果重新排序,则结果逻辑将是相同的。
要测试您的代码,您需要一个“testbench”。虽然某些软件允许您以图形方式交互地生成刺激,但设备和设计的越来越复杂意味着它通常使用更多的Verilog代码来完成。此外,通过大量的波形看不一定是非常有效的,您可能不会发现错误,因此典型的测试禁止将不仅包括逻辑的刺激,还包括检查结果。这意味着测试禁止通常需要更长时间写入初始代码,需要更多的代码行和更长的调试。这是调试您首先写的代码!
无论如何,对于这个简单的例子,我将展示一个没有输出检查的简单刺激。
`时间尺度1 ns / 100 ps
模块half_adder_tb ();
电线s_test,c_test;
reg a_test,b_test;
half_adder dut(。(A_test)。b (B_test), c (C_test)授予(S_test));
最初的
开始
#5 a_test = 0;
B_test = 0;
#5 A_test = 1;
B_test = 0;
#5 a_test = 0;
B_test = 1;
#5 A_test = 1;
B_test = 1;
结束
终点
“时间尺度”指令定义了时间单位和精度。请注意,它是一个“严重重音”而不是撇号!模块“half_adder_tb”是测试铃声模块,它包含使用“half_adder dut”语句的实际逻辑,该语句要求将Half_adder模块包含在项目中。之后,从“初始”声明中,是实际刺激。请注意,现在该语句实际上是顺序,其中#5表示在这种情况下的5个时间单位的延迟 - 5ns。得到的波形是:

这是一个简单的组合逻辑示例,但你更有可能写入注册代码。具有异步重置的8位计数器的简单示例如下所示:
模块CNTR (clk, count, RST);
输入时钟;
输入RST;
输出(7:0)数;
reg [7:0]计数;
Always @(posedge CLK或negedge RST)
开始
If (!rst) count <= 8'h00; / /计算时间
Else count <= count + 8'h01;
结束
终点
这里的变量“count”由8位组成,被定义为类型“reg”以及模块的输出。@符号后面的代码是敏感性列表,它定义了代码块中何时发生变化。在这种情况下,复位是主动的低电平和异步的。一个小的变化将使它同步:
总是@(提出包装)
开始
If (!rst) count <= 8'h00; / /计算时间
Else count <= count + 8'h01;
结束
现在计数器只会改变时钟的正边缘。
学习Verilog的最好方法是有一个“真正的”项目要做,但首先要从教程开始。如果您计划使用某个特定的CPLD供应商,那么请下载他们的免费软件(大多数供应商提供免费版本,因为他们希望鼓励您使用他们的设备),并查找演示代码和教程。这些将是关于如何真正使用他们的软件的教程,但无论如何这是必不可少的。
在互联网上搜索教程会产生很多结果,有些好,有些不好。一些Verilog Books是巨大的参考作品,而当您进展时可能有用,它们可能有点令人生畏。一本“QuickStart”书超过350页。Blaine Readler可能更简洁(和更便宜)的起始书可能是“通过示例的Verilog”。在超过100页上,它是一个更可管理的入门书。
《华盛顿邮报》从Verilog开始第一次出现在FPGA提示。
提交:FPGA提示




