VHDL简单优化

Luk*_*uka 2 vhdl

我有以下代码,我正在尝试通过使用循环来使其更专业.

ENTITY cc IS
    PORT ( s, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, y0, y1, y2, y3, y4, y5, y6, y7, y8, y9    : IN    BIT;
           m0, m1, m2, m3, m4, m5, m6, m7, m8, m9                                               : OUT   BIT );
END cc;

ARCHITECTURE cc_logic OF cc IS
BEGIN
    m0 <= (NOT(s) XOR x0) XNOR (s OR y0) ;
    m1 <= (NOT(s) XOR x1) XNOR (s OR y1) ;
    m2 <= (NOT(s) XOR x2) XNOR (s OR y2) ;
    m3 <= (NOT(s) XOR x3) XNOR (s OR y3) ;
    m4 <= (NOT(s) XOR x4) XNOR (s OR y4) ;
    m5 <= (NOT(s) XOR x5) XNOR (s OR y5) ;
    m6 <= (NOT(s) XOR x6) XNOR (s OR y6) ;
    m7 <= (NOT(s) XOR x7) XNOR (s OR y7) ;
    m8 <= (NOT(s) XOR x8) XNOR (s OR y8) ;
    m9 <= (NOT(s) XOR x9) XNOR (s OR y9) ;
END cc_logic ;
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Mor*_*mer 5

standardbit也有一个bit_vector,所以如果接口可以改为使用向量而不是单个位,则可以为VHDL-2002编写代码:

ENTITY cc IS
    PORT ( s : IN  BIT;
           x : IN  BIT_VECTOR(0 TO 9);
           y : IN  BIT_VECTOR(0 TO 9);
           m : OUT BIT_VECTOR(0 TO 9));
END cc;

ARCHITECTURE cc_logic OF cc IS
BEGIN
  loop_gen : FOR idx IN m'RANGE GENERATE
    m(idx) <= ((NOT s) XOR x(idx)) XNOR (s OR y(idx));
  end generate;
END cc_logic;
Run Code Online (Sandbox Code Playgroud)

注意,由于假设是意图NOT(s),因此改变为(NOT s)外部时的逻辑操作XOR是等效的.

也可以在没有生成循环的情况下编写体系结构:

ARCHITECTURE cc_logic OF cc IS
  SIGNAL s_vec : BIT_VECTOR(0 to 9);
BEGIN
  s_vec <= (OTHERS => s);
  m <= ((NOT s_vec) XOR x) XNOR (s_vec OR y);
END cc_logic;
Run Code Online (Sandbox Code Playgroud)

如果使用的工具支持VHDL-2008,那么您可以通过以下方式减少甚至更多:

ARCHITECTURE cc_logic OF cc IS
BEGIN
  m <= ((NOT s) XOR x) XNOR (s OR y);
END cc_logic;
Run Code Online (Sandbox Code Playgroud)

最后,您可以考虑使用std_logicstd_logic_vector不是 bitbit_vector,因为std_logic在使用未知输入数据时,使模拟中的其他状态更准确.