我不熟悉Xilinx的工具,但是我熟悉Altera的工具,所以我将告诉您有关它们的信息。赛灵思和其他公司应该没有太大的不同。
Verilog
您需要做的第一件事是学习Verilog。这将使您的头部受伤,因为Verilog(和有点类似的VHDL)最初是作为一种仿真语言设计的,并且结构很多(例如#5
,这意味着“等待5个时间步长”,一个时间步长通常为纳秒)。因此,要使Verilog代码可合成(即可编译为FPGA的位流),必须牢记许多限制。
但是,最大的震惊是,您在Verilog(和VHDL)中编写的内容是您期望系统执行的行为,并且编译器从您的描述中推断出正确的逻辑。如果您不小心,可能会从中得到很多讨厌的错误。
例如,一个D触发器看起来像:
always @(posedge RESET or posedge CLK)
begin
if(RESET)
Q <= 1'b0;
else if(CLK_ENA)
Q <= D;
end
这描述了DFF的工作方式,并且编译器必须对其进行分析并找出您想要的DFF。的@(...)
被称为灵敏度列表,这是触发码块进行重新评估信号的列表; 因此,在此块中,Q
仅当RESET
或上有上升沿时才改变CLK
(这是高电平有效复位)。如果你忘记了在敏感列表东西(它应该包含所有的右手边变量,而无需任何posedge
或negedge
改性剂组合逻辑块)根据需要,而不是调用一个错误,编译器会合成锁存器。太疯狂了,但是确实如此,因为Verilog最初是一种隐藏(因此不需要)实现细节的模拟语言。VHDL是相同的,但更为冗长。
最后,几年前发布了称为SystemVerilog的Verilog新版本,这使得编写可合成代码变得非常容易。尽可能地学习该语言,因为Xilinx ISE和Altera Quartus II都支持它。主要问题是完全缺乏良好的参考材料。
DFF的SystemVerilog版本清除了一些小问题:
always_ff @(posedge RESET, posedge CLK)
begin
if(RESET)
Q <= '0;
else if(CLK_ENA)
Q <= D;
end
请注意,灵敏度列表中的信号用逗号分隔。这是因为无法在那里工作or
使人感到困惑and
。还要注意更换1'b0
(单0
带位)'0
(一个符号,膨胀到然而,许多0
基于它被分配到需要的位; 很多更灵活的参数化模块)。最后,请注意需要将内容合成为触发器的替换always
(可用于任何东西;组合逻辑,锁存器和触发器)always_ff
。还有一个always_comb
消除灵敏度列表的方法,因为它只计算出从输入到模块的灵敏度。
Altera的设计软件称为Quartus II,您将寻找Web Edition。(订购版本相当昂贵,只有最快或最新的FPGA型号才需要。)
可悲的是,我还没有找到关于该主题的好书。通过从多个来源将事物拼凑在一起,我学到了什么,例如Verilog书籍,它们不能很好地告诉您什么是可综合的,什么不是可综合的,以及示例代码。Quartus II具有一个“插入模板”命令,该命令可插入从D触发器到状态机的几种通用结构的模板代码。
演示硬件
在Verilog中实现处理器后,就需要对其进行构建。暂时让Quartus选择芯片(必须选择系列;我建议使用Cyclone IV)和引脚排列。一旦成型,您将知道需要多少芯片。它会告诉您使用了多少逻辑元件,触发器,RAM位等。确保您没有超过50%;如果是这样,请查看编译器选择的芯片,然后手动选择下一个更大的(逻辑元素中)芯片,该芯片至少具有尽可能多的引脚,然后重复执行直到利用率低于50%。
然后去购买演示板,该演示板的芯片至少与最终构建的芯片一样大。检查是否具有所需的外围设备和/或I / O连接器。构建插入扩展连接器以提供任何缺少的硬件的子卡并不少见。
既然您已经选择了硬件,请找出真正的引脚排列,然后使用Pin Planner将正确的信号放置在正确的引脚上。演示板上将有一个用户指南,告诉您哪些引脚连接到演示板上的哪些设备或连接器引脚。
设置完引脚排列后,请再次构建它,以便使用所需的引脚。请记住,某些信号(例如系统时钟)将需要专用的输入引脚(因此它们会直接路由至内部PLL)。
使用程序员将您的设计直接下载到FPGA(我刚才提到的移位寄存器)。现在,您进入了熟悉的编辑-编译-运行调试周期。击败它,直到它起作用。
一旦工作,您可以使用程序员将代码下载到板载配置设备中,以便您的程序在上电时加载并运行。
这是很长的时间,希望对您有所帮助。有很多东西要学。这不像学习一种新的编程语言,就像学习一种新的编程范例,例如从过程语言到功能语言。Verilog是一种同步语言。大多数代码始终在执行。
祝好运!