Digital Design Chapter 9: Hardware Description Languages Slides to accompany the textbook Digital Design, First Edition, by Frank Vahid, John Wiley and Sons Publishers, 2007. http://www.ddvahid.com Copyright © 2007 Frank Vahid Instructors of courses requiring Vahid's Digital Design textbook (published by John Wiley and Sons) have permission to modify and use these slides for customary course-related activities, subject to keeping this copyright notice in place and unmodified. These slides may be posted as unanimated pdf versions on publicly-accessible course websites.. PowerPoint source (or pdf Digital Design with animations) may not be posted to publicly-accessible websites, but may be posted for students on internal protected sites or distributed directly to students by other electronic means. Copyright © 2006 1 Instructors may make printouts of the slides available to students for a reasonable photocopying charge, without incurring royalties. Any other use requires explicit permission. Instructors Franksource Vahidor obtain special use permissions from Wiley – see http://www.ddvahid.com for information. may obtain PowerPoint 9.1 Introduction DoorOpener • A drawing of a circuit, or schematic, contains graphical information about a design c – Inverter is above the OR gate, AND gate is to the right, etc. • Such graphical information may not be useful for large designs • Can use textual language instead Digital Design Copyright © 2006 Frank Vahid f h p si a tap a rtn o co t g 2 Note: Slides with animation are denoted with a small red "a" near the animated items Textual Language – English • Can describe circuit using English text rather than using a drawing – Of course, English isn't a good language for a computer to read – Need a more precise, computer-oriented language (a) (b) DoorOpener Inv_1 c h f n1 p n2 OR2_1 AND2_1 Digital Design Copyright © 2006 Frank Vahid We'll now describe a circuit whose name isDoorOpener. The external inputs are c, h and p, which are bits. The external output isf, which is a bit. We assume you know the behavior of these components: An inverter, which has a bit input x, and bit output F. A 2-input ORgate, which has inputs x and y, and bit output F. A 2-input AND gate, which has bit inputs x and y, and bit output F. The circuit has internal wires n1 and n2, both bits. The DoorOpener circuit internally consists of: An inverter named Inv_1, whose input x connectsto external input c, and whose output connectsto n1. A 2-input ORgate named OR2_1, whose inputsconnect to external inputs h and p, and whose output connectsto n2. A 2-input AND gate named AND2_1, whose inputsconnect to n1 and n2, and whose output connectsto external output f. That's all. 3 Computer-Readable Textual Language for Describing Hardware Circuits: HDLs • Hardware description language (HDL) – Intended to describe circuits textually, for a computer to read – Evolved starting in the 1970s and 1980s • Popular languages today include: – VHDL –Defined in 1980s by U.S. military; Ada-like language – Verilog –Defined in 1980s by a company; C-like language – SystemC –Defined in 2000s by several companies; consists of libraries in C++ Digital Design Copyright © 2006 Frank Vahid 4 Combinational Logic Description using Hardware Description Languages • Structure 9.2 DoorOpener – Another word for "circuit" – An interconnection of components – Key use of HDLs is to describe structure c f h p a tap a si Note: The term "instantiate" will be used to indicate adding rtn a new o co copy of a component to a circuit t The OR component Three instances of the OR component g OR_2 OR_1 OR_3 Digital Design Copyright © 2006 Frank Vahid 5 Describing Structure in VHDL • Entity – Defines new item's name & ports (inputs/outputs) – std_logic means bit type, defined in ieee library • Architecture – Describes internals, which we named "Circuit" – – Declares 3 previouslydefined components Declares internal signals • – Note "--" comment Instantiates and connects those components Digital Design Copyright © 2006 Frank Vahid DoorOpener Inv_1 c h f n1 p n2 AND2_1 OR2_1 (a) We'll now describe a circuit whose name is DoorOpener. The external inputs are c, h and p, which are bits. The external output is f, which is a bit. We assume you know the behavior of these components: An inverter, which has a bit input x, and bit output F. A 2-input OR gate, which has inputs x and y, and bit output F. A 2-input AND gate, which has bit inputs x and y, and bit output F. The circuit has internal wires n1 and n2, both bits. The DoorOpener circuit internally consists of: An inverter named Inv_1, whose input x connects to external input c, and whose output connects to n1. A 2-input OR gate named OR2_1, whose inputs connect to external inputs h and p, and whose output connects to n2. A 2-input AND gate named AND2_1, whose inputs connect to n1 and n2, and whose output connects to external output f. That's all. (b) l i br a r y i e e e ; us e i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; e n t i t y Do o r Op e n e r i s por t ( c , h , p : i n s t d _ l o g i c ; f : out s t d _ l o g i c ); e n d Do o r Op e n e r ; a r c h i t e c t u r e Ci r c u i t o f Do o r Op e n e r i s c o mp o n e n t I n v por t ( x : i n s t d _ l o g i c ; F: out s t d _ l o g i c ) ; e n d c o mp o n e n t ; c o mp o n e n t OR2 por t ( x , y : i n s t d _ l o g i c ; F: out s t d _ l o g i c ) ; e n d c o mp o n e n t ; c o mp o n e n t AND2 por t ( x , y : i n s t d _ l o g i c ; F: out s t d _ l o g i c ) ; e n d c o mp o n e n t ; s i g n a l n 1 , n 2 : s t d _ l o g i c ; - - i n t e r n a l wi r e s be gi n I n v _ 1 : I n v p o r t ma p ( x = > c , F = > n 1 ) ; OR2 _ 1 : OR2 p o r t ma p ( x = > h , y = > p , F = > n 2 ) ; AND2 _ 1 : AND2 p o r t ma p ( x = > n 1 , y = > n 2 , F = > f ) ; e n d Ci r c u i t ; (c) 6 Describing Structure in Verilog • Modules defined for Inv, OR2, and AND2 (details omitted) – Note "//" comment • Module defined for DoorOpener – Lists inputs and outputs – Declares internal wires – Instantiates and connects three components Digital Design Copyright © 2006 Frank Vahid DoorOpener Inv_1 c h f n1 p n2 AND2_1 OR2_1 (a) We'll now describe a circuit whose name is DoorOpener. The external inputs are c, h and p, which are bits. The external output is f, which is a bit. We assume you know the behavior of these components: An inverter, which has a bit input x, and bit output F. A 2-input OR gate, which has inputs x and y, and bit output F. A 2-input AND gate, which has bit inputs x and y, and bit output F. The circuit has internal wires n1 and n2, both bits. The DoorOpener circuit internally consists of: An inverter named Inv_1, whose input x connects to external input c, and whose output connects to n1. A 2-input OR gate named OR2_1, whose inputs connect to external inputs h and p, and whose output connects to n2. A 2-input AND gate named AND2_1, whose inputs connect to n1 and n2, and whose output connects to external output f. That's all. (b) mo d u l e I n v ( x , i nput x ; out put F; / / det ai l s e n d mo d u l e mo d u l e OR2 ( x , i nput x , y ; out put F; / / det ai l s e n d mo d u l e mo d u l e AND2 ( x , i nput x , y ; out put F; / / det ai l s e n d mo d u l e F) ; not y, not y, not s h o wn F) ; s h o wn F) ; s h o wn mo d u l e Do o r Op e n e r ( c , h , p , i nput c , h , p ; out put f ; wi r e n 1 , n 2 ; I nv I nv_1( c, n1) ; OR2 OR2 _ 1 ( h , p , n 2 ) ; AND2 AND2 _ 1 ( n 1 , n 2 , f ) ; e n d mo d u l e f ) ; (c) 7 Describing Structure in SystemC • Module defined – Declares inputs and outputs – Declares internal wires • Note "//" comment – Declares three previously-defined components – Constructor function "CTOR" • Instantiates components • Connects components Digital Design Copyright © 2006 Frank Vahid DoorOpener Inv_1 c h f n1 p n2 AND2_1 OR2_1 #i #i #i #i nc l nc l nc l nc l ude ude ude ude " " " " s y s t e mc . h " i nv. h" or 2. h" and2. h" (a) We'll now describe a circuit whose name is DoorOpener. The external inputs are c, h and p, which are bits. The external output is f, which is a bit. We assume you know the behavior of these components: An inverter, which has a bit input x, and bit output F. A 2-input OR gate, which has inputs x and y, and bit output F. A 2-input AND gate, which has bit inputs x and y, and bit output F. The circuit has internal wires n1 and n2, both bits. The DoorOpener circuit internally consists of: An inverter named Inv_1, whose input x connects to external input c, and whose output connects to n1. A 2-input OR gate named OR2_1, whose inputs connect to external inputs h and p, and whose output connects to n2. A 2-input AND gate named AND2_1, whose inputs connect to n1 and n2, and whose output connects to external output f. That's all. (b) SC_ MODUL E ( Do o r Op e n e r ) { s c _ i n<s c _ l ogi c > c , h , p ; s c _ out <s c _ l ogi c > f ; / / i n t e r n a l wi r e s s c _ s i gna l <s c _ l ogi c > n 1 , n 2 ; / / c o mp o n e n t d e c l a r a t i o n s I nv I nv1; OR2 OR2 _ 1 ; AND AND2 _ 1 ; / / c o mp o n e n t i n s t a n t i a t i o n s SC_ CT OR( Do o r Op e n e r ) : I n v _ 1 ( " I n v _ 1 " ) , OR2 _ 1 ( " OR2 _ 1 " ) , AND2 _ 1 ( " AND2 _ 1 " ) { I nv_1. x( c) ; I n v _ 1 . F( n 1 ) ; OR2 _ 1 . x ( h ) ; OR2 _ 1 . y ( p ) ; OR2 _ 1 . F ( n 2 ) ; AND2 _ 1 . x ( n 1 ) ; AND2 _ 1 . y ( n 2 ) ; AND2 _ 1 . F ( f ) ; } } ; (c) 8 Combinational Behavior • Combinational behavior – Description of desired behavior of combinational circuit without creating circuit itself – e.g., F = c' * (h + p) can be described as equation rather than circuit – HDLs support description of combinational behavior Digital Design Copyright © 2006 Frank Vahid 9 Describing Combinational Behavior in VHDL • Describing an OR gate's behavior – Entity defines input/output ports – Architecture • Process – Describes behavior – Process "sensitive" to x and y » Means behavior only executes when x changes or y changes – Behavior assigns a new value to output port F, computed using built-in operator "or" Digital Design Copyright © 2006 Frank Vahid library ieee; use ieee.std_logic_1164.all; entity OR2 is port (x, y: in std_logic; F: out std_logic ); end OR2; architecture behavior of OR2 is begin process (x, y) begin F <= x or y; end process; end behavior; 10 Describing Combinational Behavior in VHDL • Describing a custom function's behavior – Desired function: f = c'*(h+p) – Entity defines input/output ports (not shown) – Architecture • Process – Sensitive to c, h, and p – Assigns a new value to output port f, computed using built-in operators "not", "and", and "or" Digital Design Copyright © 2006 Frank Vahid architecture beh of DoorOpener is begin process(c, h, p) begin f <= not(c) and (h or p); end process; end beh; 11 Describing Combinational Behavior in Verilog • Describing an OR gate's behavior – Module declares input/output ports • Also indicates that F is "reg" • Means F stores value – By default, ports are wires, having no storage – "always" procedure executes statement block when change occurs on x or on y module OR2(x,y,F); input x, y; output F; reg F; always @(x or y) begin F <= x | y; end endmodule • "Sensitive" to x and y • Assigns value to F, computed using built-in OR operator "|" Digital Design Copyright © 2006 Frank Vahid 12 Describing Combinational Behavior in Verilog • Describing a custom function's behavior – Desired function: f = c'*(h+p) – Module defines input/output ports • Output f defined as "reg" – "always" procedure sensitive to inputs module DoorOpener(c,h,p,f); input c, h, p; output f; reg f; always @(c or h or p) begin f <= (~c) & (h | p); end endmodule • Assigns value to f, computed using built-in operators for NOT (~), AND (&), and OR (|) Digital Design Copyright © 2006 Frank Vahid 13 Describing Combinational Behavior in SystemC • Describing an OR gate's behavior – Module declares input/output ports – Constructor (CTOR) • Indicates module described by a method (procedure) "comblogic" • Sensitive to x and y – Method "comblogic" assigns F a new value using built-in OR operator "|" • Reading input port done using .read() function defined for input port type; likewise, writing done using .write() function Digital Design Copyright © 2006 Frank Vahid #include "systemc.h" SC_MODULE(OR2) { sc_in<sc_logic> x, y; sc_out<sc_logic> F; SC_CTOR(OR2) { SC_METHOD(comblogic); sensitive << x << y; } void comblogic() { F.write(x.read() | y.read()); } }; 14 Describing Combinational Behavior in SystemC • Describing a custom function's behavior – Desired function: f = c'*(h+p) – Module defines input/output ports – Constructor # i nc l ude SC_ MODUL E ( Do o r Op e n e r ) { s c _ i n<s c _ l ogi c > c , h , s c _ out <s c _ l ogi c > f ; – "comblogic" method Digital Design Copyright © 2006 Frank Vahid p; SC_ CT OR( Do o r Op e n e r ) { SC_ MET HOD ( c o mb l o g i c ) ; s e ns i t i v e << c << h << p ; } • Indicates module described by a method (procedure) "comblogic" • Sensitive to c, h, and p • Assigns value to f, computed using built-in operators for NOT (~), AND (&), and OR (|) " s y s t e mc . h " v o i d c o mb l o g i c ( ) { f . wr i t e ( ( ~ c . r e a d ( ) ) & ( h . r e a d ( ) p. r ead( ) ) ) ; } } ; 15 | Testbenches • Testbench – Assigns values to a system's inputs, check that system outputs correct values – A key use of HDLs is to simulate system to ensure design is correct Testbench Set input values, check output values Digital Design Copyright © 2006 Frank Vahid SystemToTest 16 Testbench in VHDL • Entity l i br a r y i e e e ; us e i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; – No inputs or outputs e nt i t y Te s t b e n c h e nd Te s t b e n c h ; • Architecture – Declares component to test, declares signals – Instantiates component, connects to signals – Process writes input signals, checks output signal a r c hi t e c t ur e b e h a v i o r of Te s t b e n c h i s c o mp o n e n t Do o r Op e n e r por t ( c , h , p : i n s t d _ l o g i c ; f : out s t d _ l o g i c ) ; e n d c o mp o n e n t ; s i gna l c , h , p , f : s t d _ l o g i c ; be gi n Do o r Op e n e r 1 : Do o r Op e n e r p o r t ma p ( c , h , p , f ) ; pr oc e s s be gi n - - case 0 c <= ' 0' ; h <= ' 0' ; p <= ' 0' ; wa i t f o r 1 n s ; a s s e r t ( f = ' 0 ' ) r e p o r t " Ca s e 0 f a i l e d " ; • Waits a small amount of time after writing input signals • Checks for correct output value using "assert" statement DoorOpener1 Testbench process Digital Design Copyright © 2006 Frank Vahid Set input values, check output values SystemToTest i s - - case 1 c <= ' 0' ; h <= ' 0' ; p <= ' 1' ; wa i t f o r 1 n s ; a s s e r t ( f = ' 1 ' ) r e p o r t " Ca s e 1 f a i l e d " ; - - ( c a s e s 2 - 6 o mi t t e d f r o m f i g u r e ) - - case 7 c <= ' 1' ; h <= ' 1' ; p <= ' 1' ; wa i t f o r 1 n s ; a s s e r t ( f = ' 0 ' ) r e p o r t " Ca s e 7 f a i l e d " ; wa i t ; - - p r o c e s s e nd pr oc e s s ; e nd b e h a v i o r ; does not wa k e u p a g a i n 17 Testbench in Verilog • Module – Three register signals for inputs (values must be written and mo d u l e T e s t b e n c h ; r eg c, h, p; wi r e f ; stored) – One wire signal for output Do o r Op e n e r Do o r Op e n e r 1 ( c , h, p, f ) ; (value is only read, need not be stored) – Instantiates component, connects to signals – "initial" procedure executed only once at beginning • Sets input values • Displays output value i ni t i a l be gi n / / case 0 c <= 0; h <= 0; p <= 0; # 1 $ d i s p l a y ( " f = %b " , f ) ; / / case 1 c <= 0; h <= 0; p <= 1; # 1 $ d i s p l a y ( " f = %b " , f ) ; / / ( c a s e s 2 - 6 o mi t t e d f r o m f i g u r e ) / / case 7 c <= 1; h <= 1; p <= 1; # 1 $ d i s p l a y ( " f = %b " , f ) ; e nd e n d mo d u l e DoorOpener1 Testbench "initial" procedure Digital Design Copyright © 2006 Frank Vahid Set input values, check output values SystemToTest 18 Testbench in SystemC # i nc l ude • Module – Testbench is its own module – Three outputs, one for each input of system to test – One input, for the one output of the system to test – Constructor defined as THREAD SC_ MODUL E ( T e s t b e n c h ) { s c _ out <s c _ l ogi c > c _ t , s c _ i n<s c _ l ogi c > f _ t ; p_t ; v oi d t e s t b e n c h _ p r o c ( ) { / / case 0 c _ t . wr i t e ( SC_ L OGI C_ 0 ) ; h _ t . wr i t e ( SC_ L OGI C_ 0 ) ; p _ t . wr i t e ( SC_ L OGI C_ 0 ) ; wa i t ( 1 , SC_ NS) ; a s s e r t ( f _ t . r e a d ( ) = = SC_ L OGI C_ 0 ) ; – testbench procedure writes outputs, waits for small amount of time, checks for correct output / / case c _ t . wr i t h _ t . wr i t p _ t . wr i t wa i t ( 1 , asser t ( • assert function prints error if condition is not true DoorOpener1 1 e ( SC_ L OGI e ( SC_ L OGI e ( SC_ L OGI SC_ NS) ; f _t . r ead( C_ 0 ) ; C_ 0 ) ; C_ 1 ) ; ) = = SC_ L OGI C_ 1 ) ; / / ( c a s e s 2 - 6 o mi t t e d f r o m f i g u r e ) / / case 7 c _ t . wr i t e ( SC_ L OGI C_ 1 ) ; h _ t . wr i t e ( SC_ L OGI C_ 1 ) ; p _ t . wr i t e ( SC_ L OGI C_ 1 ) ; wa i t ( 1 , SC_ NS) ; a s s e r t ( f _ t . r e a d ( ) = = SC_ L OGI C_ 0 ) ; Testbench Digital Design Copyright © 2006 Frank Vahid h_t , SC_ CT OR( T e s t b e n c h ) { SC_ T HREAD( t e s t b e n c h _ p r o c ) ; } • Like MODULE, but allows use of "wait" to control timing Set input values, check output values " s y s t e mc . h " SystemToTest s c _ s t op( ) ; } } ; 19 Sequential Logic Description using Hardware Description Languages 9.3 • Will consider description of three sequential components – Registers – Oscillators – Controllers si a tap a rtn o co t g Digital Design Copyright © 2006 Frank Vahid 20 Describing a 4-bit Register in VHDL • Entity – 4 data inputs, 4 data outputs, and a clock input – Use std_logic_vector for 4-bit data • I: in std_logic_vector(3 downto 0) • I <= "1000" would assign I(3)=1, I(2)=0, I(1)=0, I(0)=0 • Architecture – Process sensitive to clock input • First statement detects if change on clock was a rising edge • If clock change was rising edge, sets output Q to input I • Ports are signals, and signals store values – thus, output retains new value until set to another value Digital Design Copyright © 2006 Frank Vahid l i br a r y i e e e ; us e i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; e n t i t y Re g 4 i s p o r t ( I : i n s t d _ l o g i c _ v e c t o r ( 3 d o wn t o 0 ) ; Q: o u t s t d _ l o g i c _ v e c t o r ( 3 d o wn t o 0 ) ; cl k: i n st d_l ogi c ) ; e n d Re g 4 ; a r c h i t e c t u r e b e h a v i o r o f Re g 4 i s be gi n pr oc e s s ( c l k ) be gi n i f ( c l k =' 1 ' a nd c l k ' e v e nt ) Q <= I ; e nd i f ; e nd pr oc e s s ; e nd b e h a v i o r ; t he n 21 Describing a 4-bit Register in Verilog • Module – 4 data inputs, 4 data outputs, and a clock input – Define data inputs/outputs as vectors • input [3:0] I • I<=4'b1000 assigns I[3]=1, I[2]=0, I[1]=0, I[0]=0 • Output defined as register to store value mo d u l e Re g 4 ( I , Q, i nput [ 3 : 0 ] I ; i nput c l k ; o u t p u t [ 3 : 0 ] Q; r e g [ 3 : 0 ] Q; a l wa y s @( p o s e d g e be gi n Q <= I ; e nd e n d mo d u l e cl k) ; cl k) – "always" procedure sensitive to positive (rising) edge of clock • Sets output Q to input I Digital Design Copyright © 2006 Frank Vahid 22 Describing a 4-bit Register in SystemC • Module – 4 data inputs, 4 data outputs, and a clock input – Define data inputs/outputs as vectors • sc_in<sc_lv<4> > I; • I<=“1000" assigns I[3]=1, I[2]=0, I[1]=0, I[0]=0 # i nc l ude SC_ MODUL E ( Re g 4 ) { sc _i n<sc _l v <4> > I ; s c _ o u t < s c _ l v < 4 > > Q; s c _ i n<s c _ l ogi c > c l k ; SC_ CT OR( Re g 4 ) { SC_ MET HOD( s e q _ l o g i c ) ; s e ns i t i v e _ pos << c l k ; } – Constructor calls seq_logic method, sensitive to positive (rising) edge of clock • seq_logic writes output Q with input I • Output port is signal, and signal has storage, thus output retains value Digital Design Copyright © 2006 Frank Vahid " s y s t e mc . h " v oi d s e q _ l o g i c ( ) { Q. wr i t e ( I . r e a d ( ) ) ; } } ; 23 Describing an Oscillator in VHDL • Entity – Defines clock output • Architecture – Process • Has no sensitivity list, so executes non-stop as infinite loop • Sets clock to 0, waits 10 ns, sets clock to 1, waits 10 ns, repeats Digital Design Copyright © 2006 Frank Vahid l i br a r y i e e e ; us e i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; e n t i t y Os c i s por t ( c l k : out e n d Os c ; st d_l ogi c a r c hi t e c t ur e b e h a v i o r be gi n pr oc e s s be gi n c l k <= ' 0' ; wa i t f o r 1 0 n s ; c l k <= ' 1' ; wa i t f o r 1 0 n s ; e nd pr oc e s s ; e nd b e h a v i o r ; of Os c ) ; i s 24 Describing an Oscillator in Verilog • Module – Has one output, clk • Declare as "reg" to hold value – "always" procedure • Has no sensitivity list, so executes non-stop as infinite loop • Sets clock to 0, waits for 10 ns, sets clock to 1, waits for 10 ns, repeats Digital Design Copyright © 2006 Frank Vahid module Osc(clk); output clk; reg clk; always begin clk <= 0; #10; clk <= 1; #10; end endmodule 25 Describing an Oscillator in SystemC • Module – Has one output, clk – Constructor creates single thread # i nc l ude " s y s t e mc . h " SC_ MODUL E ( Os c ) { s c _ out <s c _ l ogi c > c l k ; SC_ CT OR( Os c ) { SC_ T HREAD( s e q _ l o g i c ) ; } • Thread consists of infinite loop – while (true) { • Sets clock to 0, waits 10 ns, sets clock to 1, waits 10 ns, repeats v oi d s e q _ l o g i c ( ) { wh i l e ( t r u e ) { c l k . wr i t e ( SC_ L OGI C_ 0 ) ; wa i t ( 1 0 , SC_ NS) ; c l k . wr i t e ( SC_ L OGI C_ 1 ) ; wa i t ( 1 0 , SC_ NS) ; } } } ; Digital Design Copyright © 2006 Frank Vahid 26 Off FSM inputs Inputs: b; Outputs: x x=0 b’ Combinational n1 logic n0 s1 s0 b • x=1 x=1 x=1 On1 On2 On3 x b clk FSM outputs Describing a Controller in VHDL FSM behavior captured using architecture with 2 processes – First process models state register • Asynchronous reset sets state to "S_Off" • Rising clock edge sets currentstate to nextstate – Second process models combinational logic – Note declaration of new type, statetype Digital Design Copyright © 2006 Frank Vahid e n t i t y L a s e r T i me r i s por t ( b : i n s t d _ l o g i c ; x : out s t d _ l o g i c ; cl k, r st : i n st d l ogi c ) ; e n d L a s e r T i me r ; outputs FSM State register • Sensitive to currentstate and FSM inputs • Sets FSM outputs based on currentstate • Sets nextstate based on currentstate and present FSM input values l i br a r y i e e e ; us e i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l a r c h i t e c t u r e b e h a v i o r o f L a s e r T i me r i s t y pe s t a t e t y p e i s ( S_ Of f , S_ On 1 , S_ On 2 , S_ On 3 ) ; s i gna l c u r r e n t s t a t e , n e x t s t a t e : st at et ype; be gi n s t a t e r e g : pr oc e s s ( c l k , r s t ) be gi n i f ( r s t =' 1 ' ) t he n - - i n t i a l s t a t e c u r r e n t s t a t e < = S_ Of f ; e l s i f ( c l k =' 1 ' a nd c l k ' e v e nt ) t he n c ur r ent s t at e <= nex t s t at e; e nd i f ; e nd pr oc e s s ; c o mb l o g i c : be gi n case cur wh e n x i f pr oc e s s ( cur r ent st at e, r ent st at e S_ Of f = > <= ' 0' ; - ( b=' 0' ) t next st at e el se next st at e e nd i f ; wh e n S_ On 1 = > x <= ' 1' ; - nex t s t at e <= wh e n S_ On 2 = > x <= ' 1' ; - nex t s t at e <= wh e n S_ On 3 = > x <= ' 1' ; - nex t s t at e <= e nd c a s e ; e nd pr oc e s s ; e nd b e h a v i o r ; b) i s l aser of f he n < = S_ Of f ; < = S_ On 1 ; l aser on S_ On 2 ; l aser st i l l S_ On 3 ; on l aser st i l l S_ Of f ; on 27 Off FSM inputs Inputs: b; Outputs: x x=0 b’ Combinational n1 logic n0 s1 s0 b • x=1 x=1 x=1 On1 On2 On3 x b clk FSM outputs Describing a Controller in Verilog p a r a me t e r outputs FSM State register FSM behavior captured using 2 "always" procedures – First procedure models state register • Asynchronous reset sets state to "S_Off" • Rising clock edge sets currentstate to nextstate – Second process models combinational logic • Sensitive to currentstate and FSM inputs • Sets FSM outputs based on currentstate • Sets nextstate based on currentstate and present FSM input values – Note state register size must be explicit – 2 bits, reg [1:0] currentstate Digital Design Copyright © 2006 Frank Vahid mo d u l e L a s e r T i me r ( b , x , i nput b , c l k , r s t ; out put x ; r eg x; S_ Of f = 2 ' S_ On 1 = 2 ' S_ On 2 = 2 ' S_ On 3 = 2 ' cl k, r st ) ; b00, b01, b10, b11; r eg [ 1: 0] cur r ent st at e; r eg [ 1: 0] next st at e; / / st at e r egi st er pr ocedur e a l wa y s @( p o s e d g e r s t o r p o s e d g e c l k ) be gi n i f ( r s t ==1) / / i ni t i al s t at e c u r r e n t s t a t e < = S_ Of f ; el se c ur r ent s t at e <= nex t s t at e; e nd / / c o mb i n a t i o n a l l o g i c p r o c e d u r e a l wa y s @( c u r r e n t s t a t e o r b ) be gi n case ( cur r ent st at e) S_ Of f : b e g i n x <= 0; / / l as er of f i f ( b==0) n e x t s t a t e < = S_ Of f ; el se n e x t s t a t e < = S_ On 1 ; e nd S_ On 1 : b e g i n x <= 1; / / l as er on n e x t s t a t e < = S_ On 2 ; e nd S_ On 2 : b e g i n x <= 1; / / l as er s t i l l on n e x t s t a t e < = S_ On 3 ; e nd S_ On 3 : b e g i n x <= 1; / / l as er s t i l l on n e x t s t a t e < = S_ Of f ; e nd e ndc a s e e nd e n d mo d u l e 28 Off FSM inputs Inputs: b; Outputs: x x=0 b’ b Combinational n1 logic n0 s1 s0 b • x=1 x=1 x=1 On1 On2 On3 x clk FSM outputs Describing a Controller in SystemC # i nc l ude e num s t a t e t y p e { S_ Of f , S_ On 1 , S_ On 2 , SC_ MODUL E ( L a s e r T i me r ) { s c _ i n<s c _ l ogi c > b , c l k , r s t ; s c _ out <s c _ l ogi c > x ; s c _ s i gna l <s t a t e t y p e > c u r r e n t s t a t e , S_ On 3 } ; next st at e; outputs FSM SC_ CT OR( L a s e r T i me r ) { SC_ MET HOD ( s t a t e r e g ) ; s e ns i t i v e _ pos << r s t << c l k ; SC_ MET HOD ( c o mb l o g i c ) ; s e ns i t i v e << c u r r e n t s t a t e << b ; } State register v oi d s t a t e r e g ( ) { i f ( r s t . r e a d ( ) = = SC_ L OGI C_ 1 ) c u r r e n t s t a t e = S_ Of f ; / / i n i t i a l el se cur r ent st at e = next st at e; } v o i d c o mb l o g i c ( ) { s wi t c h ( c u r r e n t s t a t e ) { c a s e S_ Of f : x . wr i t e ( SC_ L OGI C_ 0 ) ; / / l a s e r i f ( b . r e a d ( ) = = SC_ L OGI C_ 0 ) n e x t s t a t e = S_ Of f ; el se n e x t s t a t e = S_ On 1 ; br e a k ; c a s e S_ On 1 : x . wr i t e ( SC_ L OGI C_ 1 ) ; / / l a s e r n e x t s t a t e = S_ On 2 ; br e a k ; c a s e S_ On 2 : x . wr i t e ( SC_ L OGI C_ 1 ) ; / / l a s e r n e x t s t a t e = S_ On 3 ; br e a k ; c a s e S_ On 3 : x . wr i t e ( SC_ L OGI C_ 1 ) ; / / l a s e r n e x t s t a t e = S_ Of f ; br e a k ; } } FSM behavior captured using 2 methods – First method models state register • Asynchronous reset sets state to "S_Off" • Rising clock edge sets currentstate to nextstate – Second process models combinational logic • Sensitive to currentstate and FSM inputs • Sets FSM outputs based on currentstate • Sets nextstate based on currentstate and present FSM input values – Note use of new type, statetype Digital Design Copyright © 2006 Frank Vahid " s y s t e mc . h " } ; st at e of f on st i l l on st i l l on 29 Datapath Component Description using Hardware Description Languages 9.4 • Will consider description of three datapath components – Full-adders – Carry-ripple adders – Up-counter si a tap a rtn o co t g Digital Design Copyright © 2006 Frank Vahid 30 Describing a Full-Adder in VHDL a b • Entity – Declares inputs/outputs • Architecture – Described behaviorally (could have been described structurally) – Process sensitive to inputs – Computes expressions, sets outputs Digital Design Copyright © 2006 Frank Vahid ci s = a xor b xor ci co = bc + ac + ab Full adder co s l i br a r y i e e e ; us e i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; e n t i t y F u l l Ad d e r i s por t ( a , b , c i : i n s t d _ l o g i c ; s , c o : out s t d _ l o g i c ) ; e n d F u l l Ad d e r ; a r c h i t e c t u r e b e h a v i o r o f F u l l Ad d e r i s be gi n pr oc e s s ( a , b , c i ) be gi n s <= a x or b x or c i ; c o <= ( b a nd c i ) or ( a a nd c i ) or e nd pr oc e s s ; e nd b e h a v i o r ; ( a a nd b ) ; 31 Describing a Full-Adder in Verilog a b ci • Module – Declares inputs/outputs – Described behaviorally (could s = a xor b xor ci co = bc + ac + ab Full adder have been described structurally) – "always" procedure • Sensitive to inputs – Computes expressions, sets outputs mo d u l e F u l l Ad d e r ( a , i nput a , b , c i ; out put s , c o ; r eg s, co; b, ci , s, a l wa y s @( a o r b o r c i ) be gi n s <= a ^ b ^ c i ; c o <= ( b & c i ) | ( a & c i ) e nd e n d mo d u l e Digital Design Copyright © 2006 Frank Vahid s co co) ; | ( a & b) ; 32 Describing a Full-Adder in SystemC a b ci • Module – Declares inputs/outputs – Described behaviorally (could have been described structurally) – comblogic method • Computes expressions, sets outputs Digital Design Copyright © 2006 Frank Vahid s = a xor b xor ci co = bc + ac + ab Full adder co s #include "systemc.h" SC_MODULE(FullAdder) { sc_in<sc_logic> a, b, ci; sc_out<sc_logic> s, co; SC_CTOR(FullAdder) { SC_METHOD(comblogic); sensitive << a << b << ci; } void comblogic() { s.write(a.read() ^ co.write((b.read() (a.read() (a.read() } }; b.read() ^ ci.read()); & ci.read()) | & ci.read()) | & b.read())); 33 Describing a Carry-Ripple Adder in VHDL • Entity – Declares inputs/outputs – Uses std_logic_vector for 4-bit inputs/outputs • Architecture – Described structurally by composing four fulladders (could have been described behaviorally instead) – Declares full-adder component, instantiates four full-adders, connects • Note use of three internal signals for connecting carry-out of one stage to carry-in of next stage Digital Design Copyright © 2006 Frank Vahid a3 b3 a2 b2 a1 b1 a0 b0 ci a b ci a b ci a b ci a b ci FA FA FA FA co s co s3 co co3 l i br a r y i e e e ; us e i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; e n t i t y Ca r r y Ri por t ( a : b: ci : s: co: ) ; e n d Ca r r y Ri p p l a r c hi t e c t ur e c o mp o n e n t por t ( ppl i n i n i n out out s s2 co co2 s s1 co co1 e Ad d e r 4 i s s t d _ l o g i c _ v e c t o r ( 3 d o wn t o 0 ) ; s t d _ l o g i c _ v e c t o r ( 3 d o wn t o 0 ) ; st d_l ogi c; s t d _ l o g i c _ v e c t o r ( 3 d o wn t o 0 ) ; st d_l ogi c e Ad d e r 4 ; st r Fu l a, s, u c t u r e o f Ca r r y Ri p p l e Ad d e r 4 l Ad d e r b, ci : i n st d_l ogi c; c o : out s t d _ l o g i c ) ; e n d c o mp o n e n t ; s i gna l c o 1 , c o 2 , c o 3 : be gi n F u l l Ad d e r 1 : F u l l Ad d e r p o r t ma p ( a ( 0 ) , b ( F u l l Ad d e r 2 : F u l l Ad d e r p o r t ma p ( a ( 1 ) , b ( F u l l Ad d e r 3 : F u l l Ad d e r p o r t ma p ( a ( 2 ) , b ( F u l l Ad d e r 4 : F u l l Ad d e r p o r t ma p ( a ( 3 ) , b ( e nd s t r u c t u r e ; i s st d_l ogi c; 0) , ci , s( 0) , co1) ; 1) , co1, s( 1) , co2) ; 2) , co2, s( 2) , co3) ; 3) , co3, s( 3) , co) ; 34 s s0 Describing a Carry-Ripple Adder in Verilog • Module – Declares inputs/outputs – Uses vectors for 4-bit inputs/outputs – Described structurally by composing four fulladders (could have been described behaviorally instead) – Instantiates four fulladders, connects • Note use of three internal wires for connecting carry-out of one stage to carry-in of next stage a3 b3 a2 b2 a1 b1 a0 b0 ci a b ci a b ci a b ci a b ci FA FA FA FA co s co s3 co co3 s s2 co s co2 s1 mo d u l e Ca r r y Ri p p l e Ad d e r 4 ( a , i nput [ 3 : 0 ] a ; i nput [ 3 : 0 ] b ; i nput c i ; out put [ 3 : 0 ] s ; out put c o ; wi r e c o 1 , co2, F u l l Ad d e r F u l l Ad d e r 1 ( a [ s[ F u l l Ad d e r 2 ( a [ s[ F u l l Ad d e r 3 ( a [ s[ F u l l Ad d e r 4 ( a [ s[ F u l l Ad d e r F u l l Ad d e r F u l l Ad d e r b, co s co1 ci , s, s0 co) ; co3; 0] 0] 1] 1] 2] 2] 3] 3] , , , , , , , , b[ 0] co1) b[ 1] co2) b[ 2] co3) b[ 3] co) ; , ; , ; , ; , ci , co1, co2, co3, e n d mo d u l e Digital Design Copyright © 2006 Frank Vahid 35 Describing a Carry-Ripple Adder in SystemC • Module – Declares inputs/outputs – Uses vectors for 4-bit inputs/outputs – Described structurally by composing four full-adders (could have # i nc l ude # i nc l ude SC_ MODUL E ( Ca r r y Ri p p l e Ad d e r 4 ) { s c _ i n<s c _ l ogi c > a [ 4 ] ; s c _ i n<s c _ l ogi c > b [ 4 ] ; s c _ i n<s c _ l ogi c > c i ; s c _ out <s c _ l ogi c > s [ 4 ] ; s c _ o ut <s c _ l ogi c > c o ; s c _ s i gna l <s c _ l ogi c > c o 1 , Fu l Fu l Fu l Fu l been described behaviorally instead) Ad d e r Ad d e r Ad d e r Ad d e r Fu l Fu l Fu l Fu l SC_ CT OR( Ca r F u l l Ad d e r F u l l Ad d e r F u l l Ad d e r F u l l Ad d e r { F u l l Ad d e r F u l l Ad d e r F u l l Ad d e r – Instantiates four fulladders, connects • Note use of three internal wires for connecting carryout of one stage to carry-in of next stage Digital Design Copyright © 2006 Frank Vahid l l l l } } ; a3 b3 a2 b2 a1 b1 a0 b0 ci a b ci a b ci a b ci a b ci FA FA FA FA " s y s t e mc . h " " f ul l adder . h" l l l l Ad d e r Ad d e r Ad d e r Ad d e r r y Ri _1( " _2( " _3( " _4( " ppl Fu l Fu l Fu l Fu l co2, co s co s3 co co3 s s2 co co2 s s1 co co1 co3; _1; _2; _3; _4; e4) : l Ad d e r l Ad d e r l Ad d e r l Ad d e r _1" _2" _3" _4" ) , ) , ) , ) _ 1 . a ( a [ 0 ] ) ; F u l l Ad d e r _ 1 . b ( b [ 0 ] ) ; _ 1 . c i ( c i ) ; F u l l Ad d e r _ 1 . s ( s [ 0 ] ) ; _1. co( co1) ; F u l l Ad d e r _ 2 . a ( a [ 1 ] ) ; F u l l Ad d e r _ 2 . c i ( c o 1 ) ; F u l l Ad d e r _ 2 . c o ( c o 2 ) ; F u l l Ad d e r _ 2 . b ( b [ 1 ] ) ; F u l l Ad d e r _ 2 . s ( s [ 1 ] ) ; F u l l Ad d e r _ 3 . a ( a [ 2 ] ) ; F u l l Ad d e r _ 3 . c i ( c o 2 ) ; F u l l Ad d e r _ 3 . c o ( c o 3 ) ; F u l l Ad d e r _ 3 . b ( b [ 2 ] ) ; F u l l Ad d e r _ 3 . s ( s [ 2 ] ) ; F u l l Ad d e r _ 4 . a ( a [ 3 ] ) ; F u l l Ad d e r _ 4 . c i ( c o 3 ) ; F u l l Ad d e r _ 4 . c o ( c o ) ; F u l l Ad d e r _ 4 . b ( b [ 3 ] ) ; F u l l Ad d e r _ 4 . s ( s [ 3 ] ) ; 36 s s0 Describing an Up-Counter in VHDL l i br a r y i e e e ; us e i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; 4-bit up-counter cnt e n t i t y Up Co u n t e r i s por t ( c l k : i n s t d _ l o g i c ; c nt : i n st d_l ogi c; C: o u t s t d _ l o g i c _ v e c t o r ( 3 t c : out s t d _ l o g i c ) ; e n d Up Co u n t e r ; ld 4-bit register tempC 4 4 4 tc +1 4 C • Described structurally (could have been described behaviorally) • Includes process that updates output port C whenever internal signal tempC changes – Need tempC signal because can't read C due to C being an output port Digital Design Copyright © 2006 Frank Vahid a r c hi t e c t ur e c o mp o n e n t por t ( d o wn t o 0 ) ; s t r u c t u r e o f Up Co u n t e r i s Re g 4 I : i n s t d _ l o g i c _ v e c t o r ( 3 d o wn t o 0 ) ; Q: o u t s t d _ l o g i c _ v e c t o r ( 3 d o wn t o 0 ) ; cl k, l d: i n st d_l ogi c ) ; e n d c o mp o n e n t ; c o mp o n e n t I n c 4 p o r t ( a : i n s t d _ l o g i c _ v e c t o r ( 3 d o wn t o 0 ) ; s : o u t s t d _ l o g i c _ v e c t o r ( 3 d o wn t o 0 ) ) ; e n d c o mp o n e n t ; c o mp o n e n t AND4 p o r t ( w, x , y , z : i n s t d _ l o g i c ; F: out s t d _ l o g i c ) ; e n d c o mp o n e n t ; s i g n a l t e mp C: s t d _ l o g i c _ v e c t o r ( 3 d o wn t o 0 ) ; s i g n a l i n c C: s t d _ l o g i c _ v e c t o r ( 3 d o wn t o 0 ) ; be gi n Re g 4 _ 1 : Re g 4 p o r t ma p ( i n c C, t e mp C, c l k , c n t ) ; I n c 4 _ 1 : I n c 4 p o r t ma p ( t e mp C, i n c C) ; AND4 _ 1 : AND4 p o r t ma p ( t e mp C( 3 ) , t e mp C( 2 ) , t e mp C( 1 ) , t e mp C( 0 ) , t c ) ; o u t p u t C: p r o c e s s ( t e mp C) be gi n C < = t e mp C; e nd pr oc e s s ; e nd s t r u c t u r e ; 37 Describing an Up-Counter in Verilog mo d u l e Re g 4 ( I , Q, c l k , i nput [ 3 : 0 ] I ; i nput c l k , l d ; o u t p u t [ 3 : 0 ] Q; / / d e t a i l s n o t s h o wn e n d mo d u l e 4-bit up-counter cnt ld 4-bit register tempC 4 4 4 tc +1 4 nc4( a, s) ; [ 3: 0] a; [ 3: 0] s; a i l s n o t s h o wn e C • Described structurally (could have been described behaviorally) • Includes always procedure that updates output C whenever internal wire tempC changes – Need tempC wire because can't use C in the connection statements Digital Design Copyright © 2006 Frank Vahid mo d u l e I i nput out put / / det e n d mo d u l l d) ; mo d u l e AND4 ( w, x , y , z , F ) ; i n p u t w, x , y , z ; out put F; / / d e t a i l s n o t s h o wn e n d mo d u l e mo d u l e Up Co u n t e r ( c l k , i nput c l k , c n t ; o u t p u t [ 3 : 0 ] C; r e g [ 3 : 0 ] C; out put t c ; wi r e [ 3 : 0 ] wi r e [ 3 : 0 ] cnt , C, t c) ; t e mp C; i n c C; Re g 4 Re g 4 _ 1 ( i n c C, t e mp C, c l k , c n t ) ; I n c 4 I n c 4 _ 1 ( t e mp C, i n c C) ; AND4 AND4 _ 1 ( t e mp C[ 3 ] , t e mp C[ 2 ] , t e mp C[ 1 ] , t e mp C[ 0 ] , t c ) ; a l wa y s @( t e mp C) be gi n C < = t e mp C; e nd e n d mo d u l e 38 Describing an Up-Counter in SystemC #i #i #i #i 4-bit up-counter cnt nc l nc l nc l nc l ude ude ude ude " " " " s y s t e mc . h " r eg4. h" i nc4. h" and4. h" ld 4-bit register tempC 4 4 4 tc SC_ MODUL E ( Up Co u n t e r ) { s c _ i n<s c _ l ogi c > c l k , s c _ o u t < s c _ l v < 4 > > C; s c _ out <s c _ l ogi c > t c ; +1 s c _ s i g n a l < s c _ l v < 4 > > t e mp C, i n c C; s c _ s i g n a l < s c _ l o g i c > t e mp C_ b [ 4 ] ; 4 C Re g 4 Re g 4 _ 1 ; I nc4 I nc4_1; AND4 AND4 _ 1 ; • Described structurally (could have been SC_ CT OR( Up Co u n t e r ) described behaviorally) • Includes method that updates output C whenever internal signal tempC changes Digital Design Copyright © 2006 Frank Vahid : Re g 4 _ 1 ( " Re g 4 _ 1 " ) , I nc4_1( " I nc4_1" ) , AND4 _ 1 ( " AND4 _ 1 " ) { Re g 4 _ 1 . I ( i n c C) ; Re g 4 _ 1 . Q( t e mp C) ; Re g 4 _ 1 . c l k ( c l k ) ; Re g 4 _ 1 . l d ( c n t ) ; I n c 4 _ 1 . a ( t e mp C) ; I n c 4 _ 1 . s ( i n c C) ; AND4 _ 1 . w( t e mp C_ b [ 0 ] ) ; AND4 _ 1 . y ( t e mp C_ b [ 2 ] ) ; AND4 _ 1 . F ( t c ) ; – Need tempC signal because can't use C in the connection statements • Can't use logic vector bits individually for connections, so needed tempC_b array too cnt ; AND4 _ 1 . x ( t e mp C_ b [ 1 ] ) ; AND4 _ 1 . z ( t e mp C_ b [ 3 ] ) ; SC_ MET HOD( c o mb l o g i c ) ; s e n s i t i v e < < t e mp C; } v o i d c o mb l { t e mp C_ b [ t e mp C_ b [ t e mp C_ b [ t e mp C_ b [ C. wr i t e ( } } ; ogi c( ) 0] = t 1] = t 2] = t 3] = t t e mp C) e mp C. e mp C. e mp C. e mp C. ; r r r r ead( ead( ead( ead( ) ) ) ) [ [ [ [ 0] 1] 2] 3] ; ; ; ; 39 RTL Design using Hardware Description Languages 9.5 • Will consider two forms of RTL descriptions – High-level state machine – Controller and datapath si a tap a rtn o co t g Digital Design Copyright © 2006 Frank Vahid 40 High-Level State Machine of the Laser-Based Distance Measurer in VHDL • • • Architecture similar to FSM, but single process Asynch reset forces to state S0 For each rising clock – Perform state's computation – Prepare to go to next state based on state and inputs l i br a r y i e e e ; us e i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; us e i e e e . s t d _ l o g i c _ a r i t h . a l l ; (continued from Figure 9.34) e n t i t y L a s e r Di s t Me a s u r e r i s por t ( c l k , r s t : i n s t d _ l o g i c ; B, S: i n s t d _ l o g i c ; L : out s t d _ l o g i c ; D: o u t u n s i g n e d ( 1 5 d o wn t o 0 ) ) ; e n d L a s e r Di s t Me a s u r e r ; a r c hi t e c t ur e b e h a v i o r of t y p e s t a t e t y p e i s ( S0 , s i gna l s i gna l L a s e r Di s t Me a s u r e r S1 , S2 , S3 , S4 ) ; st at e : st at et ype; Dc t r : u n s i g n e d ( 1 5 d o wn t o i s 0) ; c o n s t a n t U_ Z ERO : u n s i g n e d ( 1 5 d o wn t o 0 ) : = " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " ; c o n s t a n t U_ ONE : u n s i g n e d ( 0 d o wn t o 0 ) : = " 1 " ; be gi n s t a t e ma c h i n e : p r o c e s s ( c l k , r s t ) be gi n i f ( r s t =' 1 ' ) t he n L <= ' 0' ; D < = U_ Z ERO; Dc t r < = U_ Z ERO; s t a t e < = S0 ; - - i ni t i al st at e e l s i f ( c l k =' 1 ' a nd c l k ' e v e n t ) t he n case st at e i s wh e n S0 = > L <= ' 0' ; - - l aser of f D < = U_ Z ERO; - - cl ear D s t a t e < = S1 (continued in Figure 9.35) Digital Design Copyright © 2006 Frank Vahid S1 L=0 D=0 Dctr = 0 -- r eset count -- l aser on -- l aser of f -- cal cul at e D S’ B’ S0 wh e n S1 = > Dc t r < = U_ Z ERO; i f ( B= ' 1 ' ) t h e n s t a t e < = S2 ; el se s t a t e < = S1 ; e nd i f ; wh e n S2 = > L <= ' 1' ; s t a t e < = S3 ; wh e n S3 = > L <= ' 0' ; Dc t r < = Dc t r + 1 ; i f ( S= ' 1 ' ) t h e n s t a t e < = S4 ; el se s t a t e < = S3 ; e nd i f ; wh e n S4 = > D < = SHR( Dc t r , U_ ONE) ; s t a t e < = S1 ; e nd c a s e ; e nd i f ; e nd pr oc e s s ; e nd b e h a v i o r ; B S2 L=1 S3 S L=0 Dctr = Dctr + 1 S4 D = Dctr / 2 (calculate D) 41 mo d u l e L a s e r Di s t Me a s u r e r ( c l k , i n p u t c l k , r s t , B, S; out put L ; o u t p u t [ 1 5 : 0 ] D; r eg L; r e g [ 1 5 : 0 ] D; p a r a me t e r S0 S1 S2 S3 S4 = = = = = 3' 3' 3' 3' 3' r st , B, S, b000, b001, b010, b011, b100; L, D) ; High-Level State Machine of the Laser-Based Distance Measurer in Verilog • r eg [ 2: 0] st at e; r e g [ 1 6 : 0 ] Dc t r ; a l wa y s @( p o s e d g e r s t o r p o s e d g e c l k ) be gi n i f ( r s t ==1 ) be gi n L <= 0; D <= 0; Dc t r < = 0 ; s t a t e < = S0 ; / / i n i t i a l s t a t e e nd e l s e be gi n case ( st at e) S0 : b e g i n L <= 0; / / l aser of f D <= 0; / / cl ear D s t a t e < = S1 ; e nd S1 : b e g i n Dc t r < = 0 ; / / r eset count i f ( B= = 1 ) s t a t e < = S2 ; el se s t a t e < = S1 ; e nd S2 : b e g i n L <= 1; / / l aser on s t a t e < = S3 ; e nd (continued in Figure 9.37) Digital Design Copyright © 2006 Frank Vahid (continued from Figure 9.36) S3 : b e g i n L <= 0; / / l aser of f Dc t r < = Dc t r + 1 ; i f ( S= = 1 ) s t a t e < = S4 ; el se s t a t e < = S3 ; e nd S4 : b e g i n D < = Dc t r > > 1 ; / / c a l c u l a t e D s t a t e < = S1 ; e nd e ndc a s e e nd e nd e n d mo d u l e S1 L=0 D=0 Dctr = 0 • – Perform state's computation – Prepare to go to next state based on state and inputs S’ B’ S0 • Module similar to FSM, but single "always" procedure Asynch reset forces to state S0 For each rising clock B S2 L=1 S3 S L=0 Dctr = Dctr + 1 S4 D = Dctr / 2 (calculate D) 42 High-Level State Machine of the Laser-Based Distance Measurer in SystemC # i nc l ude • • • Module similar to FSM, but single method Asynch reset forces to state S0 For each rising clock – Perform state's computation – Prepare to go to next state based on state and inputs " s y s t e mc . h " e num s t a t e t y p e { S0 , S2 , S3 , S4 } ; SC_ MODUL E ( L a s e r Di s t Me a s u r e r ) { s c _ i n<s c _ l ogi c > c l k , r s t ; s c _ i n < s c _ l o g i c > B, S; s c _ out <s c _ l ogi c > L ; s c _ o u t < s c _ l v < 1 6 > > D; (continued from Figure 9.38) s c _ s i gna l <s t a t e t y p e > s t a t e ; s c _ s i g n a l < s c _ u i n t < 1 6 > > Dc t r ; SC_ CT OR( L a s e r Di s t Me a s u r e r ) { SC_ MET HOD( s t a t e ma c h i n e ) ; s e ns i t i v e _ pos << r s t << c l k ; } v o i d s t a t e ma c h i n e ( ) { i f ( r s t . r e a d ( ) = = SC_ L OGI C_ 1 ) { } L . wr i t e ( SC_ L OGI C_ 0 ) ; } D. wr i t e ( 0 ) ; Dc t r = 0 ; } s t a t e = S0 ; / / i n i t i a l s t a t e } ; } el se { s wi t c h ( s t a t e ) { c a s e S0 : / / l aser of f L . wr i t e ( SC_ L OGI C_ 0 ) ; / / cl ear D D. wr i t e ( 0 ) ; s t a t e = S1 ; br e a k ; c a s e S1 : / / cl ear count Dc t r = 0 ; i f ( B. r e a d ( ) = = SC_ L OGI C_ 1 ) s t a t e = S2 ; (continued in Figure 9.39) Digital Design Copyright © 2006 Frank Vahid S1 , S’ B’ S0 S1 L=0 D=0 Dctr = 0 c a s e S2 : L . wr i t e ( SC_ L OGI C_ 1 ) ; / / l aser on s t a t e = S3 ; br e a k ; c a s e S3 L . wr i t e ( SC_ L OGI C_ 0 ) ; / / l aser of f Dc t r = Dc t r . r e a d ( ) + 1 ; i f ( S. r e a d ( ) = = SC_ L OGI C_ 1 ) s t a t e = S4 ; el se s t a t e = S3 ; br e a k ; c a s e S4 : D. w r i t e ( Dc t r . r e a d ( ) > > 1 ) ; / / Ca l c u l a t e D s t a t e = S1 ; br e a k ; B S2 L=1 S3 S L=0 Dctr = Dctr + 1 S4 D = Dctr / 2 (calculate D) 43 Controller and Datpath of the Laser-Based Distance Measurer in VHDL B L Dreg_clr Dreg_ld Dctr_clr Dctr_cnt to display D 16 300 MHz Clock Digital Design Copyright © 2006 Frank Vahid Datapath from button Controller • At highest level, just connection of controller and datapath components to laser from sensor S l i br a r y i e e e ; us e i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; e n t i t y L a s e r Di s t Me a s u r e r i s por t ( c l k , r s t : i n s t d _ l o g i c ; B, S: i n s t d _ l o g i c ; L : out s t d _ l o g i c ; D: o u t s t d _ l o g i c _ v e c t o r ( 1 5 ) ; e n d L a s e r Di s t Me a s u r e r ; a r c hi t e c t ur e c o mp o n e n t por t ( d o wn t o 0 ) s t r u c t u r e o f L a s e r Di s t Me a s u r e r i s L DM_ Co n t r o l l e r c l k , r s t : i n st d_l ogi c; B, S: i n s t d _ l o g i c ; L : out s t d _ l o g i c ; Dr e g _ c l r , Dr e g _ l d : o u t s t d _ l o g i c ; Dc t r _ c l r , Dc t r _ c n t : o u t s t d _ l o g i c ) ; e n d c o mp o n e n t ; c o mp o n e n t L DM_ Da t a p a t h por t ( c l k : i n s t d _ l o g i c ; Dr e g _ c l r , Dr e g _ l d : i n s t d _ l o g i c ; Dc t r _ c l r , Dc t r _ c n t : i n s t d _ l o g i c ; D: o u t s t d _ l o g i c _ v e c t o r ( 1 5 d o wn t o 0 ) ) ; e n d c o mp o n e n t ; s i g n a l Dr e g _ c l r , Dr e g _ l d : s t d _ l o g i c ; s i g n a l Dc t r _ c l r , Dc t r _ c n t : s t d _ l o g i c ; be gi n L DM_ Co n t r o l l e r _ 1 : L DM_ Co n t r o l l e r p o r t ma p ( c l k , r s t , B, S, L , Dr e g _ c l r , Dr e g _ l d , Dc t r _ c l r , Dc t r _ c n t ) ; L DM_ Da t a p a t h _ 1 : L DM_ Da t a p a t h p o r t ma p ( c l k , Dr e g _ c l r , Dr e g _ l d , Dc t r _ c l r , Dc t r _ c n t , D) ; e nd s t r u c t u r e ; 44 Datapath of the Laser-Based Distance Measurer in VHDL Datapath l i br a r y i e e e ; us e i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; >>1 16 Dreg_clr Dreg_ld Dctr_clr Dctr_cnt clear count clear load Dctr: 16-bit up-counter Q 16 I Dreg: 16-bit register Q 16 L Dreg_clr Dreg_ld Dctr_clr Dctr_cnt D 16 300 MHz Clock Digital Design Copyright © 2006 Frank Vahid Datapath B Controller D S • Datapath just another connection of components – Assume upcounter, register, and shift-right components are already designed (similar to earlierdesigned items) e n t i t y L DM_ Da t a p a t h i s por t ( c l k : i n s t d _ l o g i c ; Dr e g _ c l r , Dr e g _ l d : i n st d_l ogi c; Dc t r _ c l r , Dc t r _ c n t : i n st d_l ogi c; D: o u t s t d _ l o g i c _ v e c t o r ( 1 5 d o wn t o ) ; e n d L DM_ Da t a p a t h ; a r c hi t e c t ur e c o mp o n e n t por t ( 0) s t r u c t u r e o f L DM_ Da t a p a t h i s Up Co u n t e r 1 6 cl k: i n st dl ogi c; c l r , c nt : i n st d_l ogi c; C: o u t s t d _ l o g i c _ v e c t o r ( 1 5 d o wn t o 0) ) ; e n d c o mp o n e n t ; c o mp o n e n t Re g 1 6 p o r t ( I : i n s t d _ l o g i c _ v e c t o r ( 1 5 d o wn t o 0 ) ; Q: o u t s t d _ l o g i c _ v e c t o r ( 1 5 d o wn t o 0 ) ; cl k, cl r , l d: i n st d_l ogi c ) ; e n d c o mp o n e n t ; c o mp o n e n t Sh i f t Ri g h t On e 1 6 p o r t ( I : i n s t d _ l o g i c _ v e c t o r ( 1 5 d o wn t o 0 ) ; S : o u t s t d _ l o g i c _ v e c t o r ( 1 5 d o wn t o 0 ) ) ; e n d c o mp o n e n t ; s i g n a l t e mp C : s t d _ l o g i c _ v e c t o r ( 1 5 d o wn t o 0 ) ; s i g n a l s h i f t C : s t d _ l o g i c _ v e c t o r ( 1 5 d o wn t o 0 ) ; be gi n Dc t r : Up Co u n t e r 1 6 p o r t ma p ( c l k , Dc t r _ c l r , Dc t r _ c n t , t e mp C) ; S h i f t Ri g h t : S h i f t Ri g h t On e 1 6 p o r t ma p ( t e mp C, s h i f t C) ; Dr e g : Re g 1 6 p o r t ma p ( s h i f t C, D, c l k , Dr e g _ c l r , Dr e g _ l d ) ; e nd s t r u c t u r e ; 45 Controller of the Laser-Based Distance Measurer in VHDL Inputs: B, S Outputs: L, Dreg_clr, Dreg_ld, Dctr_clr, Dctr_cnt B’ S0 L=0 Dreg_clr = 1 (laser off) (clear D reg) • S1 Dctr_clr = 1 (clear count) S’ B S2 L=1 (laser on) S S3 L=0 Dctr_cnt = 1 (laser off) (count up) S4 Dreg_ld = 1 Dctr_cnt = 0 (load D reg with Dctr/2) (stop counting) FSM similar to high-level state machine – But high-level operations replaced by lowlevel datapath signals – Use twoprocess FSM description approach Digital Design Copyright © 2006 Frank Vahid (continued from Figure 9.42) wh e n S2 = > L <= ' 1' ; - n e x t s t a t e < = S3 ; wh e n S3 = > L <= ' 0' ; - Dc t r _ c n t < = ' 1 ' ; - i f ( S= ' 1 ' ) t h e n n e x t s t a t e < = S4 ; el se n e x t s t a t e < = S3 ; e nd i f ; wh e n S4 = > Dr e g _ l d <= ' 1' ; - Dc t r _ c n t < = ' 0 ' ; - n e x t s t a t e < = S1 ; e nd c a s e ; e nd pr oc e s s ; e nd b e h a v i o r ; l aser on l aser count of f up l o a d Dr e g st op count i ng l i br a r y i e e e ; us e i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; e n t i t y L DM_ Co n t r o l l e r i s por t ( c l k , r s t : i n s t d _ l o g i c ; B, S: i n s t d _ l o g i c ; L : out s t d _ l o g i c ; Dr e g _ c l r , Dr e g _ l d : o u t s t d _ l o g i c ; Dc t r _ c l r , Dc t r _ c n t : o u t s t d _ l o g i c ) ; e n d L DM_ Co n t r o l l e r ; a r c h i t e c t u r e b e h a v i o r o f L DM_ Co n t r o l l e r i s t y p e s t a t e t y p e i s ( S0 , S1 , S2 , S3 , S4 ) ; s i gna l c u r r e n t s t a t e , n e x t s t a t e : s t a t e t y p e ; be gi n s t a t e r e g : pr oc e s s ( c l k , r s t ) be gi n i f ( r s t =' 1 ' ) t he n c u r r e n t s t a t e < = S0 ; - - i n i t i a l s t a t e e l s i f ( c l k =' 1 ' a nd c l k ' e v e n t ) t he n c ur r ent s t at e <= nex t s t at e; e nd i f ; e nd pr oc e s s ; c o mb l o g i c : p r o c e s s ( c u r r e n t s t be gi n L <= ' 0' ; Dr e g _ c l r < = ' 0 ' ; Dr e g _ l d < = ' 0 ' ; Dc t r _ c l r < = ' 0 ' ; Dc t r _ c n t < = ' 0 ' ; case cur r ent st at e i s wh e n S0 = > L <= ' 0' ; Dr e g _ c l r < = ' 1 ' ; n e x t s t a t e < = S1 ; wh e n S1 = > Dc t r _ c l r < = ' 1 ' i f ( B= ' 1 ' ) t h e n n e x t s t a t e < = S2 ; el se n e x t s t a t e < = S1 ; e nd i f ; at e, B, S) - l aser cl ear of f Dr e g - cl ear count (continued in Figure 9.43) 46 Controller and Datpath of the Laser-Based Distance Measurer in Verilog • At highest level, just connection of controller and datapath components mo d u l e L a s e r Di s t Me a s u r e r ( c l k , i n p u t c l k , r s t , B, S; out put L ; o u t p u t [ 1 5 : 0 ] D; B L Dreg_clr Dreg_ld Dctr_clr Datapath from button Controller wi r e wi r e to laser from sensor S Dr e g _ c l r , Dc t r _ c l r , r st , B, S, L, D) ; Dr e g _ l d ; Dc t r _ c n t ; L DM_ Co n t r o l l e r L DM_ Co n t r o l l e r _ 1 ( c l k , r s t , B, S, L , Dr e g _ c l r , Dr e g _ l d , Dc t r _ c l r , Dc t r _ c n t ) ; L DM_ Da t a p a t h L DM_ Da t a p a t h _ 1 ( c l k , Dr e g _ c l r , Dr e g _ l d , Dc t r _ c l r , Dc t r _ c n t , D) ; e n d mo d u l e Dctr_cnt to display D 16 300 MHz Clock Digital Design Copyright © 2006 Frank Vahid 47 Datapath of the Laser-Based Distance Measurer in Verilog Datapath >>1 16 Dreg_clr Dreg_ld Dctr_clr Dctr_cnt clear count clear load Dctr: 16-bit up-counter Q 16 I Dreg: 16-bit register Q 16 mo d u l e Up Co u n t e r 1 6 ( c l k , i nput c l k , c l r , c n t ; o u t p u t [ 1 5 : 0 ] C; / / d e t a i l s n o t s h o wn e n d mo d u l e cl r , cnt , mo d u l e Re g 1 6 ( I , i nput [ 1 5 : 0 ] I i nput c l k , c l r out put [ 1 5 : 0 ] / / det ai l s not e n d mo d u l e cl r , l d) ; Q, c l k , ; , l d; Q; s h o wn C) ; L Dreg_clr Dreg_ld Dctr_clr Dctr_cnt D 16 300 MHz Clock Digital Design Copyright © 2006 Frank Vahid Datapath B Controller D S • Datapath just another connection of components – Assume upcounter, register, and shift-right components are already designed (similar to earlierdesigned items) mo d u l e Sh i f t Ri g h t On e 1 6 ( I , i nput [ 1 5 : 0 ] I ; o u t p u t [ 1 5 : 0 ] S; / / d e t a i l s n o t s h o wn e n d mo d u l e S) ; mo d u l e L DM_ Da t a p a t h ( c l k , Dr e g _ c l r , Dr e g _ l d , Dc t r _ c l r , Dc t r _ c n t , D) ; i nput c l k ; i n p u t Dr e g _ c l r , Dr e g _ l d ; i n p u t Dc t r _ c l r , Dc t r _ c n t ; o u t p u t [ 1 5 : 0 ] D; wi r e [ 1 5 : 0 ] t e mp C, s h i f t C; Up Co u n t e r 1 6 Dc t r ( c l k , Dc t r _ c l r , Dc t r _ c n t , t e mp C) ; Sh i f t Ri g h t On e 1 6 Sh i f t Ri g h t ( t e mp C, s h i f t C) ; Re g 1 6 Dr e g ( s h i f t C, D, c l k , Dr e g _ c l r , Dr e g _ l d ) ; e n d mo d u l e 48 Controller of the Laser-Based Distance Measurer in Verilog Inputs: B, S Outputs: L, Dreg_clr, Dreg_ld, Dctr_clr, Dctr_cnt B’ S0 L=0 Dreg_clr = 1 (laser off) (clear D reg) • S1 Dctr_clr = 1 (clear count) FSM similar to high-level state machine – But high-level operations replaced by lowlevel datapath signals – Use twoprocedure FSM description approach Digital Design Copyright © 2006 Frank Vahid S’ B S2 L=1 (laser on) S S3 L=0 Dctr_cnt = 1 (laser off) (count up) L DM_ Co n t r o l l e r ( c l k , r s t , B, S, L , Dr e g _ l d , Dc t r _ c l r , Dc t r _ c n t ) ; i n p u t c l k , r s t , B, S; out put L ; o u t p u t Dr e g _ c l k , Dr e g _ l d ; o u t p u t Dc t r _ c l r , Dc t r _ c n t ; r eg L; r e g Dr e g _ c l r , Dr e g _ l d ; r e g Dc t r _ c l r , Dc t r _ c n t ; S4 Dreg_ld = 1 p a r a me t e r Dctr_cnt = 0 (load D reg with Dctr/2) (stop counting) (continued from Figure 9.46) S1 : b e g i n Dc t r _ c l r < = 1 ; i f ( B= = 1 ) n e x t s t a t e < = S2 ; el se n e x t s t a t e < = S1 ; e nd S2 : b e g i n L <= 1; n e x t s t a t e < = S3 ; e nd S3 : b e g i n L <= 0; Dc t r _ c n t < = 1 ; i f ( S= = 1 ) n e x t s t a t e < = S4 ; el se n e x t s t a t e < = S3 ; e nd S4 : b e g i n Dr e g _ l d < = 1 ; Dc t r _ c n t < = 0 ; n e x t s t a t e < = S1 ; e nd e ndc a s e e nd e n d mo d u l e mo d u l e / / / / cl ear l aser count on / / / / l aser count of f up / / / / l o a d Dr e g st op count i ng r eg [ 2: 0] r eg [ 2: 0] S0 S1 S2 S3 S4 = = = = = 3' 3' 3' 3' 3' Dr e g _ c l k , b000, b001, b010, b011, b100; cur r ent st at e; next st at e; a l wa y s @( p o s e d g e r s t o r p o s e d g e c l k ) be gi n i f ( r s t ==1) c u r r e n t s t a t e < = S0 ; / / i n i t i a l s t a t e el se c ur r ent s t at e <= nex t s t at e; e nd a l wa y s @( c u r r e n t s t a t e o r B o r S) be gi n L <= 0; Dr e g _ c l r < = 0 ; Dr e g _ l d < = 0 ; Dc t r _ c l r < = 0 ; Dc t r _ c n t < = 0 ; case ( cur r ent st at e) S0 : b e g i n L <= 0; / / l aser of f Dr e g _ c l r < = 1 ; / / c l e a r Dr e g n e x t s t a t e < = S1 ; e nd (continued in Figure 9.47) 49 Controller and Datpath of the Laser-Based Distance Measurer in SystemC • At highest level, just connection of controller and datapath components # i nc l ude # i nc l ude # i nc l ude " s y s t e mc . h " " L DM_ Co n t r o l l e r . h " " L DM_ Da t a p a t h . h " SC_ MODUL E ( L a s e r Di s t Me a s u r e r ) { s c _ i n<s c _ l ogi c > c l k , r s t ; s c _ i n < s c _ l o g i c > B, S; s c _ out <s c _ l ogi c > L ; s c _ o u t < s c _ l v < 1 6 > > D; s c _ s i g n a l < s c _ l o g i c > Dr e g _ c l r , s c _ s i g n a l < s c _ l o g i c > Dc t r _ c l r , Dr e g _ l d ; Dc t r _ c n t ; B SC_ CT OR( L a s e r L DM_ Co n t r o l L DM_ Da t a p a t { L DM_ Co n t r o l L DM_ Co n t r o l L DM_ Co n t r o l L DM_ Co n t r o l L DM_ Co n t r o l L DM_ Co n t r o l L DM_ Co n t r o l L DM_ Co n t r o l L Dreg_clr Dreg_ld Dctr_clr Datapath from button Controller L DM_ Co n t r o l l e r L DM_ Co n t r o l l e r _ 1 ; L DM_ Da t a p a t h L DM_ Da t a p a t h _ 1 ; to laser from sensor S Dctr_cnt to display D 16 L DM_ Da t L DM_ Da t L DM_ Da t L DM_ Da t L DM_ Da t L DM_ Da t 300 MHz Clock Digital Design Copyright © 2006 Frank Vahid } } ; apat apat apat apat apat apat Di s t Me a s u r e r ) : l e r _ 1 ( " L DM_ Co n t r o l l e r _ 1 " ) , h _ 1 ( " L DM_ Da t a p a t h _ 1 " ) l l l l l l l l er er er er er er er er _1. _1. _1. _1. _1. _1. _1. _1. h_1. h_1. h_1. h_1. h_1. h_1. cl k( cl k) r st ( r st ) B( B) ; S( S) ; Dr e g _ c l r Dr e g _ l d ( Dc t r _ c l r Dc t r _ c n t cl k( cl k) Dr e g _ c l r Dr e g _ l d ( Dc t r _ c l r Dc t r _ c n t D( D) ; ; ; ( Dr e g _ c l r ) ; Dr e g _ l d ) ; ( Dc t r _ c l r ) ; ( Dc t r _ c n t ) ; ; ( Dr e g _ c l r ) ; Dr e g _ l d ) ; ( Dc t r _ c l r ) ; ( Dc t r _ c n t ) ; 50 Datapath of the Laser-Based Distance Measurer in SystemC #i #i #i #i Datapath >>1 16 Dreg_clr Dreg_ld Dctr_clr Dctr_cnt clear count clear load Dctr: 16-bit up-counter Q 16 I Dreg: 16-bit register nc l nc l nc l nc l ude ude ude ude " " " " s y s t e mc . h " upcount er 16. h" r eg16. h" shi f t r i ght one16. h" SC_ MODUL E ( L DM_ Da t a p a t h ) { s c _ i n<s c _ l ogi c > c l k ; s c _ i n < s c _ l o g i c > Dr e g _ c l r , s c _ i n < s c _ l o g i c > Dc t r _ c l r , s c _ o u t < s c _ l v < 1 6 > > D; Dr e g _ l d ; Dc t r _ c n t ; Q s c _ s i g n a l < s c _ l v < 1 6 > > t e mp C; s c _ s i g n a l < s c _ l v < 1 6 > > s h i f t C; 16 Up Co u n t e r 1 6 Dc t r ; Re g 1 6 Dr e g ; Sh i f t Ri g h t On e 1 6 Sh i f t Ri g h t ; L Dreg_clr Dreg_ld Dctr_clr Dctr_cnt D 16 300 MHz Clock Digital Design Copyright © 2006 Frank Vahid Datapath B Controller D • Datapath just S another connection of components – Assume upcounter, register, and shift-right components are already designed (similar to earlierdesigned items) SC_ CT OR( L DM_ Da t a p a t h ) : Dc t r ( " Dc t r " ) , Dr e g ( " Dr e g " ) , Sh i f t Ri g h t ( " Sh i f t Ri g h t " ) { Dc t r . c l k ( c l k ) ; Dc t r . c l r ( Dc t r _ c l r ) ; Dc t r . c n t ( Dc t r _ c n t ) ; Dc t r . C( t e mp C) ; Sh i f t Ri g h t . I ( t e mp C) ; Sh i f t Ri g h t . S( s h i f t C) ; Dr Dr Dr Dr Dr eg. eg. eg. eg. eg. I ( s h i f t C) ; Q( D) ; cl k( cl k) ; c l r ( Dr e g _ c l r ) ; l d ( Dr e g _ l d ) ; } } ; 51 Controller of the Laser-Based Distance Measurer in SystemC Inputs: B, S Outputs: L, Dreg_clr, Dreg_ld, Dctr_clr, Dctr_cnt B’ S0 L=0 Dreg_clr = 1 (laser off) (clear D reg) • S’ B S1 Dctr_clr = 1 (clear count) FSM similar to high-level state machine S S3 L=0 Dctr_cnt = 1 (laser off) (count up) S4 Dreg_ld = 1 Dctr_cnt = 0 (load D reg with Dctr/2) (stop counting) (continued from Figure 9.50) c a s e S1 Dc t r _ c l r . wr i t e ( SC_ L OGI C_ 1 ) ; i f ( B. r e a d ( ) = = SC_ L OGI C_ 1 ) n e x t s t a t e = S2 ; el se n e x t s t a t e = S1 ; br e a k ; c a s e S2 : L . wr i t e ( SC_ L OGI C_ 1 ) ; n e x t s t a t e = S3 ; br e a k ; c a s e S3 : L . wr i t e ( SC_ L OGI C_ 0 ) ; Dc t r _ c n t . wr i t e ( SC_ L OGI C_ 1 ) ; i f ( S. r e a d ( ) = = SC_ L OGI C_ 1 ) n e x t s t a t e = S4 ; el se n e x t s t a t e = S3 ; br e a k ; c a s e S4 : Dr e g _ l d . wr i t e ( SC_ L OGI C_ 1 ) ; Dc t r _ c n t . wr i t e ( SC_ L OGI C_ 0 ) ; n e x t s t a t e = S1 ; br e a k ; } – But high-level operations replaced by lowlevel datapath signals – Use twoprocedure FSM description approach Digital Design Copyright © 2006 Frank Vahid S2 L=1 (laser on) / / cl ear count / / l aser on / / / / l aser count of f up / / / / l o a d Dr e g st op count i ng # i nc l ude " s y s t e m. h " e num s t a t e t y p e { S0 , S1 , S2 , S3 , S4 } ; SC_ MODUL E ( L DM_ Co n t r o l l e r ) { s c _ i n < s c _ l o g i c > c l k , r s t , B, S; s c _ out <s c _ l ogi c > L ; s c _ o u t < s c _ l o g i c > Dr e g _ c l r , Dr e g _ l d ; s c _ o u t < s c _ l o g i c > Dc t r _ c l r , Dc t r _ c n t ; s c _ s i gna l <s t a t e t y pe > c u r r e n t s t a t e , next st at e; SC_ CT OR( L DM_ Co n t r o l l e r ) { SC_ MET HOD ( s t a t e r e g ) ; s e ns i t i v e _ pos << r s t << c l k ; SC_ MET HOD ( c o mb l o g i c ) ; s e n s i t i v e < < c u r r e n t s t a t e < < B < < S; } v oi d s t i f ( cur el se cur } at er eg( ) { r s t . r e a d ( ) = = SC_ L OGI C_ 1 ) r e n t s t a t e = S0 ; / / i n i t i a l st at e r ent st at e = next st at e; v o i d c o mb l L . wr i t e ( Dr e g _ c l r Dr e g _ l d . Dc t r _ c l r Dc t r _ c n t ogi c( ) { SC_ L OGI C_ 0 ) ; . wr i t e ( SC_ L OGI C_ 0 ) ; wr i t e ( SC_ L OGI C_ 0 ) ; . wr i t e ( SC_ L OGI C_ 0 ) ; . wr i t e ( SC_ L OGI C_ 0 ) ; s wi t c h ( c u r r c a s e S0 : L . wr i t e ( Dr e g _ c l r next st at br e a k ; ent st at e) { SC_ L OGI C_ 0 ) ; . wr i t e ( SC_ L OGI C_ 0 ) ; e = S1 ; / / / / l aser cl ear (continued in Figure 9.51) } } ; 52 of f Dr e g Chapter Summary • Hardware Description Languages (HDLs) are widely used in modern digital design – Textual rather than graphical language sufficient for many purposes – HDLs are computer-readable – Great for simulation • VHDL, Verilog, and SystemC are popular • Introduced languages mainly through examples • Numerous HDL books exist to teach each language in more detail Digital Design Copyright © 2006 Frank Vahid 53