这就是我要用VHDL代码编写的内容:
我还在学习,所以我不知道我写的内容是否正确。有人可以帮我这个多路复用器吗?
多路复用器
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
PACKAGE mux2to1_package IS
COMPONENT mux2to1
PORT ( s, w0, w1: IN STD_LOGIC ;
f : OUT STD_LOGIC ) ;
END COMPONENT ;
END mux2to1_package ;
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY mux2to1 IS
PORT ( s, w0, w1 : IN STD_LOGIC ;
f : OUT STD_LOGIC ) ;
END mux4to1 ;
ARCHITECTURE Behavior OF mux2to1 IS
BEGIN
IF s='0' THEN
f <= w0;
ELSE
f <= w1;
END IF;
END Behavior ;
代码
ENTITY mux2 IS
PORT ( s, w : IN STD_LOGIC ;
f : OUT STD_LOGIC ) ;
END mux2 ;
ARCHITECTURE structure OF mux2 IS
SIGNAL m : STD_LOGIC;
BEGIN
mapping: mux2 PORT MAP ( w(0), w(1), s(0), m(0) ) ;
END Structure ;
我觉得映射部分根本不正确。
答案 0 :(得分:2)
Multiplexer:
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
PACKAGE mux2to1_package IS
COMPONENT mux2to1
PORT ( s, w0, w1: IN STD_LOGIC ;
f : OUT STD_LOGIC ) ;
END COMPONENT ;
END mux2to1_package ;
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY mux2to1 IS
PORT ( s, w0, w1 : IN STD_LOGIC ;
f : OUT STD_LOGIC ) ;
END mux2to1;
ARCHITECTURE Behavior OF mux2to1 IS
BEGIN
PROCESS(s,w0,w1)
BEGIN
IF s='0' THEN
f <= w0;
ELSE
f <= w1;
END IF;
END PROCESS;
END Behavior ;
测试平台代码:
library ieee;
use ieee.std_logic_1164.all;
use work.mux2to1_package.all;
ENTITY tb IS
END tb;
ARCHITECTURE arch OF tb IS
SIGNAL s : std_logic := '0';
SIGNAL w0, w1 : std_logic := '0';
SIGNAL f : std_logic := '0';
BEGIN
UUT : ENTITY work.mux2to1 port map(s => s, w0 => w0, w1 => w1, f => f);
PROCESS
BEGIN
s <= 'X';
w0 <= 'X';
w1 <= 'X';
wait for 1 ns;
s <= '0';
w0 <= '1';
w1 <= '0';
wait for 1 ns;
s <= '1';
w0 <= '0';
w1 <= '1';
wait for 1 ns;
s <= '0';
w0 <= '0';
w1 <= '1';
wait for 1 ns;
assert false report "End of test";
wait;
END PROCESS;
END arch;
就像提到的user1155120一样,您在端口映射中为mapping
进行信号关联时并不小心。在mux2to1实体中,您按此顺序列出了s,w0,w1和f。
在端口图中,您使用了位置关联,但未正确进行关联。如果要使用位置关联,则user1155120的处理方式是正确的。如果您想使用名称关联来执行此操作(如我在上面的代码中所做的那样),则无需按照信号在实体中列出的顺序列出信号(以相同的顺序列出,就意味着您要注意什么)由哪个信号完成)。使用名称关联时,可以执行以下操作:
UUT : ENTITY work.mux2to1 port map( f => f, w0 => w0, w1 => w1, s => s,);
您可以混合他们的订单。
也在您的 Code 部分中,在端口映射期间,您似乎正在尝试使用向量,但是它们之前未设置任何向量,因此您无法真正使用它们。
正如Juergen所说,您正在使用没有 process 的if语句,该语句已在上面的代码中得到纠正。
关于使用包的快速说明:当像我一样编写测试台时,或在其他任何VHDL设计中使用该包时,以下行是必需的:
use work.mux2to1_package.all;
同样值得称赞的是,您使用的是 package 结构,但是在这个级别上,我真的没有必要。您可以简单地声明 ENTITY 。
答案 1 :(得分:1)
您还可以使用“时间”,它可以在流程之外并且不需要敏感列表:
ARCHITECTURE Behavior OF mux2to1 IS
BEGIN
f <= w0 WHEN s='0' ELSE w1;
END Behavior;