VHDL:11 条总线之间的多路复用器 8 位宽输出

Posted

技术标签:

【中文标题】VHDL:11 条总线之间的多路复用器 8 位宽输出【英文标题】:VHDL: muxes between 11 buses 8 bits wide output 【发布时间】:2016-11-17 14:29:28 【问题描述】:

我收到了这个问题作为面试前的问题“绘制图表并为满足以下要求的模块编写 VHDL 代码: 一种。完全同步。 湾。在 11 条总线之间多路复用,其中每条总线为 8 位宽。 C。有 2 个延迟周期。 d。针对最大时钟频率进行了优化。"

我一直在尝试自己阅读我在大学完成的旧笔记和作业,但我只是不认为我在正确的轨道上。到目前为止,我已经将代码发布在下面:

 library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity Mux is
port(

 A:  in STD_LOGIC_vector(7 downto 0);
  B:  in STD_LOGIC_vector(7 downto 0);
  C:  in STD_LOGIC_vector(7 downto 0);
  D:  in STD_LOGIC_vector(7 downto 0);
  E:  in STD_LOGIC_vector(7 downto 0);
  F:  in STD_LOGIC_vector(7 downto 0);
  G:  in STD_LOGIC_vector(7 downto 0);
  H:  in STD_LOGIC_vector(7 downto 0);
  I:  in STD_LOGIC_vector(7 downto 0);
  J:  in STD_LOGIC_vector(7 downto 0);
  K:  in STD_LOGIC_vector(7 downto 0);
 S0: in std_LOGIC_vector(3 downto 0);

 Z: out STD_LOGIC_vector(7 downto 0)
);
 end Mux;
architecture func of Mux is
begin
process (A,B,C,D,E,F,G,H,I,J,K,S0)
begin

    if S0="0001" then
        Z<= A;
    elsif S0="0010" then
        Z<= B;
    elsif S0="0011" then
        Z<= C;
    elsif S0="0100" then
        Z<= D;
    elsif S0="0101" then
        Z<= E;
    elsif S0="0110" then
        Z<= F;
    elsif S0="0111" then
        Z<= G;
    elsif S0="1000" then
        Z<= H;
    elsif S0="1001" then
        Z<= I;
    elsif S0="1010" then
        Z<= J;
    elsif S0="1011" then
        Z<= K;  
    else 
        Z<=A;
    end if;


end process;
end func;

这是我的第二个文件的代码:

 LIBRARY ieee;
 USE ieee.std_logic_1164.ALL;
 use IEEE.std_logic_arith.all;
 entity mux11test is
 end entity mux11test;
 architecture test of mux11test is
  signal    T_A:  STD_LOGIC_vector(7 downto 0):="00000001";
   signal    T_B:  STD_LOGIC_vector(7 downto 0):="00000010";
  signal    T_C:  STD_LOGIC_vector(7 downto 0):="00000011";
  signal    T_D:  STD_LOGIC_vector(7 downto 0):="00000100";
  signal    T_E:  STD_LOGIC_vector(7 downto 0):="00000101";
  signal    T_F:  STD_LOGIC_vector(7 downto 0):="00000110";
  signal    T_G:  STD_LOGIC_vector(7 downto 0):="00000111";
  signal    T_H:  STD_LOGIC_vector(7 downto 0):="00001000";
  signal    T_I:  STD_LOGIC_vector(7 downto 0):="00001001";
  signal    T_J:  STD_LOGIC_vector(7 downto 0):="00001010";
  signal    T_K:  STD_LOGIC_vector(7 downto 0):="00001011";

   signal    T_S: STD_LOGIC_vector( 3 downto 0);
 signal    T_Z:  STD_LOGIC_vector(7 downto 0);

component mux11 IS
port(

 A:  in STD_LOGIC_vector(7 downto 0);
  B:  in STD_LOGIC_vector(7 downto 0);
  C:  in STD_LOGIC_vector(7 downto 0);
  D:  in STD_LOGIC_vector(7 downto 0);
  E:  in STD_LOGIC_vector(7 downto 0);
  F:  in STD_LOGIC_vector(7 downto 0);
  G:  in STD_LOGIC_vector(7 downto 0);
  H:  in STD_LOGIC_vector(7 downto 0);
  I:  in STD_LOGIC_vector(7 downto 0);
  J:  in STD_LOGIC_vector(7 downto 0);
  K:  in STD_LOGIC_vector(7 downto 0);
 S0: in std_LOGIC_vector(3 downto 0);

 Z:  out STD_LOGIC_vector(7 downto 0)
  ); 
END COMPONENT ;
signal clk : std_LOGIC;
constant clk_period: time:=100ns;
begin

umux: Mux11 port map(T_A,T_B,T_C,T_D,T_E,T_F,T_G,T_H,T_I,T_J,T_K,T_S,T_Z);
clk_process:process 
begin
clk<='0';
wait for clk_period/2;
clk <='1';
wait for clk_period/2;
end process;
PROCESS
begin
if T_S="0001" then
    T_Z <= T_A ;
