Lab2 Digital Design
Lab2 Digital Design
REFERENCE
1. Intel FPGA training
EXPERIMENT 1
Objective: Know how to implement a FSM circuit and download the cicuit into the FPGA chip.
Requirement: Implement a FSM that recognizes two specific sequences of applied input
symbols, namely four consecutive 1s or four consecutive 0s. There is an input w and an output z.
Whenever w = 1 or w = 0 for four consecutive clock pulses the value of z has to be 1; otherwise,
z = 0. Overlapping sequences are allowed, so that if w = 1 for five consecutive clock pulses the
output z will be equal to 1 after the fourth and fifth pulses.
Figure 1 illustrates the required relationship between w and z. And the state diagram for this
FSM is shown in Figure 2.
Instruction:
Students derive an FSM circuit that implements this state diagram, including the logic
expressions that feed each of the state flip-flops. Using 9 state flip-flops called y 8, …, y0 and the
one-hot state assignment given in Table 1.
Figure 2: A state diagram for the FSM Table 1: One-hot codes for the FSM
CODE
module Lab2_Exp1(
input logic w,
output logic z,
A=9'b000000001,
B=9'b000000010,
C=9'b000000100,
D=9'b000001000,
E=9'b000010000,
F=9'b000100000,
G=9'b001000000,
H=9'b010000000,
I=9'b100000000} stateCoding_t;
stateCoding_t preState=A;
stateCoding_t nextState=A;
always_ff@(posedge clk)
begin
preState <= A;
else
end
always_comb begin
case(preState)
A: begin
end
B: begin
end
C: begin
end
D: begin
E: begin
end
F: begin
end
G: begin
end
H: begin
end
I: begin
end
default nextState=A;
end
always_comb
begin
case(preState)
A:z=0;
B:z=0;
C:z=0;
D:z=0;
E:z=1;
F:z=0;
G:z=0;
H:z=0;
I:z=1;
endcase
end
endmodule
SIMULATION
https://drive.google.com/file/d/12kZ_Z2t_BD2IETf6qglJN-pferCwvuCr/view?usp=sharing
EXPERIMENT 2
Objective: Know how to implement a FSM circuit using System Verilog behavioral expressions
and download the cicuit into the FPGA chip..
Instruction:
Examine the circuit produced by Quartus open the RTL Viewer tool. Double-click on the
box shown in the circuit that represents the finite state machine, and determine whether the
state diagram that it shows properly corresponds to the one in Figure 2.
To see the state codes used for your FSM: open the Compilation Report → Analysis
and Synthesis section → State Machines.
5. Download the circuit into the FPGA chip and test its functionality.
6. Change the setting for State Machine Processing from User_Encoded to One-Hot.
Recompile the circuit and then open the report file, select the Analysis and Synthesis
section of the report, and click on State Machines. Compare the state codes shown to
those given in Table 2, and discuss any differences that you observe.
H: begin
if(w==0) nextState <= B;
else nextState <= I;
end
I: begin
if(w==0) nextState <= B;
else nextState <= I;
end
default nextState=A;
endcase
end
always_comb
Requirement: Create System Verilog code that instantiates two 4-bit shift registers; one is for
recognizing a sequence of four 0s, and the other for four 1s. Include the appropriate logic
expressions in your design to produce the output z.
Shift Register 1s
w Combinational z
circuit
Shift Register 0s
Figure
4: Sequence detector using shift registers.
Instruction:
EXPERIMENT 4
Objective: Know how to implement a digital circuit using an FSM.
Requirement: The Morse code uses patterns of short and long pulses to represent a message.
Each letter is represented as a sequence of dots (a short pulse), and dashes (a long pulse). For
example, the first eight letters of the alphabet have the following representation:
A•—
B—•••
C—•—•
D—••
E•
F ••—•
G——•
H••••
Design and implement a Morse-code encoder circuit using an FSM. The circuit take as input one
of the first eight letters of the alphabet and display the Morse code for it on LEDs.
A high-level schematic diagram of a possible circuit for the Morse-code encoder is shown in
Figure 5.
/******************************************************************/
/**** DECLARATIONS ****/
/******************************************************************/
/* Letter selection */
always @(*)
case (SW)
A_SW: begin morse_code = … ; morse_length = … ; end
…
…
endcase
/* Store the Morse code to be sent in a shift register, and its length in a counter */
always@(posedge CLOCK_50)
begin
/* if Reset = 0 then data = size = 0; otherwise, if load = 1 then data = morse_code and size = morse_length; if shift
= 1 then data[2:0]= data[3:1]) & data[3] = 1'b0 and size = size – 1’b1 */ endmodule
module modulo_counter(…);
…
Department of Electronics 22
Digital Design Laboratory (Advanced Program)
Laboratory 2:
FINITE STATE MACHINES
endmodule
Page |
Department of Electronics 23
Digital Design Laboratory (Advanced Program)
Laboratory 2:
FINITE STATE MACHINES
module lab2_4(
input logic CLOCK_50,
input [2:0] SW,
input logic rst,
output logic [1:0] LEDR,
input logic enable );
logic reset;
logic done;
half_second_counter
counter(.clk(CLOCK_50), .reset(reset), .done(done), .enable(enabl
e));
typedef enum logic[10:0]{
S= 11'b00000000001,
A= 11'b00000000010,
R= 11'b00000000100,
A1= 11'b00000001000,
B= 11'b00000010000,
R1= 11'b00000100000,
B1= 11'b00001000000,
R2= 11'b00010000000,
B2= 11'b00100000000,
R3= 11'b01000000000,
B3= 11'b10000000000
} stateCoding_t;
Department of Electronics 24
Digital Design Laboratory (Advanced Program)
Laboratory 2:
FINITE STATE MACHINES
stateCoding_t preState=S;
stateCoding_t nextState=S;
always_ff@(posedge CLOCK_50)
begin
if(rst)
preState <= S;
else
preState <= nextState;
end
always_comb begin
nextState = S;
case(preState)
S: begin
if (rst == 1 || enable == 1'b0)
nextState = S;
else if (SW == 3'b000 && enable == 1'b1)
nextState = A;
else if (SW == 3'b001 && enable ==1'b1)
nextState = B;
end
Department of Electronics 25
Digital Design Laboratory (Advanced Program)
Laboratory 2:
FINITE STATE MACHINES
A: begin
//dot
if (done==0) nextState = A;
else nextState = R;
end
R: begin
nextState = A1;
end
A1: begin
//dash
if (done==0) nextState = A1;
else nextState = S;
end
B: begin
if (done==0) nextState = B;
//dash
else nextState = R1;
end
R1: begin
nextState = B1;
end
B1:
begin
if (done==0) nextState = B1; //dot
else nextState = R2;
end
R2: begin
Department of Electronics 26
Digital Design Laboratory (Advanced Program)
Laboratory 2:
FINITE STATE MACHINES
nextState = B2;
end
B2:
begin
if (done==0) nextState = B2;
//dot
else nextState = R3;
end
R3: begin
nextState = B3;
end
B3:
begin
if (done==0) nextState = B3;
//dot
else nextState = S;
end
default: nextState = S;
endcase
end
always_comb //reset
begin
reset = 1;
case(preState)
A: reset =0;
R: reset =1;
A1: reset =0;
Department of Electronics 27
Digital Design Laboratory (Advanced Program)
Laboratory 2:
FINITE STATE MACHINES
B: reset =0;
R1: reset =1;
B1:reset =0;
R2: reset =1;
B2: reset =0;
R3: reset =1;
B3: reset =0;
default: reset = 0;
endcase
end
always_comb
begin
LEDR[0]=0;
case(preState)
A: LEDR[0]=1;
R: LEDR[0]=0;
A1: LEDR[0]=1;
B: LEDR[0]=0;
R1: LEDR[0]=0;
B1:LEDR[0]=1;
R2: LEDR[0]=0;
B2: LEDR[0]=1;
R3: LEDR[0]=0;
B3: LEDR[0]=1;
default: LEDR[0]=0;
endcase
end
Department of Electronics 28
Digital Design Laboratory (Advanced Program)
Laboratory 2:
FINITE STATE MACHINES
always_comb
begin
LEDR[1]=0;
case(preState)
A: LEDR[1]=0;
R: LEDR[1]=0;
A1: LEDR[1]=1;
B: LEDR[1]=1;
R1: LEDR[1]=0;
B1:LEDR[1]=0;
R2: LEDR[1]=0;
B2: LEDR[1]=0;
R3: LEDR[1]=0;
B3:LEDR[1]=0;
default: LEDR[1] = 0;
endcase
end
endmodule
module half_second_counter(
input logic clk,
input logic reset,
input logic enable,
output logic done
);
localparam HALF_SEC_COUNT = 25_000_000;
reg [25:0] counter = 0; // Correct bit width to hold the counter
value
Department of Electronics 29
Digital Design Laboratory (Advanced Program)
Laboratory 2:
FINITE STATE MACHINES
always @(posedge clk or posedge reset) begin
if (reset == 1'b1) begin
counter <= 0;
done <= 0;
end
else if (enable == 1'b1) begin
if (counter == HALF_SEC_COUNT - 1) begin
counter <= 0;
done <= 1;
end
else begin
counter <= counter + 1;
done <= 0;
end
end
end
endmodule
Department of Electronics 30
Digital Design Laboratory (Advanced Program)
Laboratory 2:
FINITE STATE MACHINES
Department of Electronics 31
Digital Design Laboratory (Advanced Program)