VHDL Training PROGRAMMABLE LOGIC DESIGN WITH VHDL ©1997 Cypress Semiconductor, rev 2.5.3 1 VHDL Training Objectives Upon completion of this training, your VHDL knowledge will enable you to: Implement efficient combinatorial and sequential logic Design state machines and understand implementation trade-offs Use hierarchy / Create reusable components Identify how VHDL will synthesize and fit into a PLD or CPLD ©1997 Cypress Semiconductor, rev 2.5.3 2 VHDL Training Agenda Introduction, Why Use VHDL? PLD Design Flow VHDL Design Descriptions The Entity, Ports, Modes, Types Exercise #1 The Architecture, Architecture Styles VHDL Statements, Combinational Logic Processes, Signals vs. Variables VHDL Operators/Overloading/Inferencing Tri-State Logic, Don't Cares VHDL Identifiers Exercise #2, Exercise #3 Registers/Sequential Logic ©1997 Cypress Semiconductor, rev 2.5.3 3 Wait Statement, Implicit Memory Exercise #4 - Lunch State Machines and State Encoding Exercise #5 Hierarchy (components, packages, and libraries) Exercise #6 Generate Statement Multiplexing I/O pins Exercise #7 Attributes, Miscellaneous Topics, Wrap-up VHDL Training Introduction VHDL is used to: document circuits simulate circuits synthesize design descriptions Synthesis is the reduction of a design description to a lower-level representation (such as a netlist or a set of equations). This training course covers VHDL for PLD synthesis The course will at times draw upon the concepts of VHDL as a simulation language ©1997 Cypress Semiconductor, rev 2.5.3 4 VHDL Training Why Use VHDL? Quick Time-to-Market Allows designers to quickly develop designs requiring tens of thousands of logic gates Provides powerful high-level constructs for describing complex logic Supports modular design methodology and multiple levels of hierarchy One language for design and simulation Allows creation of device-independent designs that are portable to multiple vendors. Allows user to pick any synthesis tool, vendor, or device ©1997 Cypress Semiconductor, rev 2.5.3 5 VHDL Training PLD Design Flow Design Entry Schematic Capture/HDL or Both Front-End Simulation (optional) Design Compilation Synthesis, Fitting/Place&Route Design Verification Back-End Simulation (optional) Device Programming ©1997 Cypress Semiconductor, rev 2.5.3 6 VHDL Training Design Entry Schematic Text Simulation Front End Synthesis Design Compilation Fitting Place&Route Sim. Model Design Verification JEDEC File Simulation Programmer ©1997 Cypress Semiconductor, rev 2.5.3 7 Prog. File Back End VHDL Training VHDL Design Descriptions VHDL design descriptions (referred to as "design entities") consist of an ENTITY declaration and ARCHITECTURE body pair The ENTITY declaration describes the design I/O The ARCHITECTURE body describes the content of the design ©1997 Cypress Semiconductor, rev 2.5.3 8 VHDL Training VHDL Entity/Architecture Pairs: 2-Input And Function ENTITY and2 IS PORT ( a,b : IN std_logic; f: OUT std_logic); END and2; ARCHITECTURE behavioral OF and2 IS BEGIN f <= a AND b; END behavioral; ©1997 Cypress Semiconductor, rev 2.5.3 9 VHDL Training The Entity A “BLACK BOX” The ENTITY describes the periphery of the black box (i.e., the design I/O) BLACK_BOX rst q[7:0] d[7:0] co clk ©1997 Cypress Semiconductor, rev 2.5.3 10 VHDL Training Example Entity declaration ENTITY black_box IS PORT ( clk, rst: IN std_logic; d: IN std_logic_vector(7 DOWNTO 0); q: OUT std_logic_vector(7 DOWNTO 0); co: OUT std_logic); END black_box; BLACK_BOX More shortly rst q[7:0] d[7:0] clk ©1997 Cypress Semiconductor, rev 2.5.3 11 co VHDL Training The Entity Declaration ENTITY entity_name IS PORT ( -- optional generics name : mode type ; ... ) ; END entity_name; entity_name is an arbitrary name generics are used for defining paramaterized components name is the signal/port identifier and may be a comma separate list for ports of identical modes and types mode describes the direction the data is flowing type indicates the set of values the port name may be assigned ©1997 Cypress Semiconductor, rev 2.5.3 12 VHDL Training Ports The Entity (“BLACK BOX”) has PORTS PORTS are points of communication • PORTS are often associated with the device pins PORTS are a special class of SIGNAL PORTS have an associated SIGNAL name, mode, and type ©1997 Cypress Semiconductor, rev 2.5.3 13 VHDL Training PORT modes A port’s MODE is the direction data is transferred: IN Data goes into the entity but not out OUT Data goes out of the entity but not in (and is not used internally) INOUT Data is bi-directional (goes into and out of the entity) BUFFER Data that goes out of the entity and is also fed-back internally within the entity ©1997 Cypress Semiconductor, rev 2.5.3 14 VHDL Training IEEE 1076 Types VHDL is a strongly typed language (you cannot assign a signal of one type to the signal of another type) bit - a signal of type bit that can only take values of '0' or '1' bit_vector - a grouping of bits (each can be '0' or '1') SIGNAL a: BIT_VECTOR(0 TO 3); -- ascending range SIGNAL b: BIT_VECTOR(3 DOWNTO 0); -- descending range a <= "0111"; -- double quotes used for vectors b <= "0101"; This means that: a(0) = '0' b(0) = '1' a(1) = '1' b(1) = '0' a(2) = '1' b(2) = '1' a(3) = '1' b(3) = '0' ©1997 Cypress Semiconductor, rev 2.5.3 15 VHDL Training IEEE 1076 TYPES (contd.) INTEGER • useful as index holders for loops, constants, generics, or high-level modeling BOOLEAN • can take values ‘TRUE’ or ‘FALSE’ ENUMERATED • has user defined set of possible values, e.g., • TYPE states IS (start, slow, fast, stop); ©1997 Cypress Semiconductor, rev 2.5.3 16 VHDL Training IEEE 1164 "Multi-value logic system for VHDL interoperability" A package created as an aid to VHDL users Nine values as opposed to two ('0' and '1') Allows increased flexibility in behavioral VHDL coding, synthesis, and simulation std_logic and std_logic_vector are used as opposed to bit and bit_vector when a multi-valued logic system is required. std_logic and std_logic_vector are used when tri-state logic is required. ©1997 Cypress Semiconductor, rev 2.5.3 17 VHDL Training 1164 Types std_logic and std_logic_vector are the industry standard logic type for digital design All 9 values are valid in a VHDL simulator, however only: ‘0’ -- Forcing ‘0’ ‘1’ -- Forcing ‘1’ ‘Z’ -- High Impedance ‘L’ -- Weak ‘0’ ‘H’ -- Weak ‘1’ ‘-’ -- Don’t care are recognized for logic synthesis ©1997 Cypress Semiconductor, rev 2.5.3 18 VHDL Training Entity Declaration Example LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY black_box IS PORT ( clk, rst: IN std_logic; d: IN std_logic_vector(7 DOWNTO 0); q: OUT std_logic_vector(7 DOWNTO 0); co: OUT std_logic); END black_box; BLACK_BOX MODE rst TYPE q[7:0] d[7:0] clk ©1997 Cypress Semiconductor, rev 2.5.3 19 co VHDL Training Exercise #1: The Entity Write an entity declaration for the following: Port D is a 12-bit bus, input only Port OE and CLK are each input bits Port AD is a 12-bit, three-state bi-directional bus Port A is a 12-bit bus, output only Port INT is a three-state output Port AS is an output also used internally my_design ad[11:0] d[11:0] ©1997 Cypress Semiconductor, rev 2.5.3 oe a[11:0] clk int as 20 VHDL Training Exercise #1: Solution LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY my_design IS PORT ( d: IN std_logic_vector(11 DOWNTO 0); oe, clk: IN std_logic; ad: INOUT std_logic_vector(11 DOWNTO 0); a: OUT std_logic_vector(11 DOWNTO 0); int: OUT std_logic; my_design as: BUFFER std_logic); END my_design; ad[11:0] d[11:0] -- In this presentation, VHDL keywords a[11:0] oe -- are highlighted in bold, CAPITALS; int clk as -- however, VHDL is not case sensitive: -- clock, Clock, CLOCK all refer to the -- same signal, -- means a comment ©1997 Cypress Semiconductor, rev 2.5.3 21 VHDL Training The Architecture Architectures describe what is in the black box (i.e., the structure or behavior of entities) Descriptions can be either a combination of Structural descriptions • Instantiations (placements of logic-much like in a schematic-and their connections) of building blocks referred to as components Behavioral/Dataflow descriptions • Algorithmic (or “high-level”) descriptions: IF a = b THEN state <= state5; • Boolean equations (also referred to as dataflow): x <= (a OR b) AND c; ©1997 Cypress Semiconductor, rev 2.5.3 22 VHDL Training The Architecture Declaration ARCHITECTURE arch_name OF entity_name IS -- optional signal declarations, etc. BEGIN --VHDL statements END arch_name; arch_name is an arbitrary name optional signal declarations are used for signals local to the architecture body (that is, not the entity’s I/O). entity_name is the entity name statements describe the function or contents of the entity ©1997 Cypress Semiconductor, rev 2.5.3 23 VHDL Training Architecture Body Styles : Behavioral ENTITY compare IS PORT ( a, b: IN std_logic_vector(0 TO 3); equals: OUT std_logic); END compare; ARCHITECTURE behavior OF compare IS BEGIN comp: PROCESS (a,b) BEGIN IF a = b THEN equals <= '1' ; ELSE equals <= '0' ; END IF ; END PROCESS comp; END behavior; ©1997 Cypress Semiconductor, rev 2.5.3 24 VHDL Training Architecture Body Styles : Dataflow ENTITY compare IS PORT ( a, b: IN std_logic_vector(0 TO 3); equals: OUT std_logic); END compare; ARCHITECTURE dataflow OF compare IS BEGIN equals <= '1' WHEN a = b ELSE '0' ; END dataflow; ©1997 Cypress Semiconductor, rev 2.5.3 25 VHDL Training Architecture Body Styles : Structural ENTITY compare IS PORT ( a, b: IN std_logic_vector(0 TO 3); equals: OUT std_logic); END compare; USE WORK.gatespkg.ALL ; ARCHITECTURE structure OF compare IS SIGNAL x : std_logic_vector (0 to 3) ; BEGIN u0: xnor2 PORT MAP (a(0),b(0),x(0)) ; u1: xnor2 PORT MAP (a(1),b(1),x(1)) ; u2: xnor2 PORT MAP (a(2),b(2),x(2)) ; u3: xnor2 PORT MAP (a(3),b(3),x(3)) ; u4: and4 PORT MAP (x(0),x(1),x(2),x(3),equals) ; END structure; ©1997 Cypress Semiconductor, rev 2.5.3 26 VHDL Training Comparing Architecture Styles These examples synthesize to equivalent circuits In more elaborate designs, some descriptions may yield more efficient circuits sloppy code = inefficient results (see section 3.3.4) Use styles that make your designs easier to describe and maintain Behavioral/Dataflow exploit module generation (described later) Structural descriptions may make the design less portable (may rely on a library of vendor-specific components) ©1997 Cypress Semiconductor, rev 2.5.3 27 VHDL Training Mixing Architecture Styles The various styles may be mixed in one architecture. ENTITY logic IS PORT ( a,b,c: IN std_logic; f: OUT std_logic); END logic; LOGIC a b d g1 c USE WORK.gatespkg.ALL; ARCHITECTURE archlogic OF logic IS SIGNAL d: std_logic; BEGIN Behavioral/Dataflow d <= a AND b; Structural g1: nor2 PORT MAP (c, d, f); END archlogic; ©1997 Cypress Semiconductor, rev 2.5.3 28 f VHDL Training VHDL Statements There are two types of statements Sequential • Though hardware is concurrent, it may be modeled with algorithms, by a series of sequential statements • By definition, sequential statements are grouped using a process statement. Concurrent • Statements outside of a process are evaluated concurrently during simulation • Processes are concurrent statements ©1997 Cypress Semiconductor, rev 2.5.3 29 VHDL Training Concurrent Statements Concurrent statements include: boolean equations conditional/selective signal assignments (when/else, with/select) instantiations Examples of concurrent statements: -- Examples of boolean equations x <= (a AND (NOT sel1)) OR (b AND sel1); g <= NOT (y AND sel2); -- Examples of conditional assignments y <= d WHEN (sel1 = '1') ELSE c; h <= '0' WHEN (x = '1' AND sel2 = '0') ELSE '1'; -- Examples of instantiation inst: nand2 PORT MAP (h, g, f); ©1997 Cypress Semiconductor, rev 2.5.3 30 VHDL Training The Process Statement Used to construct algorithms/group sequential statements Statements within a process are sequential statements-they execute sequentially during simulation An architecture can contain multiple processes. Each process is executed concurrently Processes may be used to model combinational or synchronous logic ©1997 Cypress Semiconductor, rev 2.5.3 31 VHDL Training The Process (contd.) label: PROCESS (sensitivity list) -- variable declarations BEGIN -- sequential statements END PROCESS label ; The process label and variable declarations are optional The process executes when one of the signals in the sensitivity list has an event (changes value). ©1997 Cypress Semiconductor, rev 2.5.3 32 VHDL Training Process (contd.) Processes are executing or suspended (active or inactive/awake or asleep) A process typically has a sensitivity list When a signal in the sensitivity list changes value, the process is executed by the simulator e.g., a process with a clock signal in its sensitivity list becomes active on changes of the clock signal All signal assignments occur at the END PROCESS statement in terms of simulation The process is then suspended until there is an event (change in value) on a signal in the sensitivity list ©1997 Cypress Semiconductor, rev 2.5.3 33 VHDL Training Combinational Logic Can be described with concurrent statements e.g. with-select-when, when-else, boolean equations, component instantiatons Can be described with sequential statements e.g. if-then-else, case-when ©1997 Cypress Semiconductor, rev 2.5.3 34 VHDL Training Combinational Logic w/ Boolean Equations Boolean Equations can be used in both concurrent and sequential signal assignment statements. A 4-1 multiplexer is shown below s x <= (a AND NOT(s(1)) AND NOT(s(0))) OR (b AND NOT(s(1)) AND s(0)) OR (c AND s(1) AND NOT(s(0))) OR (d AND s(1) AND s(0)) ; ©1997 Cypress Semiconductor, rev 2.5.3 35 2 a b c d mux x VHDL Training Selective Signal Assignment: with-select-when Assignment based on a selection signal WHEN clauses must be mutually exclusive Use a WHEN OTHERS to avoid latches Only one reference to the signal, only one assignment operator (<=) WITH selection_signal SELECT signal_name <= value_1 WHEN value_1 of selection_signal, value_2 WHEN value_2 of selection_signal, ... value_n WHEN value_n of selection_signal, value_x WHEN OTHERS; ©1997 Cypress Semiconductor, rev 2.5.3 36 VHDL Training Combinational Logic w/ Selective Signal Assignment The same 4-1 multiplexer is shown below with s select x <= a when “00” , b when “01” , c when “10” , d when others ; ©1997 Cypress Semiconductor, rev 2.5.3 37 VHDL Training More on with-select-when You can use a range of values with int_value select x <= a when 0 to 3, b when 4 | 6 | 8 , c when 10 , d when others ; ©1997 Cypress Semiconductor, rev 2.5.3 38 VHDL Training Conditional Signal Assignment: when-else Signal is assigned a value based on conditions Any simple expression can be a condition Priority goes in order of appearance Only one reference to the signal, only one assignment operator (<=) Use a final ELSE to avoid latches signal_name <= value_1 value_2 ... value_n value_x ©1997 Cypress Semiconductor, rev 2.5.3 WHEN condition1 ELSE WHEN condition2 ELSE WHEN conditionn ELSE ; 39 VHDL Training Combinational Logic w/ Conditional Signal Assignment The same 4-1 multiplexer is shown below x <= a when (s = “00”) else b when (s = “01”) else c when (s = “10”) else d; ©1997 Cypress Semiconductor, rev 2.5.3 40 VHDL Training Combinational Logic w/ Conditional Signal Assignment The when conditions do not have to be mutually exclusive (as in with-select-when) A priority encoder is shown below j <= w when (a = ‘1’) else x when (b = ‘1’) else y when (c = ‘1’) else z when (d = ‘1’) else ‘0’ ; ©1997 Cypress Semiconductor, rev 2.5.3 41 VHDL Training Combinational Logic w/ Sequential Statements Grouped together with Processes Processes are concurrent with one another and with concurrent statements Order of sequential statements does make a difference in synthesis ©1997 Cypress Semiconductor, rev 2.5.3 42 VHDL Training Sequential Statements if-then-else Used to select a set of statements to be executed Selection based on a boolean evaluation of a condition or set of conditions IF condition(s) THEN do something; ELSIF condition_2 THEN -- optional do something different; ELSE -- optional do something completely different; END IF ; ©1997 Cypress Semiconductor, rev 2.5.3 43 VHDL Training if-then-else Absence of ELSE results in implicit memory 4-1 mux shown below mux4_1: process (a, b, c, d, s) begin if s = “00” then x <= a ; elsif s = “01” then x <= b ; elsif s = “10” then x <= c ; else x <= d ; end process mux4_1 ; ©1997 Cypress Semiconductor, rev 2.5.3 44 VHDL Training Sequentional Statements: Case-When CASE selection_signal WHEN value_1_of_selection_signal => (do something) -- set of statements 1 WHEN value_2_of_selection_signal => (do something) -- set of statements 2 ... WHEN value_N_of_selection_signal => (do something) -- set of statements N WHEN OTHERS => (do something) -- default action END CASE ; ©1997 Cypress Semiconductor, rev 2.5.3 45 VHDL Training The CASE Statement: 4-1 Mux ARCHITECTURE archdesign OF design IS SIGNAL s: std_logic_vector(0 TO 1); BEGIN mux4_1: PROCESS (a,b,c,d,s) BEGIN CASE s IS WHEN "00" => x <= a; WHEN "01" => x <= b; WHEN "10” => x <= c; WHEN OTHERS => x <= d; END CASE; END PROCESS mux4_1; END archdesign; ©1997 Cypress Semiconductor, rev 2.5.3 46 VHDL Training Sequential Statements: An Example mux: PROCESS (a, b, s) BEGIN IF s = '0' THEN x <= a; ELSE x <= b; END IF; END PROCESS mux; s a(3 DOWNTO 0) x(3 DOWNTO 0) b(3 DOWNTO 0) Note: logic within a process can be registered or combinatorial Note: the order of the signals in the sensitivity list is not important Note: the process mux is sensitive to signals a, b, and s; i.e., whenever one or more of those signals changes value, the statements inside of the process are executed ©1997 Cypress Semiconductor, rev 2.5.3 47 VHDL Training Signal Assignment in Processes Which Circuit is Correct? PROCESS BEGIN WAIT UNTIL clock = '1' ; -- implied sensitivity list b <= a; c <= b; END PROCESS ; a a c clock clock ©1997 Cypress Semiconductor, rev 2.5.3 48 b c VHDL Training Signal Assignment in Processes (contd.) Signals are not updated immediately. Rather, they are scheduled. The signals are not updated until time advances (after the End Process statement) Therefore, two registers will be synthesized Note: In some instances, the use of concurrent statements outside the process may alleviate the problem, but this is not possible with registered logic. ©1997 Cypress Semiconductor, rev 2.5.3 49 VHDL Training VARIABLES When a concurrent signal assignment cannot be used, the previous problem can be avoided using a VARIABLE Variables can only exist within a PROCESS, they cannot be used to communicate information between processes Variables can be of any valid data type The value assigned to a variable is available immediately The variable assignment statement is used to assign values to variables, e.g., c := a AND b; ©1997 Cypress Semiconductor, rev 2.5.3 50 VHDL Training Using Variables vs. Signals Solution using a variable within a process: -- assume a and c are signals defined elsewhere PROCESS VARIABLE b : std_logic ; BEGIN WAIT UNTIL clock = '1' ; b := a ; -- this is immediate c <= b ; -- this is scheduled END PROCESS ; ©1997 Cypress Semiconductor, rev 2.5.3 51 VHDL Training Native Operators Logical - defined for type bit, bit_vector, boolean* AND, NAND OR, NOR XOR, XNOR NOT Relational - defined for types bit, bit_vector, integer* = (equal to) /= (not equal to) < (less than) <= (less than or equal to) > (greater than) >= (greater than or equal to) * overloaded for std_logic, std_logic_vector ©1997 Cypress Semiconductor, rev 2.5.3 52 VHDL Training Native Operators (contd.) Unary Arithmetic - defined for type integer* - (arithmetic negate) Arithmetic - defined for type integer* + (addition), * (multiplication) - (subtraction) Concatenation - defined for strings & Note, a STRING is any sequence of characters, therefore a std_logic_vector is an example of a STRING * overloaded for std_logic, std_logic_vector ©1997 Cypress Semiconductor, rev 2.5.3 53 VHDL Training Overloaded Operators In VHDL, the scope of all of the previous operators can be extended (or overloaded) to accept any type supported by the language, e.g., ----- assume a declaration of a 16-bit vector as SIGNAL pc IS std_logic_vector(15 DOWNTO 0); then a valid signal assignment is pc <= pc + 3; assuming the '+' operator has been overloaded to accept std_logic_vector and integer operands The std_logic_1164 package defines overloaded logical operators (AND, OR, NOT, etc.,) for the std_logic and std_logic_vector types In this training, you will learn to use overloaded operators, but not to define them ©1997 Cypress Semiconductor, rev 2.5.3 54 VHDL Training Using Tri-State Logic ENTITY test_three IS PORT( oe : in std_logic; data : out std_logic_vector(0 to 7)); END test_three; ARCHITECTURE archtest_three OF test_three IS BEGIN PROCESS (oe) BEGIN IF (oe = '1') THEN data <= "01100100"; ELSE data <= "ZZZZZZZZ"; END IF; END PROCESS; END archtest_three; ©1997 Cypress Semiconductor, rev 2.5.3 55 VHDL Training Behavioral Don’t Cares Can use explicit "don’t care" conditions to produce optimal logic equations IF (a = '1') AND (b = '1') THEN x <= c; ELSE x <= '-'; END IF; Produces the equation x = c To assign don’t cares in VHDL: mysig <= '-'; 'X' means "unknown" and is not useful for synthesis ©1997 Cypress Semiconductor, rev 2.5.3 56 VHDL Training Comparing Vectors to Strings -more on don't cares Comparing "1101" to "11-1" will return FALSE Use std_match(a,"string") Must include std_arith package Example: ... signal a : stdlogic_vector (1 to 4) ; ... IF (std_match(a,"10-1")) THEN x <= '1' ; END IF ; ©1997 Cypress Semiconductor, rev 2.5.3 57 VHDL Training Legal VHDL Identifiers Letters, digits, and underscores only (first character must be a letter) The last character cannot be an underscore Two underscores in succession are not allowed Using reserved words is not allowed Examples Legal • tx_clk, Three_State_Enable, sel7D, HIT_1124 Not Legal • _tx_clk, 8B10B, large#num, register, clk_ ©1997 Cypress Semiconductor, rev 2.5.3 58 VHDL Training Exercise #2: Architecture Declaration of a Comparator The entity declaration is as follows: a(0 TO 3) LIBRARY ieee; USE ieee.std_logic_1164.ALL; b(0 TO 3) ENTITY compare IS PORT ( a, b: IN std_logic_vector(0 TO 3); aeqb: OUT std_logic); END compare; Write an architecture that causes aeqb to be asserted when a is equal to b Multiple solutions exist ©1997 Cypress Semiconductor, rev 2.5.3 59 aeqb VHDL Training Three possible solutions Concurrent statement solution using a conditional assignment: ARCHITECTURE archcompare OF compare IS BEGIN aeqb <= '1' WHEN a = b ELSE '0'; END archcompare; Concurrent statement solution using boolean equations: ARCHITECTURE archcompare OF compare IS BEGIN aeqb <= NOT( (a(0) XOR b(0)) OR (a(1) XOR b(1)) OR (a(2) XOR b(2)) OR (a(3) XOR b(3))); END archcompare; ©1997 Cypress Semiconductor, rev 2.5.3 60 VHDL Training Three possible solutions (contd.) Solution using a process with sequential statements: ARCHITECTURE archcompare OF compare IS BEGIN comp: PROCESS (a, b) BEGIN IF a = b THEN aeqb <= '1'; a(0 TO 3) ELSE aeqb <= '0'; b(0 TO 3) END IF; END PROCESS comp; END archcompare; ©1997 Cypress Semiconductor, rev 2.5.3 61 aeqb VHDL Training Exercise #3: The Schematic en(0) dir gnd en(1) nOE LE nOE LE control[7:0] status[7:0] gnd dir CY74FCT373T en(2) en(3) nOE T/R CY74FCT373T nOE LE data[7:0] CY74FCT245T CY74FCT373T addr[1:0] dir nvalid en[0:3] PLD ©1997 Cypress Semiconductor, rev 2.5.3 62 VHDL Training Exercise #3 Use Warp to compile the VHDL design description of the truth table below: addr nvalid b"00" b"00" b"01" b"01" b"10" b"10" b"11" b"11" '0' '1' '0' '1' '0' '1' '0' '1' en(0) en(1) en(2) en(3) dir L L H L L L L L L H H H H H H H H H H H L H H H L L L L L L H L L H H H L H H H Write the Architecture for the given Entity (next) Save design in file named “ex3.vhd” ©1997 Cypress Semiconductor, rev 2.5.3 63 VHDL Training Exercise #3: The Entity Declaration the entity declaration is as follows: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY ex3 IS PORT ( addr: IN std_logic_vector(1 DOWNTO 0); nvalid: IN std_logic; en: BUFFER std_logic_vector(0 TO 3); dir: OUT std_logic ); addr END ex3; dir nvalid en PLD ©1997 Cypress Semiconductor, rev 2.5.3 64 VHDL Training Exercise #3: Solution The Architecture The architecture is as follows: ARCHITECTURE archex3 OF ex3 IS BEGIN en(0) <= '0' WHEN (addr = "00" AND nvalid = '0') ELSE '1'; en(1) <= (NOT addr(1)) AND addr(0) AND (NOT nvalid) ; en(2) <= '0' WHEN (addr = "10" AND nvalid = '0') ELSE '1'; en(3) <= addr(1) AND addr(0) AND (NOT nvalid); dir <= '0' WHEN (addr = "00" AND nvalid = '0') OR (addr = "10" AND nvalid = '0') ELSE '1' ; END archex3; ©1997 Cypress Semiconductor, rev 2.5.3 65 VHDL Training Aggregates and Subscripts Aggregate assignment concatenates signals together Good for creating a bus from several inputs Concatenation operator can be used as well Same number of array elements on both sides of <= tmp <= (a,b,c,d); tmp <= a & b & c & d; Signals can be “pulled” from larger vectors Good for grouping outputs as an “alias” Sizes on both sides must match rw <= ctrl(0); ce <= ctrl(1); oe <= ctrl(2); highcount <= count(7 DOWNTO 4); ©1997 Cypress Semiconductor, rev 2.5.3 66 VHDL Training Exercise #3: Alternate Solution Using With/Select and aggregates ARCHITECTURE archex3 OF ex3 IS SIGNAL control : std_logic_vector(2 DOWNTO 0); SIGNAL outputs : std_logic_vector(0 TO 4); BEGIN control <= addr & nvalid; WITH control SELECT outputs <= "00100" WHEN "000", "10101" WHEN "001", "11101" WHEN "010", "10101" WHEN "011", "10000" WHEN "100", "10101" WHEN "101", "10111" WHEN "110", "10101" WHEN "111", "-----" WHEN OTHERS; en <= outputs(0 TO 3); dir <= outputs(4); END archex3; ©1997 Cypress Semiconductor, rev 2.5.3 67 VHDL Training Designs that use Registers There are two methods of utilizing and generating flip-flops: Instantiate (place) a flip-flop or a component that contains a flip-flop Use a process that is sensitive to a clock edge ©1997 Cypress Semiconductor, rev 2.5.3 68 VHDL Training Instantiating a registered component Example: Using LPM library LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE WORK.lpmpkg.all ; ENTITY registered IS PORT ( d, clk: IN std_logic; q: OUT std_logic); END registered; d q clk ARCHITECTURE archregistered OF registered IS BEGIN flipflop: Mff generic map (lpm_width=>1,lpm_fftyp=>lpm_dff) PORT MAP (data=>d,clock=>clk,enable=>one,q=>q); END archregistered; ©1997 Cypress Semiconductor, rev 2.5.3 69 VHDL Training Registers in Behavioral VHDL Example: a D-type flip-flop ENTITY registered IS PORT ( d, clk: IN std_logic; q: OUT std_logic); END registered; ARCHITECTURE archregistered OF registered IS BEGIN flipflop: PROCESS (clk) BEGIN IF clk’EVENT AND clk = '1' THEN q <= d; END IF; END PROCESS flipflop; END archregistered; ©1997 Cypress Semiconductor, rev 2.5.3 70 VHDL Training Registers in Behavioral VHDL The synthesis compiler infers that a register is to be created for which signal q is the output because The clock (clk) is in the sensitivity list The construct, clk’event and clk = ‘1’, appears in the process The clk’event and clk = ‘1’ statement implies that subsequent signal assignments occur on the risingedge of the clock The absence of an “else” clause in the “if-then” statement implies that if the clk’event and clk = ‘1’ condition is not fulfilled (i.e. not a rising-edge), q will retain its value until the next assignment occurs (this is referred to as implied memory) ©1997 Cypress Semiconductor, rev 2.5.3 71 VHDL Training A Registered Process (1) A 4-bit counter with synchronous reset USE WORK.std_arith.ALL; ... upcount: PROCESS (clk) BEGIN IF clk’EVENT AND clk= '1' THEN IF reset = '1' THEN count <= "0000"; -- or x"0" instead ELSE count <= count + 1; END IF; END IF; END PROCESS upcount; This process is only sensitive to changes in “clk”, i.e., it will become active only when the clock transitions ©1997 Cypress Semiconductor, rev 2.5.3 72 VHDL Training A Registered Process (2) A 4-bit counter with asynchronous reset USE WORK.std_arith.ALL; ... upcount: PROCESS (clk, rst) BEGIN IF rst = '1' THEN count <= x"0"; ELSIF clk’EVENT AND clk = '1' THEN count <= count + 1; END IF; END PROCESS upcount; This process is sensitive to changes in both clk and rst, i.e., it will become active during clock or reset transitions. ©1997 Cypress Semiconductor, rev 2.5.3 73 VHDL Training A Registered Process (3) A 4-bit loadable counter with asynchronous reset USE WORK.std_arith.ALL; ... upcount: PROCESS (clk, rst) BEGIN IF rst = '1' THEN count <= x"0" ; ELSIF clk’EVENT AND clk = '1' THEN IF load = '1' THEN count <= data; ELSE count <= count + 1; END IF; END IF; END PROCESS upcount; ©1997 Cypress Semiconductor, rev 2.5.3 74 VHDL Training The WAIT statement This is another method to activate a process The WAIT statement is a sequential statement which suspends the execution of a process until the condition specified becomes valid (true) i.e., an implied sensitivity list, e.g., sync: PROCESS BEGIN WAIT UNTIL clock='1'; IF enable='1' THEN q_out <= d_in; ELSE q_out <= '0'; END IF; END PROCESS sync; ©1997 Cypress Semiconductor, rev 2.5.3 enable d_in clock 75 D Q q_out VHDL Training Implicit memory Signals in VHDL have a current value and may be scheduled for a future value If the future value of a signal cannot be determined, a latch will be synthesized to preserve its current value Advantages: Simplifies the creation of memory in logic design Disadvantages: Can generate unwanted latches, e.g., when all of the options in a conditional sequential statement are not specified ©1997 Cypress Semiconductor, rev 2.5.3 76 VHDL Training Implicit memory: Example of incomplete specification ARCHITECTURE archincomplete OF incomplete IS a BEGIN im_mem: PROCESS (a,b) c BEGIN IF a = '1' THEN c <= b; b END IF; END PROCESS im_mem; END archincomplete; Note: the incomplete specification of the IF...THEN... statement causes a latch to be synthesized to store the previous state of ‘c’ ©1997 Cypress Semiconductor, rev 2.5.3 77 VHDL Training Implicit memory: Example of complete specification ARCHITECTURE archcomplete OF complete IS BEGIN no_mem: PROCESS (a, b) BEGIN IF a = '1' THEN c <= b; ELSE c <= '0'; END IF; END PROCESS no_mem; END archcomplete; a b The conditional statement is fully specified, and this causes the process to synthesize to a single gate ©1997 Cypress Semiconductor, rev 2.5.3 78 c VHDL Training The rules to avoid implicit memory To avoid the generation of unexpected latches always terminate an IF...THEN... statement with an ELSE clause cover all alternatives in a CASE statement • define every alternative individually, or • terminate the CASE statement with a WHEN OTHERS... clause, e.g., CASE select IS WHEN b"100" => key x <= a WHEN b"010" => key WHEN b"001" => key WHEN OTHERS => key END CASE; ©1997 Cypress Semiconductor, rev 2.5.3 79 <= first; AND b; <= second; <= third; <= none; VHDL Training Exercise #4 Making use of the previous examples, write an entity/architecture pair for the following design: ENC COUNTER DATA LD 4 DIN LD COUNT Q 4 ENC COMPARATOR CLOCK P RST RESET (sync) P=Q Q REGISTER DIN ENR ©1997 Cypress Semiconductor, rev 2.5.3 Q 4 ENR 80 VHDL Training Exercise #4: Solution LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY ex4 IS PORT ( clock, reset, enc, enr, ld: IN std_logic; data: IN std_logic_vector (3 DOWNTO 0); count: BUFFER std_logic_vector(3 DOWNTO 0)); END ex4; USE WORK.std_arith.ALL; -- for counter and ultragen ARCHITECTURE archex4 OF ex4 IS SIGNAL comp: std_logic; SIGNAL regout: std_logic_vector (3 DOWNTO 0); BEGIN reg: PROCESS (clock) BEGIN IF clock'EVENT AND clock = '1' THEN IF enr = '1' THEN regout <= data; END IF; END IF; END PROCESS reg; ©1997 Cypress Semiconductor, rev 2.5.3 81 VHDL Training Exercise #4: Solution (contd.) cntr: PROCESS (clock) BEGIN IF clock'EVENT AND clock = '1' THEN IF reset = '1' THEN count <= "0000"; ELSIF ld = '1' THEN count <= data; ELSIF enc = '1' AND comp = '0' THEN count <= count + 1; END IF; END IF; END PROCESS cntr; comp <= '1' WHEN regout = count ELSE '0'; END archex4; ©1997 Cypress Semiconductor, rev 2.5.3 82 VHDL Training State machines Moore Machines A finite state machine in which the outputs change due to a change of state Mealy Machines A finite state machine in which the outputs can change asynchronously i.e., an input can cause an output to change immediately ©1997 Cypress Semiconductor, rev 2.5.3 83 VHDL Training Moore machines Outputs may change only with a change of state Multiple implementations include: Arbitrary state assignment • outputs must be decoded from the state bits • combinatorial decode • registered decode Specific state assignment • outputs may be encoded within the state bits • one-hot encoding ©1997 Cypress Semiconductor, rev 2.5.3 84 VHDL Training Moore state machine implementations (1) Outputs decoded from state bits Combinatorial decode • Outputs are decoded combinatorially from the current state • outputscomb = f(present state) Inputs ©1997 Cypress Semiconductor, rev 2.5.3 Logic State Registers 85 Output Logic Outputs VHDL Training Moore state machine implementations (2) Outputs decoded from state bits Registered decode • Outputs are registered; decode of outputs is in parallel with decode of next state • outputsreg = f(previous state, inputs) Inputs Next State Logic Current State State Registers Output Logic ©1997 Cypress Semiconductor, rev 2.5.3 86 Output Outputs Registers VHDL Training Moore State Machine Implementations (3) Outputs encoded within state bits Example: State Output 1 Output 2 State Encoding s1 0 0 00 s2 1 0 01 s3 0 1 10 Note: Both bits of the state encoding are used as outputs Inputs ©1997 Cypress Semiconductor, rev 2.5.3 State Registers Logic 87 Outputs VHDL Training Example: A wait state generator State diagram: PWAIT ack_out='1' RESET (async) IDLE REQ RETRY 00 PWAIT 01 REQ retry_out='1' ©1997 Cypress Semiconductor, rev 2.5.3 88 ACK 10 VHDL Training Example: The entity declaration The entity declaration remains essentially the same for each implementation (except for the entity name) e.g., LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY moore1 IS PORT ( clock, reset: IN std_logic; req, pwait: IN std_logic; retry_out, ack_out: OUT std_logic); END moore1; ©1997 Cypress Semiconductor, rev 2.5.3 89 VHDL Training Example: Solution 1 Combinatorial outputs decoded from the state bits ARCHITECTURE archmoore1 OF moore1 IS TYPE fsm_states IS (idle, retry, ack); SIGNAL wait_gen : fsm_states; BEGIN fsm: PROCESS (clock, reset) BEGIN IF reset = '1' THEN wait_gen <= idle; -- asynchronous reset ELSIF clock'EVENT AND clock = '1' THEN CASE wait_gen IS WHEN idle => IF req = '0' THEN wait_gen <= retry; ELSE wait_gen <= idle; END IF; WHEN retry => IF pwait='1' THEN wait_gen <= ack; ELSE wait_gen <= retry; END IF; ©1997 Cypress Semiconductor, rev 2.5.3 90 VHDL Training Example: Solution 1 (contd.) WHEN ack => wait_gen <= idle; WHEN OTHERS => wait_gen <= idle; END CASE; END IF; END PROCESS fsm; retry_out <= '1' WHEN (wait_gen = retry) ELSE '0'; ack_out <= '1' WHEN (wait_gen = ack) ELSE '0'; END archmoore1; ©1997 Cypress Semiconductor, rev 2.5.3 91 VHDL Training Example: Solution 2 Registered outputs decoded from the state bits ARCHITECTURE archmoore2 OF moore2 IS TYPE fsm_states IS (idle, retry, ack); SIGNAL wait_gen: fsm_states; BEGIN fsm: PROCESS (clock, reset) BEGIN IF reset = '1' THEN wait_gen <= idle; retry_out <= '0'; ack_out <= '0'; ELSIF clock'EVENT AND clock = '1' THEN retry_out <= '0'; -- a default assignment, could do ack_out too CASE wait_gen IS WHEN idle => IF req = '0' THEN wait_gen <= retry; retry_out <= '1'; ack_out <= '0'; ELSE wait_gen <= idle; ack_out <= '0'; END IF; ©1997 Cypress Semiconductor, rev 2.5.3 92 VHDL Training Example: Solution 2 (contd.) WHEN retry => IF pwait = '1' THEN wait_gen <= ack; ack_out <= '1'; ELSE wait_gen <= retry; retry_out <= '1'; ack_out <= '0'; END IF; WHEN ack => wait_gen <= idle; ack_out <= '0'; WHEN OTHERS => wait_gen <= idle; ack_out <= '0'; --END CASE; -END IF; -END PROCESS fsm; -END archmoore2; -- ©1997 Cypress Semiconductor, rev 2.5.3 93 note must define what happens to ‘ack_out’ here or a latch will be synthesized to preserve it’s current state VHDL Training Example: Solution 3 Outputs encoded within the state bits ARCHITECTURE archmoore3 OF moore3 IS SIGNAL wait_gen: std_logic_vector(1 DOWNTO 0); CONSTANT idle: std_logic_vector(1 DOWNTO 0) := CONSTANT retry: std_logic_vector(1 DOWNTO 0) := CONSTANT ack: std_logic_vector(1 DOWNTO 0) := BEGIN fsm: PROCESS (clock, reset) BEGIN IF reset = '1' THEN wait_gen <= idle; ELSIF clock'EVENT AND clock = '1' THEN CASE wait_gen IS WHEN idle => IF req = '0' THEN wait_gen <= ELSE wait_gen <= END IF; ©1997 Cypress Semiconductor, rev 2.5.3 94 "00"; "01"; "10"; retry; idle; VHDL Training Example: Solution 3 (contd.) WHEN retry => IF pwait = '1' THEN wait_gen <= ack; ELSE wait_gen <= retry; END IF; WHEN ack => wait_gen <= idle; WHEN OTHERS => wait_gen <= idle; END CASE; END IF; END PROCESS fsm; retry_out <= wait_gen(0); ack_out <= wait_gen(1); END archmoore3; ©1997 Cypress Semiconductor, rev 2.5.3 95 VHDL Training State Machines: One-hot Encoding One state per flip-flop in FPGA-type architectures • reduces the next state logic • requires fewer levels of logic cells • enables high-speed state machines (> 100MHz) in CPLDs • reduces the number of product terms • can eliminate ‘expander’ product terms (i.e. reduce delays, and increase operating speed) • but, uses more macrocells ©1997 Cypress Semiconductor, rev 2.5.3 96 VHDL Training Example: One-hot-one Solution ARCHITECTURE archmoore4 OF moore4 IS TYPE fsm_states IS (idle, retry, ack); ATTRIBUTE state_encoding OF fsm_states:TYPE IS one_hot_one; SIGNAL wait_gen: fsm_states; BEGIN fsm: PROCESS (clock, reset) BEGIN IF reset = '1' THEN wait_gen <= idle; ELSIF clock'EVENT AND clock = '1' THEN CASE wait_gen IS WHEN idle => IF req = '0' THEN wait_gen <= retry; ELSE wait_gen <= idle; END IF; ©1997 Cypress Semiconductor, rev 2.5.3 97 VHDL Training Example: One-hot-one Solution (contd.) WHEN retry => IF pwait = '1' THEN wait_gen <= ack; ELSE wait_gen <= retry; END IF; WHEN ack => wait_gen <= idle; WHEN OTHERS => wait_gen <= idle; END CASE; END IF; END PROCESS fsm; -- Assign state outputs retry_out <= '1' WHEN (wait_gen = retry) ELSE '0'; ack_out <= '1' WHEN (wait_gen = ack) ELSE '0'; END archmoore4; ©1997 Cypress Semiconductor, rev 2.5.3 98 VHDL Training Moore Machines: Summary Outputs decoded from the state bits • flexibility during the design process • using enumerated types allows automatic state assignment during compilation Outputs encoded within the state bits • manual state assignment using constants • the state registers and the outputs are merged • reduces the number of registers • but, may require more product terms One-Hot encoding • reduces next state decode logic • high speed operation • but, uses more registers ©1997 Cypress Semiconductor, rev 2.5.3 99 VHDL Training Mealy Machines Outputs may change with a change of state OR with a change of inputs Mealy outputs are non-registered because they are functions of the present inputs State Registers Inputs Outputs Logic ©1997 Cypress Semiconductor, rev 2.5.3 100 VHDL Training Example: The Wait State Generator State diagram: PWAIT RESET (async) IDLE REQ 0 1 REQ PWAIT ©1997 Cypress Semiconductor, rev 2.5.3 RETRY 101 RETRY_OUT='1' if, ENABLE='0' VHDL Training Example: Mealy Machine Solution ARCHITECTURE archmealy1 OF mealy1 IS TYPE fsm_states IS (idle, retry); SIGNAL wait_gen: fsm_states; BEGIN fsm: PROCESS (clock, reset) BEGIN IF reset = '1' THEN wait_gen <= idle; ELSIF clock'EVENT AND clock = '1' THEN CASE wait_gen IS WHEN idle => IF req = '0' THEN wait_gen <= retry; ELSE wait_gen <= idle; END IF; WHEN retry => IF pwait = '1' THEN wait_gen <= idle; ELSE wait_gen <= retry; END IF; WHEN OTHERS => wait_gen <= idle; END CASE; END IF; END PROCESS fsm; retry_out <= '1' WHEN (wait_gen = retry AND enable='0') ELSE '0'; END archmealy1; ©1997 Cypress Semiconductor, rev 2.5.3 102 VHDL Training Exercise #5 Design a state machine to implement the function shown below: RESET POS hold POS RESET ©1997 Cypress Semiconductor, rev 2.5.3 sample extend clear='0' track='1' track='1' if, busy='0' 103 VHDL Training Exercise #5: Solution LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY ex5 IS PORT ( clock, pos, busy, reset: IN std_logic; clear, track: OUT std_logic); END ex5; ARCHITECTURE archex5 OF ex5 IS TYPE states IS (hold, sample, extend); ATTRIBUTE state_encoding OF states:TYPE IS one_hot_one; SIGNAL fsm: states; BEGIN clear <= '0' WHEN fsm = sample ELSE '1'; track <= '1' WHEN (fsm = sample) OR (fsm = extend AND busy = '0') ELSE '0'; ©1997 Cypress Semiconductor, rev 2.5.3 104 VHDL Training Exercise #5: Solution (contd.) sync: PROCESS (clock) BEGIN IF clock'EVENT AND clock = '1' THEN IF reset = '1' THEN fsm <= hold; -- synchronous reset ELSE CASE fsm IS WHEN hold => IF pos = '0' THEN fsm <= sample; ELSE fsm <= hold; END IF; WHEN sample => fsm <= extend; WHEN extend => fsm <= hold; WHEN OTHERS => fsm <= hold; END CASE; END IF; -- reset = '1' END IF; -- clk'EVENT AND clk = '1' END PROCESS sync; END archex5; ©1997 Cypress Semiconductor, rev 2.5.3 105 VHDL Training Hierarchical design methodology Advantages: Allows the re-use of common building blocks Components (VHDL models or schematic symbols) can be created, tested and held for later use Smaller components can be more easily integrated with other blocks Designs are more readable Designs are more portable The design task can be split among several members of a team ©1997 Cypress Semiconductor, rev 2.5.3 106 VHDL Training Hierarchy decomposition A VHDL hierarchy is composed of COMPONENTs • declarations of VHDL models which can be instantiated (placed) within other models PACKAGEs • a collection of one or more COMPONENT (and other) declarations ©1997 Cypress Semiconductor, rev 2.5.3 107 VHDL Training Packages and hierarchical designs Packages contain components, types, and/or subtypes which can be used in other designs Components are entity/architecture pairs with component declarations Designs that make use of components or types in packages must include a USE clause, e.g., USE WORK.my_package.ALL; The above allows the VHDL code to instantiate all components/types in my_package USE WORK.my_package.cnt4; The above allows the VHDL code to instantiate only the cnt4 components in my_package ©1997 Cypress Semiconductor, rev 2.5.3 108 VHDL Training Packages: How it all fits together mux2to1 p q a c a i r b c t b sel s sel • • schematic entity/architecture toplevel mux2to1 • • mux2to1 a • • c b sel ©1997 Cypress Semiconductor, rev 2.5.3 • • symbol component 109 library package schematic entity/architecture VHDL Training Package declaration: Example LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY mux2to1 IS PORT ( a, b, sel: IN std_logic; c: OUT std_logic); END mux2to1; -- port list ARCHITECTURE archmux2to1 OF mux2to1 IS BEGIN c <= (a AND NOT sel) OR (b AND sel); END archmux2to1; LIBRARY ieee; -- note repeated LIBRARY USE ieee.std_logic_1164.ALL; -- and USE statements PACKAGE mymuxpkg IS COMPONENT mux2to1 PORT ( a, b, sel: IN std_logic; -- identical port list c: OUT std_logic); END COMPONENT; END mymuxpkg; ©1997 Cypress Semiconductor, rev 2.5.3 110 VHDL Training Hierarchical design: Example Signals are connected via a PORT MAP that associates signals with the component's I/O Port map association can be either explicit (named) or implicit (positional) LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY toplevel IS PORT (s: IN std_logic; p, q, r: IN std_logic_vector(2 DOWNTO 0); t: OUT std_logic_vector(2 DOWNTO 0)); END toplevel; USE WORK.mymuxpkg.ALL; ARCHITECTURE archtoplevel OF toplevel IS Named Association SIGNAL i: std_logic_vector(2 DOWNTO 0); BEGIN m0: mux2to1 PORT MAP (a=>i(2), b=>r(0), sel=>s, c=>t(0)); m1: mux2to1 PORT MAP (c=>t(1), b=>r(1), a=>i(1), sel=>s); m2: mux2to1 PORT MAP (i(0), r(2), s, t(2)); i <= p AND NOT q; Positional Association END archtoplevel; ©1997 Cypress Semiconductor, rev 2.5.3 111 VHDL Training Exercise #6: The Design OE 8 DECODER 8 DATA MUX 8 MUX 8 8 LOAD ENABLE 4 (LSB) UPCNT 4 (MSB) CLOCK DECODER 8 RESET TEST ©1997 Cypress Semiconductor, rev 2.5.3 112 VHDL Training Exercise #6 Write a hierarchical VHDL description of the previous schematic which instantiates all of the components shown in the design entity/architecture given for top-level design package/entity/architecture given for decoder entity/architecture given for counter, write package The target device is a CY7C371I-143JC Compile and synthesize your design using Warp ©1997 Cypress Semiconductor, rev 2.5.3 113 VHDL Training Exercise #6: dcodepkg.vhd Analogous to mymuxpkg A entity/architecture for a 7-segment display decoder is provided in the file - ’decoder.vhd’ A package declaration is also provided in the file ‘dcodepkg.vhd’, e.g.: LIBRARY ieee; USE ieee.std_logic_1164.ALL; PACKAGE dcodepkg IS COMPONENT decoder PORT( digit: IN std_logic_vector(3 DOWNTO 0); leds: OUT std_logic_vector(7 DOWNTO 0)); END COMPONENT; END dcodepkg; ©1997 Cypress Semiconductor, rev 2.5.3 114 VHDL Training Exercise #6: upcnt.vhd Analogous to mux2to1 and archmux2to1 An entity/architecture pair for an 8-bit loadable counter is provided in the file - ‘upcnt.vhd’ In a separate file create a package declaration for the counter based on the entity in upcnt.vhd: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY upcnt IS PORT ( clock, load, reset, enable: IN std_logic; data: IN std_logic_vector(7 DOWNTO 0); count: OUT std_logic_vector(7 DOWNTO 0)); END upcnt; ©1997 Cypress Semiconductor, rev 2.5.3 115 VHDL Training Exercise #6 top level: - ex6.vhd LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY ex6 IS PORT( clock, load, enable, test, oe, reset: IN std_logic; data: IN std_logic_vector(7 DOWNTO 0); seg7hi, seg7lo: OUT std_logic_vector(7 DOWNTO 0)); END ex6; USE WORK.upcntpkg.ALL; USE WORK.dcodepkg.ALL; ARCHITECTURE archex6 OF ex6 IS SIGNAL hicode, locode, count: std_logic_vector(7 DOWNTO 0); BEGIN c1: upcnt PORT MAP (clock, load, reset, enable, data, count); d1: decoder PORT MAP (count(7 DOWNTO 4), hicode); d2: decoder PORT MAP (count(3 DOWNTO 0), locode); seg7hi <= "ZZZZZZZZ" WHEN oe = '0' ELSE hicode WHEN test = '0' ELSE data; seg7lo <= (OTHERS => 'Z') WHEN oe = '0' ELSE locode WHEN test = '0' ELSE data; END archex6; ©1997 Cypress Semiconductor, rev 2.5.3 116 VHDL Training Exercise #6: Instructions Write package for the upcounter Add all of the necessary files to the input list, the top-level file (ex6.vhd) should be last Click-on the Device button to select the target device Highlight the top-level file and Click-on the Set top button in the Compiler options Except for the file containing the top-level, highlight each file in turn and Click-on Selected in the Compile box Finally, highlight and then compile the top-level file to synthesize the design. Smart will compile only files that have been updated since the last compile. ©1997 Cypress Semiconductor, rev 2.5.3 117 VHDL Training Exercise #6: Solution upcntpkg.vhd LIBRARY ieee; USE ieee.std_logic_1164.ALL; PACKAGE upcntpkg IS COMPONENT upcnt PORT( clock, load, reset, enable: IN std_logic; data: IN std_logic_vector(7 DOWNTO 0); count: OUT std_logic_vector(7 DOWNTO 0)); END COMPONENT; END upcntpkg; ©1997 Cypress Semiconductor, rev 2.5.3 118 VHDL Training Creating repetitive structures e.g., a 32-bit serial to parallel converter: reset si q(31) q(30) q(29) ••• q(1) q(0) po(1) po(0) clock po(31) ©1997 Cypress Semiconductor, rev 2.5.3 po(30) po(29) 119 VHDL Training The GENERATE statement Used to specify repetitive or conditional execution of a set of concurrent statements Useful for instantiating arrays of components ENTITY sipo IS PORT ( clk, reset: IN std_logic; si: IN std_logic; po: BUFFER std_logic_vector(31 DOWNTO 0)); END sipo; USE WORK.rtlpkg.ALL; -- User-defined package containing dsrff ARCHITECTURE archsipo OF sipo IS BEGIN gen: FOR i IN 0 TO 30 GENERATE nxt: dsrff PORT MAP (po(i+1), zero, reset, clk, po(i)); END GENERATE; beg: dsrff PORT MAP (si, zero, reset, clk, po(31)); END archsipo; ©1997 Cypress Semiconductor, rev 2.5.3 120 VHDL Training Multiplexing I/O pins: LIBRARY ieee ; USE ieee.std_logic_1164.ALL; USE WORK.std_arith.all ; ENTITY ldcnt IS PORT ( clk, ld, oe: IN std_logic; count: INOUT std_logic_vector(7 DOWNTO 0)); END ldcnt; ARCHITECTURE archldcnt OF ldcnt IS SIGNAL int_count: std_logic_vector(7 DOWNTO 0); BEGIN cnt: PROCESS (clk) BEGIN IF clk’EVENT AND clk = '1' THEN IF ld = '1' THEN int_count <= count; -- count as "IN" ELSE int_count <= int_count + 1; END IF; END IF; END PROCESS cnt ; outen: PROCESS (oe, int_count) BEGIN IF oe = '1' THEN count <= int_count ; -- count as "OUT" ELSE count <= (OTHERS => 'Z') ; -- count as "OUT" END IF ; -- equivalent to count <= "ZZZZZZZZ" END PROCESS outen; END archldcnt; ©1997 Cypress Semiconductor, rev 2.5.3 121 VHDL Training Exercise #7 Design a Moore Machine to implement the Output Enable Controller shown below: 68040 DRAM BANK A DRAM BANK C Output Enable Controller ©1997 Cypress Semiconductor, rev 2.5.3 122 DRAM BANK B DRAM BANK D DRAM Controller VHDL Training Exercise #7: The FSM chart Use the following FSM chart: RESET RAM IDLE OE=1111 /RAM CHOOSE OE=1111 /EOC /A3 AND /A2 BANK A /A3 AND A2 EOC OE=1110 BANK B OE=1101 A3 AND /A2 EOC A3 AND A2 BANK C EOC OE=1011 OE=0111 EOC ©1997 Cypress Semiconductor, rev 2.5.3 123 BANK D VHDL Training Exercise #7: Solution ENTITY ex7 IS PORT ( clk, reset: IN std_logic; ram, eoc: IN std_logic; a3a2 : IN std_logic_vector(1 DOWNTO 0) ; oe : OUT std_logic_vector(3 DOWNTO 0)); END ex7; ARCHITECTURE archex7 OF ex7 IS TYPE oe_states IS (idle, choose, banka, bankb, bankc, bankd); ATTRIBUTE state_encoding OF oe_states : TYPE IS gray ; SIGNAL present_state, next_state : oe_states ; SIGNAL oe_out : std_logic_vector(3 DOWNTO 0) ; BEGIN ©1997 Cypress Semiconductor, rev 2.5.3 124 VHDL Training Exercise #7: Solution (contd.) fsm: PROCESS (clk) BEGIN IF clk'EVENT AND clk = '1' THEN IF reset = '1' THEN next_state <= idle; ELSE CASE present_state IS WHEN idle => IF ram = '0' THEN next_state <= choose ; ELSE next_state <= idle ; END IF ; WHEN choose => CASE a3a2 IS WHEN "00" => next_state <= banka ; WHEN "01" => next_state <= bankb ; WHEN "10" => next_state <= bankc ; WHEN "11" => next_state <= bankd ; WHEN OTHERS => next_state <= banka ; END CASE ; WHEN banka => IF eoc = '1' THEN next_state <= bankb ; ELSE next_state <= idle ; END IF ; ©1997 Cypress Semiconductor, rev 2.5.3 125 VHDL Training Exercise #7: Solution (contd.) WHEN bankb => IF eoc = '1' THEN next_state <= bankc ; ELSE next_state <= idle ; END IF ; WHEN bankc => IF eoc = '1' THEN next_state <= bankd ; ELSE next_state <= idle ; END IF ; WHEN bankd => IF eoc = '1' THEN next_state <= banka ; ELSE next_state <= idle ; END IF ; WHEN OTHERS => next_state <= idle; END CASE; END IF ; END IF; END PROCESS fsm; ©1997 Cypress Semiconductor, rev 2.5.3 126 VHDL Training Exercise #7: Solution (contd). output_logic: PROCESS (next_state) BEGIN CASE next_state IS WHEN idle => oe_out <= "1111" ; WHEN choose => oe_out <= "1111" ; WHEN banka => oe_out <= "1110" ; WHEN bankb => oe_out <= "1101" ; WHEN bankc => oe_out <= "1011" ; WHEN bankd => oe_out <= "0111" ; WHEN OTHERS => oe_out <= "1111" ; END CASE; END PROCESS output_logic ; advance_state: PROCESS (clk) BEGIN IF clk'EVENT AND clk = '1' THEN present_state <= next_state ; oe <= oe_out ; END IF; END PROCESS ; END archex7; ©1997 Cypress Semiconductor, rev 2.5.3 127 VHDL Training VHDL User-defined Attributes VHDL construct which is used to provide information about VHDL objects such as entities, architectures, types, and signals. user-defined attributes are used as synthesis directives to the compiler. These include: • state_encoding • enum_encoding • pin_numbers • synthesis_off ©1997 Cypress Semiconductor, rev 2.5.3 128 VHDL Training The state_encoding attribute This is used to specify the state encoding scheme of the FSMs in a VHDL file. The default scheme for CPLDs is sequential. Other schemes such as one_hot_zero and gray encodings are available. TYPE state_type IS (idle,state1,state2,state3); ATTRIBUTE state_encoding OF state_type: TYPE IS sequential; ©1997 Cypress Semiconductor, rev 2.5.3 129 VHDL Training The enum_encoding Attribute Used to specify the exact internal encoding to be use for each value of a user-defined enumerated type. Overrides state_encoding in same description. TYPE states IS (idle,state1,state2,state3); ATTRIBUTE enum_encoding OF states: TYPE IS "11 01 00 10"; ©1997 Cypress Semiconductor, rev 2.5.3 130 VHDL Training The pin_numbers attribute Used to map the external signals of an entity to the pins on the target device Allows the back-annotation of pin placements after synthesis, e.g., LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY counter IS PORT ( clock, reset: IN std_logic; count: OUT std_logic_vector(3 DOWNTO 0) ); ATTRIBUTE pin_numbers OF counter:ENTITY IS "clock:13 reset:2" & " count(3):3 count(2):4 count(1):5 count(0):6"; END counter; ©1997 Cypress Semiconductor, rev 2.5.3 131 VHDL Training The synthesis_off attribute Controls the flattening and factoring of signals Makes the signal a factoring point Useful when a signal with a large number of product terms is used in other equations Helpful in cases where substitution causes unacceptable compile time (due to exponentially increasing CPU and memory requirements) Achieves more efficient implementation Should only be used on combinatorial equations Registered equations are natural factoring points ©1997 Cypress Semiconductor, rev 2.5.3 132 VHDL Training synthesis_off: CPLD Example An 8-bit comparator controlling a 4-bit, 2-to-1 multiplexer c(7 DOWNTO 0) d(7 DOWNTO 0) 8-bit compare a(3 DOWNTO 0) mux b(3 DOWNTO 0) ©1997 Cypress Semiconductor, rev 2.5.3 133 x(3 DOWNTO 0) VHDL Training Without synthesis_off An implementation (without synthesis_off) LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY mux IS PORT ( a, b: IN std_logic_vector(3 DOWNTO 0); c, d: IN std_logic_vector(7 DOWNTO 0); x: OUT std_logic_vector(3 DOWNTO 0)); END mux; ARCHITECTURE archmux OF mux IS BEGIN x <= a WHEN (c = d) ELSE b; END archmux; Resources used: 1092 product terms, 68 sum splits, 72 macrocells - the comparison is not done on a bit by bit basis ©1997 Cypress Semiconductor, rev 2.5.3 134 VHDL Training Comparison: with a 4-bit vector S_2 b + b S_1 = * c_0 * /d_0 + b * /c_3 * d_3 + b * c_3 * /d_3 + b * /c_2 * d_2 * c_2 * /d_2 + b * /c_1 * d_1 + b * c_1 * /d_1 + b * /c_0 * d_0 = a * c_3 * c_2 * c_1 * /c_0 * d_3 * d_2 * d_1 * /d_0 + a * /c_3 * c_2 * c_1 * /c_0 * /d_3 * d_2 * d_1 * /d_0 + a * c_3 * /c_2 * c_1 * /c_0 * d_3 * /d_2 * d_1 * /d_0 + a * /c_3 * /c_2 * c_1 * /c_0 * /d_3 * /d_2 * d_1 * /d_0 + a * c_3 * c_2 * /c_1 * /c_0 * d_3 * d_2 * /d_1 * /d_0 + a * /c_3 * c_2 * /c_1 * /c_0 * /d_3 * d_2 * /d_1 * /d_0 + a * c_3 * /c_2 * /c_1 * /c_0 * d_3 * /d_2 * /d_1 * /d_0 + a * /c_3 * /c_2 * /c_1 * /c_0 * /d_3 * /d_2 * /d_1 * /d_0 + a * c_3 * c_2 * c_1 * c_0 * d_3 * d_2 * d_1 * d_0 + a * /c_3 * c_2 * c_1 * c_0 * /d_3 * d_2 * d_1 * d_0 + a * c_3 * /c_2 * c_1 * c_0 * d_3 * /d_2 * d_1 * d_0 + a * /c_3 * /c_2 * c_1 * c_0 * /d_3 * /d_2 * d_1 * d_0 + a * c_3 * c_2 * /c_1 * c_0 * d_3 * d_2 * /d_1 * d_0 + a * /c_3 * c_2 * /c_1 * c_0 * /d_3 * d_2 * /d_1 * d_0 + a * c_3 * /c_2 * /c_1 * c_0 * d_3 * /d_2 * /d_1 * d_0 + a * /c_3 * /c_2 * /c_1 * c_0 * /d_3 * /d_2 * /d_1 * d_0 /x0 = /S_1.CMB * /S_2.CMB ©1997 Cypress Semiconductor, rev 2.5.3 135 VHDL Training With synthesis_off A better implementation (with synthesis_off) LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY mux IS PORT ( a, b: IN std_logic_vector(3 DOWNTO 0); c, d: IN std_logic_vector(7 DOWNTO 0); x: OUT std_logic_vector(3 DOWNTO 0)); END mux; ARCHITECTURE archmux OF mux SIGNAL sel: std_logic; ATTRIBUTE synthesis_off BEGIN sel <= '1' WHEN (c = d) x <= a WHEN (sel = '1') END archmux; IS OF sel:SIGNAL is TRUE; ELSE '0'; ELSE b; Resources used: 24 product terms, 1 partial result, 5 macrocells ©1997 Cypress Semiconductor, rev 2.5.3 136 VHDL Training Results with synthesis_off DESIGN EQUATIONS x_3 = b_3 * /sel.CMB + a_3 * sel.CMB x_2 = /sel.CMB * b_2 + sel.CMB * a_2 x_1 = /sel.CMB * b_1 + sel.CMB * a_1 x_0 = /sel.CMB * b_0 + sel.CMB * a_0 /sel = + + + c_0 c_2 c_4 c_6 ©1997 Cypress Semiconductor, rev 2.5.3 * * * * /d_0 /d_2 /d_4 /d_6 + + + + /c_0 /c_2 /c_4 /c_6 * * * * 137 d_0 d_2 d_4 d_6 + + + + c_1 c_3 c_5 c_7 * * * * /d_1 /d_3 /d_5 /d_7 + + + + /c_1 /c_3 /c_5 /c_7 * * * * d_1 d_3 d_5 d_7 VHDL Training Third Party Tool Support CAE Bolt-in Tools - Viewlogic Workview Plus/Powerview/WorkView Office (Q1) - Mentor (CY3144), Cadence (Q3) Synthesis Tools - Synopsys (Q2), Exemplar PLD Development Tools - Data I/O Abel 4/5/6 and Synario, MINC, CUPL, LOG/iC, OrCAD PLD Simulation Tools - LMG SmartModels - All VHDL and Verilog Simulators (with timing) ©1997 Cypress Semiconductor, rev 2.5.3 138