elsif  T_S="0010" then  
T_Z <= T_B ; wait for 100 ns; 
elsif  T_S="0011" then
T_Z <= T_C ; wait for 100 ns; 
elsif  T_S="0100" then
T_Z  <= T_D ; wait for 100 ns;
elsif  T_S="0101" then
T_Z  <=T_E ; wait for 100 ns;
elsif  T_S="0110" then
T_Z <=  T_F ; wait for 100 ns;
    elsif  T_S="0111" then
T_Z  <= T_G ; wait for 100 ns;
    elsif  T_S="1000" then
T_Z  <= T_H ; wait for 100 ns;
elsif  T_S="1001" then
T_Z  <= T_I ; wait for 100 ns;
elsif  T_S="1010" then
T_Z  <= T_J ; wait for 100 ns;
elsif  T_S="1011" then
T_Z <= T_K ; wait for 100 ns;


wait;

end if;
end PROCESS;

end architecture test;

有没有人可以告诉我我是否走在正确的道路上,如果这是完全同步的,我将如何开始实施或确定 2 个延迟周期?

【问题讨论】:

您的流程根本不同步,因为您没有在实体中定义任何时钟。您必须先定义一个时钟。 你有什么建议的文章吗?我可以看看如何定义时钟 有没有人可以告诉我我是否走在正确的道路上,如果这是完全同步的,我将如何开始实施或确定 2 个延迟周期? 这是一个有没有人能告诉我我是否走在正确的道路上,如果这是完全同步的,我将如何开始实施或确定 2 个延迟周期?在Im struggling with my vhdl code is this full synchronous and how do i know how many cycles of latency it has? 中找到 您的测试平台无法正常工作(仍然)。您没有分配给 T_S,您的组件名称是 mux11,而实体名称是 mux。您有两个 T_Z 驱动程序(在解决 mux11 未绑定的问题之后),测试台中的进程和实例化组件。 【参考方案1】:

我试着写一个清晰的答案来帮助你。

首先,您的设计中需要一个时钟,我们称之为clk

entity Mux is
port(

  clk: in std_logic;
  A:  in STD_LOGIC_vector(7 downto 0);
  B:  in STD_LOGIC_vector(7 downto 0);
  C:  in STD_LOGIC_vector(7 downto 0);
  D:  in STD_LOGIC_vector(7 downto 0);
  E:  in STD_LOGIC_vector(7 downto 0);
  F:  in STD_LOGIC_vector(7 downto 0);
  G:  in STD_LOGIC_vector(7 downto 0);
  H:  in STD_LOGIC_vector(7 downto 0);
  I:  in STD_LOGIC_vector(7 downto 0);
  J:  in STD_LOGIC_vector(7 downto 0);
  K:  in STD_LOGIC_vector(7 downto 0);
  S0: in std_LOGIC_vector(3 downto 0);

  Z: out STD_LOGIC_vector(7 downto 0));

end Mux;

使用同步流程的想法是始终在时钟边缘更新您的值。让我们说上升沿。因此,您的流程必须只对您的输入 clk 敏感。

P : PROCESS (clk)
BEGIN
   IF (rising_edge(clk)) THEN
     ...
   END IF;
END PROCESS;

关于您的多路复用器,您的想法很好。但是我建议使用 CASE 语句,因为它比 IF ELSIF 更容易阅读。

CASE S0 IS
    WHEN "0001"  => Z <= A;
    WHEN "0010"  => Z <= B;
    ...
    WHEN "1011"  => Z <= K;
END CASE;

编辑:因为我忘了谈论 2 个周期的延迟,所以我会说两个词。您需要两个中间信号(即 Z_i 和 Z_ii)。 Z_ii 在一个时钟周期后取 Z_i,Z 在一个时钟周期后取 Z_ii。

Z_ii <= Z_i;
Z    <= Z_ii;

当然你需要在你的进程中驱动 Z_i(而不是 Z)。

【讨论】:

如果我要将 if 语句更改为 case 语句,我会将 case 语句放在“if (rising_edge(clk)) then”中吗 是的,让它同步。 非常感谢您的帮助:) 现在把所有这些放在一起就可以了 关于优化最大时钟的部分。为什么不使用输入寄存器(A-K、S)和输出寄存器(Z)* 2 个延迟周期*?这不是关于匹配管道延迟,而是关于时钟可以走多快。

以上是关于VHDL:11 条总线之间的多路复用器 8 位宽输出的主要内容,如果未能解决你的问题,请参考以下文章

使用 4 对 1 实现 8 对 1 多路复用器的 VHDL 程序(结构建模)

VHDL多路复用器实现?

VHDL 多路复用和两个输出

计算机的基本工作原理

VHDL:当涉及时钟信号时,多路复用器输出不跟随输入

VHDL组件多路复用器不在modelsim中返回值