我有以下代码,我正在尝试通过使用循环来使其更专业.
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)
这可能吗?
该standard包bit也有一个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_logic而std_logic_vector不是
bit和bit_vector,因为std_logic在使用未知输入数据时,使模拟中的其他状态更准确.