我为多路复用器写了一个“模板”。
我的目标是当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;
答案 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结构。