我对VHDL的最佳做法感到困惑 - 比如何时使用integer
或real
或信号或std_logic_vector
。我是一个计算机组织类,我们使用Quartus中的大部分框图实现它,只需要一点VHDL。问题是,我们整个项目只是分散且容易出错,而且到目前为止一直很痛苦。
我认为它在VHDL中会更有意义,而且我已经编写了一些组件,但我们在课堂上没有学到很多VHDL,谷歌也没有提供很多好的教程。我也搜索了VHDL MIPS处理器实现/教程,但无济于事。
这是一个模糊的问题,但我只需要朝着正确的方向努力。我现在可以问三个问题:
编辑:除了已经给出的答案外,我还想推荐http://www.fpga.com.cn/hdl/training/Vhdl_Golden_Reference_Guide.pdf,它可以很好地解释一切。如果没有该教程,我将不得不购买一本书,因为通过阅读一些代码将语言拼凑在一起是行不通的。
答案 0 :(得分:3)
I also googled for VHDL MIPS processor implementations/tutorials, but to no avail
在公共领域用VHDL编写了不少MIPS内核。你可以看看它们来获得一些想法......
我在几个项目中成功使用了第一个。
答案 1 :(得分:2)
我对VHDL的最佳实践感到困惑 - 比如何时使用
integer
或real
或signal
或std_logic_vector
。
你无法使用real
进行综合(即,不能用于真正芯片中的任何内容)
当您需要对值进行算术运算时,请使用integer
或signed
或unsigned
。仅在需要可以高阻抗的端口引脚时才使用std_logic[_vector]
。在内部需要单个位或“包位”时使用std_ulogic[_vector]
。 std_ulogic的优点是只有一件事可以根据定义驱动信号,所以如果你弄得一团糟并从两个地方驱动它,编译器就会告诉你。否则,您在波形查看器上有一个充满X
s的模拟,并且不知道它们来自何处。
signal
用于在不同功能块(entity
块或process
块)之间传递值。在进程中使用variable
来跟踪事物。
如何在VHDL中连接所有组件(注册文件,apu, 记忆,...)?
有信号。 Sigasi's editor使这更容易(更少的样板类型)
不要创建component
- 您已经拥有entity
,请使用直接实例化:
ALU1 : entity work.alu port map (
clk => clk,
etc...
);
在输出值之前指定延迟的VHDL代码。什么时候 我应该在MIPS数据路径中执行此操作吗?
您不希望指定延迟 - 它们在综合中被忽略,如果您的设计是完全同步的(一切都是时钟进程,只有一个时钟到处),编译器将为您稍后解决实际延迟,你可以在这之上抽象自己。
答案 2 :(得分:1)
你用信号连接它们 - 也就是说,你声明一个信号,然后你将信号连接到一个组件的输出,另一个组件的输入 - 它就像一根电线(或许多电线) std_logic_vector或整数等的情况)。
如果您想要,您可以在std_logic中执行所有操作,就像您可以用汇编代码编写所有程序一样。对于非可合成的VHDL(即测试平台等),您可以根据需要使用实数和整数。对于可合成的VHDL,您可以使用整数,让VHDL编译器根据std_logic推断底层表示 - 如果您开始这样做,请确保检查编译器的输出以查看它如何表示整数(例如,可能已使用std_logic_vector(31 downto 0)表示整数而不是只有0到7的范围 - 在这种情况下,您需要帮助编译器推断出正确的底层std_logic_vector)。至于真实 - 那可能最好留给不可合成的VHDL,你可以使用VHDL 2008中的浮点类型来合成实数。
您可以设计MIPS数据路径而不指定任何延迟。如果您不知道为什么需要它们,请不要使用它们。当您进行综合时,设计可能具有非常糟糕的时序特性(即,仅以几百kHz运行) - 然后您可以返回并开始流水线设计。但正如我所说,最好从易开始,忘记现在的时间 - 只需让设计工作和合成,然后开始处理时间的东西。
如果您正在寻找一本关于这个主题的好书,我推荐David Harris和Sarah Harris的“数字设计和计算机架构”
希望有所帮助