73 FEUP/DEEC – Laboratório de Sistemas Digitais
Modelação de circuitos síncronos
• Como se constrói um flip-flop tipo D?
module ffd( CLK, D, Q);
input CLK; // sinal de relogio, activo na transição 0->1
input D; // entrada D
output Q; // saída Q
reg Q; // Q tem que ser declarado também como reg
always @(posedge CLK) begin
Q <= D; end endmodule
Sempre que CLK passa de 0 para 1…
Q passa a conter o valor que está em D Dentro de ‘always @(posedge…)’ as atribuições devem ser todas do tipo ‘<=‘ e não ‘=‘
74 FEUP/DEEC – Laboratório de Sistemas Digitais
Modelação de circuitos síncronos
• Um flip-flip tipo D com enable
module ffden( CLK, EN, D, Q);
input CLK, EN; // sinal de relogio e de ‘enable’
input D; // entrada D
output Q; // saída Q
reg Q; // Q tem que ser declarado também como reg
always @(posedge CLK) begin if ( EN ) Q <= D; end endmodule
Sempre que CLK passa de 0 para 1 e EN é igual a 1 a saída Q passa a conter o valor de D, caso contrário Q mantém o valor que tinha antes
75 FEUP/DEEC – Laboratório de Sistemas Digitais
Como iniciar o valor de um FFD
• Quando um flip-flop começa a trabalhar o valor
em Q é desconhecido (pode ser 1 ou 0)
• Qualquer sistema que tenha flip-flops deve ter
uma forma de impor o valor inicial das saídas Q
dos flip-flops
• Sinais de iniciação chamam-se usualmente sinais
de reset
• Um sinal de reset pode ser activo com 1 ou 0 e
pode ser síncrono ou assíncrono
76 FEUP/DEEC – Laboratório de Sistemas Digitais
Reset síncrono e assíncrono
• Reset síncrono (depende do clock)
– a acção de reset ocorre apenas quando o sinal
de relógio tem a sua transição activa
• Reset assíncrono (não depende do clock)
– A acção de reset ocorre sempre que o sinal de
reset é colocado no seu nível activo
– O reset assíncrono é uma entrada própria do FF
Q D CLK RST D CLK77 FEUP/DEEC – Laboratório de Sistemas Digitais
Modelação de circuitos síncronos
• FFD com enable e reset (síncrono)
module ffdenrst( CLK, EN, RST, D, Q);
input CLK, EN, RST; // relogio, ‘enable’ e ‘reset’ (activo a 1)
input D; // entrada D
output Q; // saída Q
reg Q; // Q tem que ser declarado também como reg
always @(posedge CLK) begin if ( RST ) Q <= 1’b0; else if ( EN ) Q <= D; end endmodule
Se RST é 1, Q é colocado com zero (reset) (mas este valor não tem que ser zero!)
Senão, funciona como o FFD com enable
78 FEUP/DEEC – Laboratório de Sistemas Digitais
Modelação de circuitos síncronos
• FFD com enable e reset (assíncrono)
module ffdenrsta( CLK, EN, RST, D, Q);input CLK, EN, RST; // relogio, ‘enable’ e ‘reset’ (activo a 1)
input D; // entrada D
output Q; // saída Q
reg Q; // Q tem que ser declarado também como reg
always @(posedge CLK or posedge RST) begin if ( RST ) Q <= 1’b0; else if ( EN ) Q <= D; end endmodule
Quando RST passa de 0 para 1, Q é colocado com zero (reset)
79 FEUP/DEEC – Laboratório de Sistemas Digitais
Um registo de 8 bits: 8 FFs tipo D
• com enable e reset (assíncrono)
module reg8benrsta( CLK, EN, RST, D, Q);
input CLK, EN, RST; // relogio, ‘enable’ e ‘reset’ (activo a 1)
input [7:0] D; // entrada D com 8 bits
output [7:0] Q; // saída Q com 8 bits...
reg [7:0] Q; // ... Que também é um ‘reg’
always @(posedge CLK or posedge RST) begin if ( RST ) Q <= 8’b0000_0000; else if ( EN ) Q <= D; end endmodule
Quando RST passa de 0 para 1, Q é colocado com o valor inicial (reset)
Senão, funciona como o FFD com enable
80 FEUP/DEEC – Laboratório de Sistemas Digitais
Um contador de 8 bits
• É um registo de 8 bits em que D = Q + 1
module conta8b( CLK, RST, Q);input CLK, RST; // relogio e ‘reset’ (activo a 1)
output [7:0] Q; // saída Q
reg [7:0] Q; // Q tem que ser declarado também como reg
wire [7:0] D; // representa o ‘fio’ ligado à entrada D do reg.
assign D = Q + 1; // a entrada D do registo é sempre igual a Q+1
always @(posedge CLK or posedge RST) // este bloco é um registo
begin // de 8 bits com reset
if ( RST ) Q <= 8’b0000_0000; else Q <= D; end endmodule Q D CLK RST CLK + 1 8 RST Q 8
81 FEUP/DEEC – Laboratório de Sistemas Digitais
Um contador de 8 bits com ‘load’
module conta8bld( CLK, RST, LD, E, Q);input CLK, RST, LD; // relogio, ‘reset’ e ‘load’
input [7:0] E; // entrada de 8 bits para carregar o contador
output [7:0] Q; // saída Q
reg [7:0] Q; // Q tem que ser declarado também como reg
wire [7:0] D; // representa o ‘fio’ ligado à entrada D do reg.
assign D = LD ? E : Q + 1; // se LD==1 então D=E senão D=Q+1
always @(posedge CLK or posedge RST) // este bloco é um registo
begin // de 8 bits com reset
if ( RST ) Q <= 8’b0000_0000; else Q <= D; end endmodule Q D CLK RST CLK + 1 8 RST Q 8 E LD 1 0 8 82 FEUP/DEEC – Laboratório de Sistemas Digitais
Um contador ‘up/down’ de 8 bits
module conta8bupdown( CLK, RST, LD, E, UD, Q);input CLK, RST, LD, UD; // relogio, ‘reset’, ‘load’ e UP/DOWN
input [7:0] E; // entrada de 8 bits para carregar o contador
output [7:0] Q; // saída Q
reg [7:0] Q; // Q tem que ser declarado também como reg
wire [7:0] D; // representa o ‘fio’ ligado à entrada D do reg.
assign D = LD ? E : ( UD ? Q + 1 : Q – 1); // UD=1 conta para cima
always @(posedge CLK or posedge RST) // este bloco é um registo
begin // de 8 bits com reset
if ( RST ) Q <= 8’b0000_0000; else Q <= D; end endmodule Q D CLK RST CLK +/-1 8 RST Q 8 E LD 1 0 8 UD addsub
83 FEUP/DEEC – Laboratório de Sistemas Digitais
Modelo geral de uma máquina de estados
(modelo de Moore)
• Registo de estado
– Entradas D (próximo estado) e saídas Q (estado presente)
• Circuito combinacional
que define o próximo estado
– Depende de Q e das entradas E e produz D
• Circuito combinacional
que produz as saídas Z
– Só depende de Q (máquina de Moore)
registo de estado Z E CLK D (próximo estado) reset (estado presente) Q 84 FEUP/DEEC – Laboratório de Sistemas Digitais
module fsm( CLK, RST, E, Z);
input CLK, RST; // relogio e ‘reset’
input E; // entrada E
output Z; // saída Z
reg [1:0] STATE; // registo de estado
reg [1:0] NEXTSTATE; // proximo estado
always @(posedge CLK or posedge RST) // registo de estado com reset begin if ( RST ) STATE <= 2’b00; else STATE <= NEXTSTATE; end
always @* // define o circuito lógico que produz NEXTSTATE case ( STATE )
// define o valor de NEXTSTATE em função de STATE e E endcase
always @* // define o circuito lógico que produz a saída Z case( STATE)
// define o valor da saída Z em função do estado actual STATE endcase
85 FEUP/DEEC – Laboratório de Sistemas Digitais
INI S1 S2 X=1 X=1 X=0 X=0 Y=0 Y=0 Y=1
Exemplo de uma máquina de estados em
Verilog (modelo de Moore)
CLK X Y
• 3 estados (INI é o estado inicial)
– Bastam 2 bits para codificar o estado
• Uma entrada X
• Uma saída Y que só depende do estado presente
– modelo de máquina de estados de Moore
86 FEUP/DEEC – Laboratório de Sistemas Digitais
module fsm( CLK, RST, X, Y);
input CLK, RST; // relogio e ‘reset’
input X; // entrada X
output Y; reg Y; // saída Y
reg [1:0] STATE; // registo de estado
reg [1:0] NEXTSTATE; // proximo estado
parameter INI = 2’b00, // definição de constantes que representam
S1 = 2’b01, // os nomes simbólicos dos estados
S2 = 2’b11;
always @(posedge CLK or posedge RST) // registo de estado begin // com reset assíncrono
if ( RST ) // define o estado inicial como INI
STATE <= INI; else STATE <= NEXTSTATE;
end
always @* // circuito lógico que produz NEXTSTATE case ( STATE )
INI: if ( X == 1’b0 ) NEXTSTATE = INI; else NEXTSTATE = S1; S1 : if ( X ) NEXTSTATE = S1; else NEXTSTATE = S2;
S2 : NEXTSTATE = INI;
endcase
always @* // circuito lógico que produz a saída Y: só depende de STATE case( STATE) INI: Y = 0; S1 : Y = 0; S2 : Y = 1; endcase endmodule
87 FEUP/DEEC – Laboratório de Sistemas Digitais
module fsm( CLK, RST, X, Y);
input CLK, RST; // relogio e ‘reset’
input X; // entrada X
output Y; // saída Y
reg [1:0] STATE; // registo de estado
reg [1:0] NEXTSTATE; // proximo estado
parameter INI = 2’b00, // definição de constantes que representam
S1 = 2’b01, // os nomes simbólicos dos estados
S2 = 2’b11;
...
assign Y = ( STATE == S2 ); // Y é 1 quando STATE for igual a S2
endmodule
Outra forma de definir o valor de Y
• Y vale 1 quando o estado presente é S2
88 FEUP/DEEC – Laboratório de Sistemas Digitais
INI S1 S2 X=1 X=1 X=0 X=0 Y=0 Y=0 Y=1
Como acrescentar uma entrada ‘restart’
(reset síncrono)
CLK X Y RESTART=1 RESTART=1 RESTART89 FEUP/DEEC – Laboratório de Sistemas Digitais
module fsm( CLK, RST, RESTART, X, Y); input CLK, RST; // relogio e ‘reset’
input X, RESTART; // entrada X e RESTART
output Y; reg Y; // saída Y
reg [1:0] STATE; // registo de estado
reg [1:0] NEXTSTATE; // proximo estado
parameter INI = 2’b00, // definição de constantes que representam
S1 = 2’b01, // os nomes simbólicos dos estados
S2 = 2’b11;
always @(posedge CLK or posedge RST) // registo de estado begin // com reset assíncrono
if ( RST ) // define o estado inicial como INI
STATE <= INI; else STATE <= NEXTSTATE;
end
always @* // circuito lógico que produz NEXTSTATE if ( RESTART ) NEXTSTATE = INI;
else
case ( STATE )
INI: if ( X == 1’b0 ) NEXTSTATE = INI; else NEXTSTATE = S1; S1 : if ( X ) NEXTSTATE = S1; else NEXTSTATE = S2;
S2 : NEXTSTATE = INI;
endcase
always @* // circuito lógico que produz a saída Y ...
endmodule
90 FEUP/DEEC – Laboratório de Sistemas Digitais
Modelo geral de uma máquina de estados
(modelo de Mealy)
• Diferença para o modelo de Moore:
• O
circuito combinacional
que produz as saídas Z
– depende do estado presente (Q) e das entradas E
registo de estado Z E CLK D (próximo estado) reset (estado presente) Q Z também depende de E
91 FEUP/DEEC – Laboratório de Sistemas Digitais
INI S1 S2 X=1, Y=0 X=1, Y=0 X=0, Y=0 X=0, Y=1
Exemplo de uma máquina de estados em
Verilog (modelo de Mealy)
CLK X Y
• Uma entrada X
• Uma saída Y que depende do estado presente e de X
– modelo de máquina de estados de Mealy
• Em cada estado, o valor de Y é determinado pelas
mesmas condições que definem o valor do próximo estado
X=0, Y=0X=1, Y=1
92 FEUP/DEEC – Laboratório de Sistemas Digitais
module fsm( CLK, RST, X, Y);
input CLK, RST; // relogio e ‘reset’
input X; // entrada X
output Y; reg Y; // saída Y
reg [1:0] STATE; // registo de estado
reg [1:0] NEXTSTATE; // proximo estado
parameter INI = 2’b00, // definição de constantes que representam
S1 = 2’b01, // os nomes simbólicos dos estados
S2 = 2’b11;
// registo de estado é igual aos exemplos anteriores
always @* // circuito lógico que produz NEXTSTATE case ( STATE )
INI: if ( X ) NEXTSTATE = S1; else NEXTSTATE = INI; S1 : if ( X ) NEXTSTATE = S1; else NEXTSTATE = S2; S2 : if ( X ) NEXTSTATE = INI; else NEXTSTATE = S2;
endcase
always @* // circuito lógico que produz a saída Y: depende de STATE e de X case( STATE) INI: Y = 0; S1 : if ( X ) Y = 0; else Y = 1; S2 : if ( X ) Y = 1; else Y = 0; endcase endmodule
93 FEUP/DEEC – Laboratório de Sistemas Digitais
Outra forma de definir as saídas em
máquinas de estados de Mealy
• Em cada estado, as saídas dependem do valor das entradas
• As condições que determinam as saídas são geralmente as
mesmas que determinam o próximo estado
– Não é necessário escrever duas vezes a instrução ‘
case
’
• Os dois blocos
always
(próximo estado e saídas) podem ser
combinados num único
94 FEUP/DEEC – Laboratório de Sistemas Digitais
always @* // circuito lógico que produz NEXTSTATE e a saída Y case ( STATE ) INI: if ( X ) begin NEXTSTATE = S1; Y = 0; end else begin NEXTSTATE = INI; Y = 0; end S1 : if ( X ) begin NEXTSTATE = S1; Y = 0; end else begin NEXTSTATE = S2; Y = 1; end S2 : if ( X ) begin NEXTSTATE = INI; Y = 1; end else begin NEXTSTATE = S2; Y = 0; end endcase