2

我一直有点想制作自己的微处理器。我读过如何制作自己的微控制器?.

我多次尝试学习一些 Verilog 和 VHDL。但是对于我的生活,我无法理解语言风格。我来自 C/C++/C# 背景,并且在使用 Ruby 进行功能性编程方面(成功地)进行了一些尝试。

任何人都可以推荐一本书或在线资源来从头开始教授 HDL 语言(这样我就可以忘记我的程序性思维方式)

此外,我无法准确了解如何模拟 HDL 程序。没有什么比打印或硬件更重要的了,那么在没有 FPGA 的情况下测试程序的最佳方法是什么(不过我有时会订购其中一个!)。模拟它究竟是如何工作的?

基本上,我只需要有人帮助我了解 HDL 及其仿真。

4

6 回答 6

3

请记住,HDL 旨在对硬件进行建模。有了硬件,一切都会立即发生。我所说的硬件是指以某种方式连接到其他逻辑门的输入和输出的逻辑门的集合。这本质上就是 FPGA 或 ASIC(在 FPGA 中,这些连接是可编程的)。摆动一个输入,效果会通过逻辑门链产生涟漪——将每个逻辑门想象成一个不断评估其输入的小处理器。

因此,在 HDL 中,您需要考虑的第一件事是所有分配都同时发生。唯一发生在“正常”意义上的事情(一个语句跟随另一个语句,如在常规编程语言中)是在进程块内部(在 VHDL 中,或在 Verilog 中的始终块)。但是你必须意识到所有的进程块(或 Verilog 中的总是块)也在同时执行。

HDL 只是试图模拟硬件的并发性。

至于试图向软件开发人员教授 HDL 的书籍……我认为没有。大多数是针对硬件工程师的。

您提到您已经完成了一些 Ruby 编程。如果你想玩用 Ruby 编写的 HDL,你可以试试 RHDL:http: //rhdl.rubyforge.org/ 基本的 HDL 概念就在那里,它看起来很像 VHDL,但它是 Ruby,所以你可以尝试一下更多的内脏。您可以编写模型,然后对其进行仿真。包括一些例子。

于 2009-11-26T17:03:30.603 回答
2

调试是通过模拟器及其波形查看器完成的——您可以观察所有内部组件随着时间的推移在做什么。此外,使用 Modelsim,您还可以在进程内进行类似软件的断点。

您可以使用“report”语句使用 VHDL 打印内容,但您必须以非常非 SW 的方式进行格式化:

report "The value is not " & integer'image(some_integer_variable);

为了更容易打印,请使用textio 包

另一个提示 - 里面有很多代码use ieee.std_logic_arith.all;。该库是非标准的(尽管有 IEEE 绰号),请ieee.numeric_std.all改用。

开始简单 - 创建一个计数器,每次时钟滴答时都会增加一个(使用if rising_edge(clk) then成语)。当计数器达到特定值时,切换一个信号。

创建一个测试台来模拟它,这基本上意味着只需使 clk 信号变为“0”、“1”、“0”、“1”。

一个容易理解的方法是这样的:

process:
begin
    clk <= '0';
    wait for 5 ns;
    clk <= '1'; 
    wait for 5 ns;
end process;

运行模拟程序,观察你的计数器上升,然后切换信号切换。如果你的计数器足够大,你可以构建一个 FPGA 并通过将切换信号连接到 LED 引脚来观察 LED 闪烁。

那就是相当于“Hello World”的FPGA!

于 2009-12-01T17:36:58.103 回答
0

有时需要打印实例名称。如果在设计中使用相同组件的多个实例,这将很有用:“...虽然在 VERILOG 中很简单(显示系统函数中的 %m),但在 VHDL 中需要更多的代码编写。$display(" dbg instance name %m at %d", $time); 这个站点上还提供了如何在 systemc 中打印实例名称的示例。

当设计包含相同组件的许多实例时,此类调试信息的重要性。

必须调用第一个文本 IO 库并声明行变量。请参阅打印示例以查看详细信息。

接下来,您必须在两个选项之间进行选择:一个是:仅在调试字符串中的实例名称,另一个选项提供更多信息,例如条目和体系结构名称......” http://bknpk.ddns.net/my_web/MiscellaneousHW/vhdl_path_name_print .html

于 2014-12-27T15:43:31.997 回答
0

我的回答可能晚了好几年,但这是为未来可能有相同疑问的观众准备的。

我也来自 C++/C# 背景。我的回答只涉及 Verilog HDL 而不是 VHDL。我目前正在学习本学期的课程,以下是帮助我更好地理解 Verilog 的书籍:

你可以在这里找到很多在asic-world网站中列出的书籍。

正如 sgorgon 所回答的,您可以使用 Xilinx ISE 进行仿真。就 Verilog 而言,它是最接近使用 C++/C# 的 Visual Studio。但是对于原始感觉(没有 IDE),您可能想尝试 iVerilog 或Icarus Verilog。这是我们课程中使用的。以下是使用 iVerilog 执行 Verilog 文件的方法:

在文本编辑器上输入您的代码,保存.vl在 iVerilog 的 bin 文件夹中。在命令提示符下,转到 bin 文件夹。然后键入以下内容:

iverilog -o <name of exe file you want for your .vl file> <your .vl file>
vvp <name of exe file>

例子:

iverilog -o samp sample.vl
vvp samp

希望这可以帮助!

于 2014-12-07T18:20:08.077 回答
0

对于调试,Verilog 提供类似 printf 的系统任务,如 $display 或 $monitor。这些当然是不可综合的,但每个模拟器都应该理解它们。然后调试一方面完成,就像软件调试一样,通过使用已经提到的 $diplay 和其他东西将信号值和其他任何内容打印到控制台。另一方面,通过盯着信号波形,直到找到病点。对于这些事情,您甚至不需要 FPGA,只需要一个好的模拟器即可。但是有一个 FPGA 让一些 LED 闪烁总是很好的 :)

对于仿真,你应该看看 Modelsim。如果您使用的是 Windows,则可以免费获得学生版。
http://www.model.com/content/modelsim-pe-student-edition-hdl-simulation

另一种选择是 Xilinx 的 ISE Web-Pack。这甚至适用于 linux 并包含完整的 FPGA 流程。 http://www.xilinx.com/tools/webpack.htm
但我推荐Modelsim进行仿真。

我手头的一些起点是:
http ://www.asic-world.com/
http://www.doulos.com/knowhow/verilog_designers_guide/

于 2009-11-27T12:57:29.303 回答
0

如果您精通 C 编程,则可以非常轻松地学习任何其他编程语言。硬件描述语言差别不大。但是您必须了解常用硬件组件的基础知识。例如,如果您知道全加器的输入和输出是什么,则全加器的设计非常简单。您还必须知道输入和输出之间的关系。pdf可能对初学者有用。

于 2015-08-26T07:23:48.407 回答