VHDL Examples Subra Ganesan Reference: Professor Haskell’s Notes, Digital design with VHDL book by Vranesic n-line 2-to-1 Multiplexer a(n-1:0) b(n-1:0) n-line 2 x 1 MUX sel y(n-1:0) sel y 0 a 1 b 2 An n-line 2 x 1 MUX a(n-1:0) library IEEE; use IEEE.std_logic_1164.all; b(n-1:0) n-line 2x1 MUX y(n-1:0) entity mux2g is sel generic (width:positive); port ( a: in STD_LOGIC_VECTOR(width-1 downto 0); b: in STD_LOGIC_VECTOR(width-1 downto 0); sel: in STD_LOGIC; y: out STD_LOGIC_VECTOR(width-1 downto 0) ); end mux2g; 3 Entity library IEEE; use IEEE.std_logic_1164.all; Each entity must begin with these library and use statements generic statement defines width of bus entity mux2g is generic (width:positive); port ( a: in STD_LOGIC_VECTOR(width-1 downto 0); b: in STD_LOGIC_VECTOR(width-1 downto 0); sel: in STD_LOGIC; y: out STD_LOGIC_VECTOR(width-1 downto 0) ); end mux2g; port statement defines inputs and outputs 4 Entity library IEEE; use IEEE.std_logic_1164.all; Mode: in or out entity mux2g is generic (width:positive); port ( a: in STD_LOGIC_VECTOR(width-1 downto 0); b: in STD_LOGIC_VECTOR(width-1 downto 0); sel: in STD_LOGIC; y: out STD_LOGIC_VECTOR(width-1 downto 0) ); end mux2g; Data type: STD_LOGIC, STD_LOGIC_VECTOR(width-1 downto 0); 5 Standard Logic library IEEE; use IEEE.std_logic_1164.all; type std_ulogic is ( ‘U’, -- Uninitialized ‘X’ -- Forcing unknown ‘0’ -- Forcing zero ‘1’ -- Forcing one ‘Z’ -- High impedance ‘W’ -- Weak unknown ‘L’ -- Weak zero ‘H’ -- Weak one ‘-’); -- Don’t care 6 Standard Logic Type std_ulogic is unresolved. Resolved signals provide a mechanism for handling the problem of multiple output signals connected to one signal. subtype std_logic is resolved std_ulogic; 7 Architecture architecture mux2g_arch of mux2g is begin mux2_1: process(a, b, sel) begin a(n-1:0) if sel = '0' then y <= a; else b(n-1:0) y <= b; end if; end process mux2_1; end mux2g_arch; n-line 2x1 MUX y(n-1:0) sel Note: <= is signal assignment 8 Architecture entity name process sensitivity list architecture mux2g_arch of mux2g is begin mux2_1: process(a, b, sel) begin Sequential statements if sel = '0' then y <= a; (if…then…else) must be else in a process y <= b; end if; end process mux2_1; end mux2g_arch; Note begin…end in architecture Note begin…end in process 9 library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.std_logic_unsigned.all; Top-level design for Lab 1 entity Lab1 is port( SW : in STD_LOGIC_VECTOR(7 downto 0); BTN0 : in STD_LOGIC; LD : out STD_LOGIC_VECTOR(3 downto 0) ); end Lab1; SW(7:4) SW(3:0) a 4-line 2-to-1 b MUX y LD(3:0) sel BTN0 10 architecture Lab1_arch of Lab1 is component mux2g generic( width : POSITIVE); port( a : in std_logic_vector((width-1) downto 0); b : in std_logic_vector((width-1) downto 0); sel : in std_logic; y : out std_logic_vector((width-1) downto 0)); end component; constant bus_width: integer := 4; begin mux2: mux2g generic map(width => bus_width) port map (a => SW(7 downto 4),b => SW(3 downto 0), sel => BTN0, y => LD); end Lab1_arch; SW(7:4) SW(3:0) a 4-line 2-to-1 b MUX y LD(3:0) sel BTN0 11 Example of case statement architecture mux4g_arch of mux4g is begin process (sel, a, b, c, d) begin case sel is when "00" => y <= a; when "01" => y <= b; when "10" => y <= c; when others => y <= d; end case; end process; end mux4g_arch; Note implies operator => Sel “00” “01” “10” “11” y a b c d Must include ALL possibilities in case statement 12 7-Segment Display D(3:0) Truth table D 0 1 2 3 4 5 6 7 a 1 0 1 1 0 1 1 1 b 1 1 1 1 1 0 0 1 c 1 1 0 1 1 1 1 1 d 1 0 1 1 0 1 1 0 e 1 0 1 0 0 0 1 0 f 1 0 0 0 1 1 1 0 g 0 0 1 1 1 1 1 0 D 8 9 A b C d E F a 1 1 1 0 1 0 1 1 b 1 1 1 0 0 1 0 0 c 1 1 1 1 0 1 0 0 d 1 1 0 1 1 1 1 0 seg7dec e 1 0 1 1 1 1 1 1 f 1 1 1 1 1 0 1 1 AtoG(6:0) g 1 1 1 1 0 1 1 1 13 7-Segment Display Verilog Behavior D(3:0) seg7dec case(D) 0: AtoG = 1: AtoG = 2: AtoG = 3: AtoG = 4: AtoG = 5: AtoG = 6: AtoG = 7: AtoG = 8: AtoG = 9: AtoG = 'hA: AtoG = 'hb: AtoG = 'hC: AtoG = 'hd: AtoG = AtoG(6:0) 'hE: AtoG = 'hF: AtoG = default: AtoG endcase 7'b1111110; 7'b0110000; 7'b1101101; 7'b1111001; 7'b0110011; 7'b1011011; 7'b1011111; 7'b1110000; 7'b1111111; 7'b1111011; 7'b1110111; 7'b0011111; 7'b1001110; 7'b0111101; 7'b1001111; 7'b1000111; = 7'b1111110; // 0 14 7-Segment Display VHDL -- seg7dec with digit select ssg <= "1001111" when "0010010" when "0000110" when AtoG "1001100" when "0100100" when "0100000" when "0001111" when "0000000" when "0000100" when "0001000" when "1100000" when "0110001" when "1000010" when sseg(6:0) seg7dec "0110000" when "0111000" when "0000001" when Behavior (Active LOW) digit(3:0) "0001", --1 "0010", --2 "0011", --3 "0100", --4 "0101", --5 "0110", --6 "0111", --7 "1000", --8 "1001", --9 "1010", --A "1011", --b "1100", --C "1101", --d "1110", --E "1111", --F others; --0 15 Comparators Recall that an XNOR gate can be used as an equality detector XNOR X Y Z = !(X $ Y) Z = X xnor Y Z = ~(X @ Y) Z if X = Y then Z <= '1'; else Z <= '0'; end if; X 0 0 1 1 Y 0 1 0 1 Z 1 0 0 1 16 4-Bit Equality Comparator A0 A1 A2 A3 B0 B1 C0 C1 B2 C2 B3 C3 A_EQ_B A: in STD_LOGIC_VECTOR(3 downto 0); B: in STD_LOGIC_VECTOR(3 downto 0); A_EQ_B: out STD_LOGIC; 17 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; A0 A1 A2 B0 B1 B2 C0 C1 A_EQ_B C2 A3 B3 entity eqdet4 is C3 Port ( A : in std_logic_vector(3 downto 0); B : in std_logic_vector(3 downto 0); A_EQ_B : out std_logic); end eqdet4; architecture Behavioral of eqdet4 is signal C: std_logic_vector(3 downto 0); begin C <= A xnor B; A_EQ_B <= C(0) and C(1) and C(2) and C(3); end Behavioral; 18 Comparators A_EQ_B A(n-1:0) A_GT_B comp B(n-1:0) A_LT_B A_UGT_B A_ULT_B A, B signed A, B unsigned Signed: 2's complement signed numbers 19 -- Comparator for unsigned and signed numbers library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; A(n-1:0) comp B(n-1:0) A_EQ_B A_GT_B A_LT_B A_UGT_B A_ULT_B entity comp is generic(width:positive); port ( A: in STD_LOGIC_VECTOR(width-1 downto 0); B: in STD_LOGIC_VECTOR(width-1 downto 0); A_EQ_B: out STD_LOGIC; A_GT_B: out STD_LOGIC; A_LT_B: out STD_LOGIC; A_ULT_B: out STD_LOGIC; A_UGT_B: out STD_LOGIC ); end comp; 20 architecture comp_arch of comp is begin CMP: process(A,B) variable AVS, BVS: signed(width-1 downto 0); begin for i in 0 to width-1 loop AVS(i) := A(i); BVS(i) := B(i); end loop; A_EQ_B <= '0'; A(n-1:0) A_GT_B <= '0'; A_LT_B <= '0'; B(n-1:0) A_ULT_B <= '0'; A_UGT_B <= '0'; if (A = B) then A_EQ_B <= '1'; end if; if (AVS > BVS) then A_GT_B <= '1'; end if; if (AVS < BVS) then A_LT_B <= '1'; end if; if (A > B) then A_UGT_B <= '1'; end if; if (A < B) then A_ULT_B <= '1'; end if; end process CMP; end comp_arch; comp A_EQ_B A_GT_B A_LT_B A_UGT_B A_ULT_B Note: All outputs must be assigned some value. The last signal assignment in a process is the value assigned 21 4-Bit Comparator 22 Full Adder Truth table Ci Ai Bi Si Ci+1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 Ci Ai Bi Combinational Logic Si Ci+1 Behavior Ci+1:Si = Ci + Ai + Bi 23 Full Adder Ai C i+1 Bi Full Adder Ci Si Block Diagram 24 4-Bit Adder A3 B3 A2 Full Adder Full Adder 4 S3 B1 S 1 0 1 0 0 1 0 B0 Full Adder C0 C1 S2 C 0:A 0:B C4:S A0 Full Adder C2 C3 C A1 B2 1 1 1 1 S 1 1 0 1 0 0 0 0 1 1 0 25 library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_unsigned.all; entity adder4 is port( A : in STD_LOGIC_VECTOR(3 downto 0); B : in STD_LOGIC_VECTOR(3 downto 0); carry : out STD_LOGIC; S : out STD_LOGIC_VECTOR(3 downto 0) ); end adder4; architecture adder4 of adder4 is begin process(A,B) variable temp: STD_LOGIC_VECTOR(4 downto 0); begin temp := ('0' & A) + ('0' & B); S <= temp(3 downto 0); carry <= temp(4); end process; end adder4; 26 4-Bit Adder 27 3-to-8 Decoder A: in STD_LOGIC_VECTOR(2 downto 0); Y: out STD_LOGIC_VECTOR(0 to 7); Behavior for i in 0 to 7 loop if(i = conv_integer(A)) Y(i) <= ‘1’; A2 else 0 Y(i) <= ‘0’; 0 end if; 0 end loop; 0 1 1 1 1 then A1 A0 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 0 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 28 library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_arith.all; use IEEE.STD_LOGIC_unsigned.all; 3-to-8 Decoder entity decode38 is port( A : in STD_LOGIC_VECTOR(2 downto 0); Y : out STD_LOGIC_VECTOR(0 to 7) ); end decode38; architecture decode38 of decode38 is begin process(A) variable j: integer; begin j := conv_integer(A); for i in 0 to 7 loop if(i = j) then Y(i) <= '1'; else Y(i) <= '0'; end if; end loop; end process; end decode38; 29 Shifters D3 s1 D2 D1 D0 Shifter s0 s1 0 0 1 1 s0 0 1 0 1 noshift U2/ 2* 2/ Y3 Y2 Y1 Y0 D3 0 D2 D3 D2 D3 D1 D3 D1 D2 D0 D2 D0 D1 0 D1 Shift right Shift left Arithmetic shift right 30 shift4.vhd library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; D3 s1 D2 D1 D0 Shifter s0 entity shifter is Y3 Y2 generic(width:positive := 4); port ( D: in STD_LOGIC_VECTOR(width-1 downto 0); s: in STD_LOGIC_VECTOR(1 downto 0); Y: out STD_LOGIC_VECTOR(width-1 downto 0) ); end shifter; Y1 Y0 31 architecture shifter_arch of shifter is begin shift_1: process(D, s) begin case s is when "00" => -- no shift Y <= D; when "01" => -- U2/ Y <= '0' & D(width-1 downto 1); when "10" => -- 2* Y <= D(width-2 downto 0) & '0'; when "11" => -- 2/ Y <= D(width-1) & D(width-1 downto 1); when others => Y <= D; end case; end process shift_1; end shifter_arch; -- no shift 32 Code Converters • Gray Code Converter • Binary-to-BCD Converter 33 Gray Code Definition: An ordering of 2n binary numbers such that only one bit changes from one entry to the next. Binary coding {0...7}: {000, 001, 010, 011, 100, 101, 110, 111} Gray coding {0...7}: {000, 001, 011, 010, 110, 111, 101, 100} Not unique One method for generating a Gray code sequence: Start with all bits zero and successively flip the right-most bit that produces a new string. 34 Binary - Gray Code Conversions Gray code: G(i), i = n – 1 downto 0 Binary code: B(i), i = n – 1 downto 0 Binary coding {0...7}: {000, 001, 010, 011, 100, 101, 110, 111} Gray coding {0...7}: {000, 001, 011, 010, 110, 111, 101, 100} Convert Binary to Gray: Copy the most significant bit. For each smaller i G(i) = B(i+1) xor B(i) Convert Gray to Binary: Copy the most significant bit. For each smaller i B(i) = B(i+1) xor G(i) 35 library IEEE; use IEEE.STD_LOGIC_1164.all; bin2gray.vhd entity bin2gray is generic(width:positive := 3); port( B : in STD_LOGIC_VECTOR(width-1 downto 0); G : out STD_LOGIC_VECTOR(width-1 downto 0) ); end bin2gray; architecture bin2gray of bin2gray is begin process(B) begin G(width-1) <= B(width-1); for i in width-2 downto 0 loop G(i) <= B(i+1) xor B(i); end loop; end process; end bin2gray; 36 library IEEE; use IEEE.STD_LOGIC_1164.all; gray2bin.vhd entity gray2bin is generic(width:positive := 3); port( G : in STD_LOGIC_VECTOR(width-1 downto 0); B : out STD_LOGIC_VECTOR(width-1 downto 0) ); end gray2bin; architecture gray2bin of gray2bin is begin process(G) variable BV: STD_LOGIC_VECTOR(width-1 downto 0); begin BV(width-1) := G(width-1); for i in width-2 downto 0 loop BV(i) := BV(i+1) xor G(i); end loop; B <= BV; end process; end gray2bin; 37 Binary-to-BCD Conversion • Shift and add 3 algorithm • RTL solution • Behavioral solution 38 Shift and Add-3 Algorithm 11. 22. 33. 44. Shift the binary number left one bit. If 8 shifts have taken place, the BCD number is in the Hundreds, Tens, and Units column. If the binary value in any of the BCD columns is 5 or greater, add 3 to that value in that BCD column. Go to 1. Operation HEX Start Hundreds Tens Units Binary F 1 1 1 1 F 1 1 1 1 39 Steps to convert an 8-bit binary number to BCD Operation B HEX Start Shift 1 Shift 2 Shift 3 Add 3 Shift 4 Add 3 Shift 5 Shift 6 Add 3 Shift 7 Add 3 Shift 8 BCD P z Hundreds Tens Units Binary 4 3 7 1 1 1 0 2 9 8 17 16 1 0 0 0 7 15 1 1 1 0 0 0 1 0 1 1 0 5 1 1 1 0 1 0 0 1 1 0 1 0 0 0 0 1 0 4 12 3 11 1 1 1 0 1 1 0 0 0 0 0 0 1 0 1 1 1 0 1 1 0 5 1 1 1 0 1 0 1 1 1 1 0 1 0 8 1 1 1 1 1 1 1 1 1 1 1 1 7 F 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 0 F 1 1 1 1 1 1 1 1 1 1 1 3 0 40 Truth table for Add-3 Module A3 A2 A1 A0 C S3 S2 S1 S0 A3 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 A2 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 A1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 A0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 S3 0 0 0 0 0 1 1 1 1 1 X X X X X X S2 0 0 0 0 1 0 0 0 0 1 X X X X X X S1 0 0 1 1 0 0 0 1 1 0 X X X X X X S0 0 1 0 1 0 0 1 0 1 0 X X X X X X 41 Binary-to-BCD Converter RTL Solution 42 Binary-to-BCD Converter: Behavioral Solution -- Title: Binary-to-BCD Converter library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity binbcd is port ( B: in STD_LOGIC_VECTOR (7 downto 0); P: out STD_LOGIC_VECTOR (9 downto 0) ); end binbcd; 43 architecture binbcd_arch of binbcd is begin Operation bcd1: process(B) B HEX Start Shift 1 Shift 2 Shift 3 Add 3 Shift 4 Add 3 Shift 5 Shift 6 Add 3 Shift 7 Add 3 Shift 8 BCD P z Hundreds Tens Units variable z: STD_LOGIC_VECTOR (17 downto 0); begin for i in 0 to 17 loop z(i) := '0'; end loop; z(10 downto 3) := B; Binary 4 3 7 1 1 1 0 2 9 8 1 0 0 0 7 1 1 1 0 0 0 1 0 1 1 0 5 1 1 1 0 1 0 0 1 1 0 1 0 0 0 0 1 0 4 3 1 0 1 0 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 1 0 5 1 1 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 F 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 F 1 1 1 1 1 1 1 1 1 1 1 0 17 16 15 12 11 8 7 4 3 for i in 0 to 4 loop if z(11 downto 8) > 4 then z(11 downto 8) := z(11 downto 8) + 3; end if; if z(15 downto 12) > 4 then z(15 downto 12) := z(15 downto 12) + 3; end if; z(17 downto 1) := z(16 downto 0); end loop; P <= z(17 downto 8); end process bcd1; end binbcd_arch; 44 0 16-bit Binary-to-BCD Converter 45 Verilog binbcd module binbcd(B,P); input [15:0] B; output [15:0] P; reg [15:0] P; reg [31:0] z; integer i; 46 always @(B) begin for(i = 0; i <= 31; i = i+1) z[i] = 0; z[18:3] = B; for(i = 0; i <= 12; i = i+1) begin if(z[19:16] > 4) z[19:16] = z[19:16] if(z[23:20] > 4) z[23:20] = z[23:20] if(z[27:24] > 4) z[27:24] = z[27:24] if(z[31:28] > 4) z[31:28] = z[31:28] z[31:1] = z[30:0]; end P = z[31:16]; end endmodule + 3; + 3; + 3; + 3; 47 Arithmetic Logic Units • ALU1 – Shifting, Increment and Decrement Instructions • ALU2 – Arithmetic and Logic Instructions • ALU3 – Comparators 48 ALU1 Shifting, Increment and Decrement Instructions a(n-1:0) n-line ALU1 y(n-1:0) Sel(2:0) Sel y Name '000' a+1 1+ '001' a-1 1- '010' not a invert '011' LSL a 2* '100' LSR a U2/ '101' ASR a 2/ '110' All ones true '111' All zeros false 49 alu1.vhd library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity alu1 is generic(width:positive); port ( a: in STD_LOGIC_VECTOR(width-1 downto 0); sel: in STD_LOGIC_VECTOR(2 downto 0); y: out STD_LOGIC_VECTOR(width-1 downto 0) ); end alu1; a(n-1:0) n-line ALU1 y(n-1:0) Sel(2:0) 50 architecture alu1_arch of alu1 is begin alu_1: process(a, sel) variable true, false: STD_LOGIC_VECTOR (width-1 downto 0); begin -- true is all ones; false is all zeros for i in 0 to width-1 loop true(i) := '1'; false(i) := '0'; end loop; case sel is when "000" => -- 1+ y <= a + 1; when "001" => -- 1y <= a - 1; when "010" => -- invert y <= not a; when "011" => -- 2* y <= a(width-2 downto 0) & '0'; when "100" => -- U2/ y <= '0' & a(width-1 downto 1); when "101" => -- 2/ y <= a(width-1) & a(width-1 downto 1); when "110" => -- TRUE y <= true; when others => -- FALSE y <= false; end case; end process alu_1; end alu1_arch; 51 ALU2 Arithmetic and Logic Instructions a(n-1:0) n-line ALU2 y(n-1:0) b(n-1:0) Sel y Name '000' a+b + '001' b-a - '010' a and b AND '011' a or b OR '100' a xor b XOR '101' true if a = 0 false otherwise 0= '110' true if a < 0 false otherwise 0< '111' true if b > a false otherwise U> sel(2:0) 52 alu2.vhd library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity alu2 is generic(width:positive); port ( a: in STD_LOGIC_VECTOR(width-1 downto 0); b: in STD_LOGIC_VECTOR(width-1 downto 0); sel: in STD_LOGIC_VECTOR(2 downto 0); y: out STD_LOGIC_VECTOR(width-1 downto 0) ); end alu2; a(n-1:0) n-line ALU2 y(n-1:0) b(n-1:0) sel(2:0) 53 architecture alu2_arch of alu2 is begin alu_2: process(a, b, sel) variable true, false: STD_LOGIC_VECTOR (width-1 downto 0); variable Z: STD_LOGIC; begin Z := '0'; for i in 0 to width-1 loop true(i) := '1'; -- true is all ones; false(i) := '0'; -- false is all zeros Z := Z or a(i); -- Z = '0' if all a(i) = '0' end loop; case sel is when "000" => y <= a + b; -- + when "001" => y <= b - a; -- - when "010" => y <= a and b; -- AND when "011" => y <= a or b; -- OR when "100" => y <= A xor B; -- XOR 54 when "101" if (Z = y <= else y <= end if; => '0') then true; -- 0= NOT false; when "110" => -- 0< if (a(width-1) = '1') then y <= true; else y <= false; end if; when "111" if (b > y <= else y <= end if; => a) then true; -- U> false; when others => null; end case; end process alu_2; end alu2_arch; 55 ALU3 Comparators a(n-1:0) n-line ALU3 y(n-1:0) b(n-1:0) Sel y Name '000' true if b = a false otherwise = '001' true if b /= a false otherwise <> '010' true if b < a (unsigned) false otherwise U< '011' true if b > a (unsigned) false otherwise U> '100' true if b <= a (unsigned) false otherwise U<= '101' true if b < a (signed) false otherwise < '110' true if b > a (signed) false otherwise > '111' true if b <= a (signed) false otherwise <= sel(2:0) 56 alu3.vhd library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity alu3 is generic(width:positive); port ( a: in STD_LOGIC_VECTOR(width-1 downto 0); b: in STD_LOGIC_VECTOR(width-1 downto 0); sel: in STD_LOGIC_VECTOR(2 downto 0); y: out STD_LOGIC_VECTOR(width-1 downto 0) ); end alu3; a(n-1:0) n-line ALU3 y(n-1:0) b(n-1:0) sel(2:0) 57 architecture alu3_arch of alu3 is begin alu_3: process(a, b, sel) variable true, false: STD_LOGIC_VECTOR (width-1 downto 0); variable avs, bvs: signed(width-1 downto 0); begin for i in 0 to width-1 loop true(i) := '1'; -- true is all ones; false(i) := '0'; -- false is all zeros avs(i) := a(i); bvs(i) := b(i); end loop; case sel is when "000" => if (a = b) then y <= true; else y <= false; end if; -- = 58 when "001" => if (a /= b) then y <= true; else y <= false; end if; -- <> when "010" => if (b < a) then y <= true; else y <= false; end if; -- U< when "011" => if (b > a) then y <= true; else y <= false; end if; -- U> when "100" => if (b <= a) then y <= true; else y <= false; end if; -- U<= 59 when "101" => if (bvs < avs) then y <= true; else y <= false; end if; -- < when "110" => if (bvs > avs) then y <= true; else y <= false; end if; -- > when "111" => if (bvs <= avs) then y <= true; else y <= false; end if; -- <= when others => null; end case; end process alu_3; end alu3_arch; 60 ROM addr(2:0) 0 1 2 3 4 5 6 7 85 C4 E6 55 67 D4 F4 C6 M(7:0) 61 ROM.vhd library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity ROM is port ( addr: in STD_LOGIC_VECTOR (2 downto 0); M: out STD_LOGIC_VECTOR (7 downto 0) ); end ROM; addr(2:0) 0 1 2 3 4 5 6 7 85 C4 E6 55 67 D4 F4 C6 M(7:0) 62 architecture ROM_arch of ROM is constant data0: STD_LOGIC_VECTOR constant data1: STD_LOGIC_VECTOR constant data2: STD_LOGIC_VECTOR constant data3: STD_LOGIC_VECTOR constant data4: STD_LOGIC_VECTOR constant data5: STD_LOGIC_VECTOR constant data6: STD_LOGIC_VECTOR constant data7: STD_LOGIC_VECTOR (7 (7 (7 (7 (7 (7 (7 (7 downto downto downto downto downto downto downto downto 0) 0) 0) 0) 0) 0) 0) 0) := := := := := := := := "10000101"; "11000100"; X"E6"; X"55"; X"67"; X"D4"; "11110100"; "11000110"; type rom_array is array (NATURAL range <>) of STD_LOGIC_VECTOR (7 downto 0); constant rom: rom_array := ( data0, data1, data2, data3, data4, data5, data6, data7 ); begin 0 85 process(addr) 1 variable j: integer; C4 begin 2 E6 j := conv_integer(addr); 3 55 addr(2:0) M(7:0) M <= rom(j); 4 67 end process; 5 D4 end ROM_arch; 6 7 F4 C6 63 architecture alu3_arch of alu3 is begin alu_3: process(a, b, sel) variable true, false: STD_LOGIC_VECTOR (width-1 downto 0); variable avs, bvs: signed(width-1 downto 0); begin for i in 0 to width-1 loop true(i) := '1'; -- true is all ones; false(i) := '0'; -- false is all zeros avs(i) := a(i); bvs(i) := b(i); end loop; case sel is when "000" => if (a = b) then y <= true; else y <= false; end if; -- = 64