VHDL:如何为输入赋值?

时间:2014-10-24 07:25:45

标签: vhdl intel-fpga quartus

我为多路复用器写了一个“模板”。

我的目标是当s =“01”或s =“11”时y = 1。

现在,我应该如何链接d0及其保存的值?

(在本例中,d0应保持0,d1 = 1,d2 = 0,d3 = 1.)

library IEEE;
use IEEE.std_logic_1164.all;

entity mux4v1 is 

 port(
        d0  : in    std_logic;  -- 0
        d1  : in    std_logic;  -- 1
        d2  : in    std_logic;  -- 0
        d3  : in    std_logic;  -- 1
        s   : in    std_logic_vector(1 downto 0); -- my inputs controller via switches
        y   : out   std_logic
    );

end mux4v1;


architecture struct of mux4v1 is

begin
  with s select
  y <= d0 when "00",
       d1 when "01",
       d2 when "10",
       d3 when "11";
end struct;

2 个答案:

答案 0 :(得分:2)

我认为您提出的问题是如何将'0''1'提供给输入...

答案是:从外部,在使用多路复用器的设计中。

对于模拟,您可以创建更高级别的设计并在其中实例化多路复用器。更高级别的设计可能类似于微处理器,但在这里我们只想测试多路复用器,因此我们可以为它编写一个简单的测试平台。

测试平台通常没有输入或输出,因此它构成了设计的顶层,您可以在模拟器中运行它。

entity mux_tb is
end mux_tb;

内部,它包含DUT(被测设备)和您正在测试它的任何其他组件,互连它们的信号,生成时钟和其他信号的过程,以及将设备输出与预期值进行比较的过程和报告任何错误。

architecture simple of mux_tb is

entity mux4v1 is 

signal test_d0 : std_logic := 0;  
signal test_d1 : std_logic := 1;
signal test_d2 : std_logic := 0;
signal test_d3 : std_logic := 0;

signal sel   :   std_logic_vector(1 downto 0); 
signal output :  std_logic;

begin

DUT : entity work.mux4v1
 port map(
        d0  => test_d0,
        d1  => test_d1,
        d2  => test_d2,
        d3  => test_d3
        s   => sel,
        y   => output
    );

Stimulus : process
begin
   sel <= "00";
   wait for 1 us;
   sel <= "01";
   -- and so on
end process;

end simple;

对于综合,如果您只是想在FPGA中实现MUX,则可以按原样合成它。然后还有一个额外的步骤,您可以放置​​和路由它以生成一个位文件来编程FPGA。

该步骤是为每个输入和输出信号分配器件引脚。

这些引脚分配是在您编写的约束文件中进行的,具体取决于FPGA的连接方式。例如,如果有一个开关,你想要连接到D0和你要连接到Y的LED,请从你的电路板的原理图中找出开关所连接的哪个FPGA引脚,并写一个连接该引脚的约束输入D0。此约束文件的语法(以及一些示例)应该在您的FPGA工具文档中。

答案 1 :(得分:0)

你有问题吗?正如Brian在他的回答中指出的那样,你不清楚你是否在模拟,分析和阐述方面遇到了麻烦。

您所显示的VHDL设计规范并不符合标准。你的VHDL分析器应该生成一个错误,指向带有表达式(with s select)的行,并告诉你选择没有完成。

  

所选赋值语句中的select表达式,波形和选项的特征必须使得等效process语句中的case语句是一个合法语句。

选定的信号赋值语句被详细描述为等效的过程语句,其case语句等效于所选择的信号赋值。案例陈述需要对其表达式的每个可能值进行单一选择(例如s std_logic_vector也可能选择"UU""U0",{{ 1}},"0U",...)。

所选信号赋值语句的等效流程语句中的等效case语句没有完整的选择范围。您需要选择"XX"或缩小输入以匹配选项:

others

此示例使用 signal bs: bit_vector (s'range); begin bs <= to_bitvector(s); with bs select y <= d0 when "00", d1 when "01", d2 when "10", d3 when "11"; 缩小选择范围。

如果你有用,你可以生成一个&#39; X&#39;对于meta_value:

to_bitvector

使用本地声明的信号( signal bs: std_logic_vector (s'range); begin bs <= to_x01(s); with bs select y <= d0 when "00", d1 when "01", d2 when "10", d3 when "11", 'X' when others; )的原因是函数的返回值子类型不是本地静态的。函数是动态详细的,返回子类型是在这些情况下从输入类型派生的

使用这两种方法中的任何一种修改代码都可以分析和详细说明。是的,它可以找到不符合标准且不会抱怨选择范围的工具。

您也可以使用条件信号赋值,在这种情况下,您将覆盖bs的所有二进制值,并且不会通过不覆盖元值来推断锁存器,或者&#39; H&#39;和&#39; L&#39;:

s

并发信号分配在它的等效进程语句中没有使用case语句,它使用if-then-else结构。