我不熟悉 Xilinx 的工具,但我使用的是 Altera 的,所以我会告诉你他们的。Xilinx 和其他公司应该不会有太大的不同。
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
有上升沿时才会改变(这是用于高电平有效复位)。如果您忘记了敏感度列表中的某些内容(它应该包含所有右侧变量,没有任何组合逻辑块的or修饰符),编译器将根据需要合成锁存器,而不是调用错误。很疯狂,但事实就是如此,因为 Verilog 最初是一种隐藏(因此不需要)实现细节的模拟语言。VHDL 是相同的,但更冗长。RESET
CLK
posedge
negedge
最后,几年前发布了一个名为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 版。(订阅版相当昂贵,而且只有最快或最新的 FPGA 型号才需要。)
可悲的是,我还没有找到一本关于这个主题的好书。我所学到的知识是通过将多个来源的东西拼凑起来的,例如 Verilog 书籍,它不能很好地告诉你什么是可合成的,什么不是,以及示例代码。Quartus II 有一个“插入模板”命令,可以为几个常见的结构插入模板代码,从 D 触发器到状态机。
演示硬件
在 Verilog 中实现处理器后,您需要构建它。目前,让 Quartus 选择芯片(您必须选择系列;我推荐 Cyclone IV)和引脚。一旦它建立起来,你就会知道你需要多少芯片。它会告诉您使用了多少逻辑元件、触发器、RAM 位等。确保你在其中任何一个上都没有超过 50%;如果是,请查看编译器选择的芯片并手动选择下一个更大的(在逻辑元件中)具有至少相同数量的引脚的芯片,然后重复直到利用率低于 50%。
然后去购买一个演示板,它的芯片至少和你最终构建的那个一样大。检查它是否具有您需要的外围设备和/或 I/O 连接器。构建插入扩展连接器以提供任何缺少的硬件的子卡并不少见。
现在您已经选择了硬件,找出真正的引脚分配并使用 Pin Planner 将正确的信号放在正确的引脚上。演示板将有一个用户指南,告诉您哪些引脚连接到演示板上的哪些设备或连接器引脚。
一旦你得到了引脚设置,再次构建它,以便它使用你想要的引脚。请记住,系统时钟等某些信号需要专用输入引脚(因此它们直接路由到内部 PLL)。
使用程序员将您的设计直接下载到 FPGA(我刚才提到的移位寄存器)。现在您处于熟悉的编辑-编译-运行调试周期。击败它,直到它起作用。
一旦它工作,您可以使用编程器将代码下载到板载配置设备中,以便您的程序在上电时加载并运行。
这很长,我希望它对一些人有所帮助。有很多东西要学;这不像学习一门新的编程语言,更像是学习一种新的编程范式,例如从过程语言转向函数式语言。Verilog 是一种同步语言;大多数代码总是在执行。
祝你好运!