从常规编程开始使用HDL

时间:2009-11-26 00:57:44

标签: hardware verilog vhdl fpga

我总是想制作自己的微处理器..我读过How can I make my own microcontroller?

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

任何人都可以建议从头开始教授HDL语言的书籍或在线资源(这样我就可以忘记我的程序化思维方式)

此外,我无法准确了解如何模拟HDL程序。没有像打印或硬件中的东西,所以没有FPGA测试程序的最佳方法是什么(我将在某个时候订购其中一个!)。模拟它究竟是如何工作的?

基本上我只需要有人帮助我了解HDL及其模拟。

6 个答案:

答案 0 :(得分:3)

请记住,HDL旨在为硬件建模。硬件一切都在同一时间发生。硬件是指一系列逻辑门以某种方式连接到输入和其他逻辑门的输出。这基本上就是FPGA或ASIC(在FPGA中,这些连接是可编程的)。摆动输入,效果在逻辑门链中产生波动 - 将每个逻辑门视为一个不断评估其输入的小处理器。

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

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

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

你提到你已经完成了一些Ruby编程。如果你想使用用Ruby编写的HDL,你可以试用RHDL:http://rhdl.rubyforge.org/基本的HDL概念就在那里,它看起来很像VHDL,但它是Ruby,所以你可以用内部实验多一点。您可以编写模型然后进行模拟。有一些例子。

答案 1 :(得分:2)

使用模拟器及其波形查看器进行调试 - 您可以观察所有内部构件随时间变化的情况。此外,使用Modelsim,您还可以在流程中执行类似软件的断点。

您可以使用“报告”声明使用VHDL打印出来,但您必须以非SW方式进行格式化:

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

为了便于打印,请使用textio package

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

从简单开始 - 创建一个计数器,每当时钟滴答时加1(使用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;

运行SIM卡,观察计数器上升以及切换信号切换。如果你的计数器足够大,你可以建立一个FPGA,并通过将切换信号连接到LED引脚来观察和关闭LED闪光灯。

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

答案 2 :(得分:0)

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

对于模拟,你应该看看Modelsim。如果您在窗户上,可以免费获得学生版 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/

答案 3 :(得分:0)

我的答案可能会延迟数年,但这适用于可能会有相同查询的未来观众。

我也来自C ++ / C#背景。我的回答只涉及Verilog HDL而不是VHDL。我这学期正在上一门课程,这里有帮助我更好地理解Verilog的书籍:

您可以找到here网站中列出的大量图书asic-world

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

在文本编辑器中键入代码,在bin文件夹中另存为.vl     iVerilog。在命令提示符下,转到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

希望这有帮助!

答案 4 :(得分:0)

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

此类调试信息的重要性在于设计包含同一组件的许多实例。

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

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

答案 5 :(得分:0)

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