VSM‟S - VSMIT
-
Upload
khangminh22 -
Category
Documents
-
view
1 -
download
0
Transcript of VSM‟S - VSMIT
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 1
Somashekar R. Kothiwale Institute of Technology,
Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION
ENGINEERING
LAB MANUAL
SUB: HDL LABARATORY
SUB CODE: 17ECL58
SEMESTER: V
By: Prof Prashant Hebbale
Asst Prof, ECE Dept
VSMSRKIT, Nipani
SYLLABUS
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 2
Part–A: PROGRAMMING
1. Write Verilog code to realize all the logic gates
2. Write a Verilog program for the following combinational designs
a. 2 to 4 decoder
b. 8 to 3 (encoder without priority & with priority)
c. 8 to 1 multiplexer.
d. 4 bit binary to gray converter
e. Multiplexer, de-multiplexer, comparator.
3. Write a VHDL and Verilog code to describe the functions of a Full Adder using three
modeling styles.
4. Write a Verilog code to model 32 bit ALU using the schematic diagram shown below
ALU should use combinational logic to calculate an output based on the four bit
op-code input.
ALU should pass the result to the out bus when enable line in high, and tri-state
the out bus when the enable line is low.
ALU should decode the 4 bit op-code according to the example given below.
5. Develop the Verilog code for the following flip-flops, SR, D, JK and T.
6. Design a 4 bit binary, BCD counters (Synchronous reset and Asynchronous
reset) and “any sequence” counters, using Verilog code.
Part–B: INTERFACING (at least four of the following must be covered using
VHDL/Verilog)
1. Write HDL code to display messages on an alpha numeric LCD display.
2. Write HDL code to interface Hex key pad and display the key code on seven segment
display.
3. Write HDL code to control speed, direction of DC and Stepper motor.
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 3
4. Write HDL code to accept Analog signal, Temperature sensor and display the data on
LCD or Seven segment display.
5. Write HDL code to generate different waveforms (Sine, Square, Triangle, Ramp etc.,)
using DAC - change the frequency.
6. Write HDL code to simulate Elevator operation.
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 4
TOOL PROCEDURE
It is one of most popular software tool used to synthesize VHDL code. This tool
Includes many steps. To make user feel comfortable with the tool the steps are
given below:-
1 Double click on Project navigator. (Assumed icon is present on desktop).
2 Select NEW PROJECT in FILE MENU.
Enter following details as per your convenience
Project name : sample
Project location : C:\example
Top level module : HDL
3 In NEW PROJECT dropdown Dialog box, Choose your appropriate
device specification. Example is given below:
Device family : Spartan2
Device : xc2s200
Package : TQ144
TOP Level Module : HDL
Synthesis Tool : XST
Simulation : Modelsim / others
Generate sim lang : VHDL
4 In source window right click on specification, select new source
Enter the following details
Entity: sample
Architecture : Behavioral
Enter the input and output port and modes.
This will create sample.VHDL source file. Click Next and finish the
initial Project preparation.
5 Double click on synthesis. If error occurs edit and correct VHDL code.
6 Double click on Lunch modelsim (or any equivalent simulator if you are
using) for functional simulation of your design.
7 Right click on sample.VHDL in source window, select new source
Select source : Implementation constraints file.
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 5
File name : sample
This will create sample. UCF constraints file.
8 Double click on Edit constraint (Text) in process window.
Edit and enter pin constraints with syntax:
NET “NETNAME” LOC = “PIN NAME”
9 Double click on Implement, which will carry out translate, mapping,
place and route of your design. Also generate program file by double
clicking on it, intern which will create .bit file.
10 Connect JTAG cable between your kit and parallel pot of your computer.
11 Double click on configure device and select mode in which you want to
configure your device. For ex: select slave serial mode in configuration
window and finish your configuration.
12 Right click on device and select „program‟. Verify your design giving
appropriate inputs and check for the output.
13 Also verify the actual working of the circuit using pattern generator &
logic analyzer.
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 6
1. VERILOG CODE FOR ALL BASIC GATES
module gates(A, B, NOTOUT, OROUT, ANDOUT,
NOROUT,NANDOUT,XOROUT,XNOROUT);
input A,B;
output NOTOUT;
output OROUT;
output ANDOUT;
output NOROUT;
output NANDOUT;
output XOROUT;
output XNOROUT;
assign NOTOUT= ~A;
assign OROUT=A|B;
assign ANDOUT=A&B;
assign NOROUT=~(A|B);
assign NANDOUT=~(A&B);
assign XOROUT=A^B;
assign XNOROUT=~(A^B);
endmodule
RESULT:
A B NOT
OUT OROUT
ANDOUT NOROUT
NAND
OUT XOROUT XONROUT
0 0 1 0 0 1 1 0 1
0 1 1 1 0 0 1 1 0
1 0 0 1 0 0 1 1 0
1 1 0 1 1 0 0 0 1
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 7
2. VERILOG CODE FOR 2 TO 4 DECODER
module DECODER (DIN,ENABLE,D_OUT);
input [1:0] DIN;
output [3:0] D_OUT;
reg [3:0] D_OUT;
always @(DIN,ENABLE)
begin
if (ENABLE==1‟ b 1)
D_OUT=4‟b0000;
else
begin
case (DIN)
2'b00: D_OUT = 4'b0001;
2'b01: D_OUT = 4'b0010;
2'b10:D_OUT = 4'b0100;
2'b11: D_OUT = 4'b1000;
default: D_OUT =4'bXXXX;
endcase
end
end
endmodule
RESULT:-
Enable Select Lines Outputs
ENAB
LE
DIN(
1)
DIN(
0)
D_OUT(
3)
D_OUT(
2)
D_OUT(
1)
D_OUT(
0)
1 X X 0 0 0 0
0 0 0 0 0 0 1
0 0 1 0 0 1 0
0 1 0 0 1 0 0
0 1 1 1 0 0 0
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 8
2.(B)(I)VERILOG CODE FOR 8TO 3 ENCODER (WITHOUT PRIORITY)
module ENCODER8_3(ENABLE, DIN, D_OUT);
input EN;
input [7:0] DIN;
output [2:0] D_OUT;
reg [2:0] D_OUT;
always @ (DIN,ENABLE)
begin
if(ENABLE==1| )
D_OUT=3‟b000;
else
begin
case (DIN)
8'b00000001: D_OUT = 3'b000;
8'b00000010: D_OUT = 3'b001;
8'b00000100: D_OUT = 3'b010;
8'b00001000: D_OUT = 3'b011;
8'b00010000: D_OUT = 3'b100;
8'b00100000: D_OUT = 3'b101;
8'b01000000: D_OUT = 3'b110;
8'b10000000: D_OUT = 3'b111;
default: D_OUT =3'bXXX;
endcase
end
endmodule
RESULT
INPUTS OUTPUTS
ENAB
LE
DIN(
0)
DIN(
1)
DIN(
2)
DIN(
3)
DIN(
4)
DIN(
5)
DIN(
6)
DIN(
7)
D_OU
T
(0)
D_OU
T
(1)
D_OU
T
(2)
1 X X X X X X X X 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0 0 0 1 1
0 0 0 0 0 1 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 1 0 1
0 0 0 0 0 0 0 1 0 1 1 0
0 0 0 0 0 0 0 0 1 1 1 1
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 9
2.(B)(II)VERILOG CODE FOR 8TO 3 ENCODER (WITH PRIORITY)
module ENCODER8_3(ENABLE, DIN, D_OUT);
input EN;
input [7:0] DIN;
output [2:0] D_OUT;
reg [2:0] D_OUT;
always @ (DIN,ENABLE)
begin
if(ENABLE==1| )
D_OUT=3‟b000;
else
begin
casex (DIN)
8'b00000001: D_OUT = 3'b000;
8'b0000001x: D_OUT = 3'b001;
8'b000001xx: D_OUT = 3'b010;
8'b00001xxx: D_OUT = 3'b011;
8'b0001xxxx: D_OUT = 3'b100;
8'b001xxxxx: D_OUT = 3'b101;
8'b01xxxxxx: D_OUT = 3'b110;
8'b1xxxxxxx: D_OUT = 3'b111;
default: D_OUT =3'bXXX;
endcase
end
endmodule
RESULT
INPUTS OUTPUTS
ENAB
LE
DIN(
0)
DIN(
1)
DIN(
2)
DIN(
3)
DIN(
4)
DIN(
5)
DIN(
6)
DIN(
7)
D_OU
T
(0)
D_OU
T
(1)
D_OU
T
(2)
1 X X X X X X X X 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0
0 X 1 0 0 0 0 0 0 0 0 1
0 X X 1 0 0 0 0 0 0 1 0
0 X X X 1 0 0 0 0 0 1 1
0 X X X X 1 0 0 0 1 0 0
0 X X X X X 1 0 0 1 0 1
0 X X X X X X 1 0 1 1 0
0 X X XX X X X X 1 1 1 1
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 10
2. (C)VERILOG CODE FOR 8TO 1 MUX
module MUX8_1(A, SEL, D_OUT);
input [7:0] A;
input [2:0] SEL;
output D_OUT;
reg D_OUT;
always@ (A,SEL )
begin
case (SEL)
3'b000:D_OUT=A[0];
3'b001:D_OUT=A[1];
3'b010:D_OUT=A[2];
3'b011:D_OUT=A[3];
3'b100:D_OUT=A[4];
3'b101:D_OUT=A[5];
3'b110:D_OUT=A[6];
3'b111:D_OUT=A[7];
default: D_OUT =3'b000;
endcase
end
endmodule
RESULT:
INPUTS OUTPU
T
SEL[2
]
SEL[1
]
SEL[0
]
D_OUT
0 0 0 A[0]
0 0 1 A[1]
0 1 0 A[2]
0 1 1 A[3]
1 0 0 A[4]
1 0 1 A[5]
1 1 0 A[6]
1 1 1 A[7]
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 11
2. (D) VERILOG CODE FOR BINARY TO GRAY CONVERTER
module BINARY_GRAY(B, G);
input [3:0] B;
output [3:0] G;
assign G[3] = B[3];
assign G[2] = B[3] ^ B[2];
assign G[1] = B[2] ^ B[1];
assign G[0] = B[1] ^ B[0];
endmodule
G2 G1 G0
B1
B0
B1
B0
B1 B0
B3 B2 00 01 11 10 B3 B2 00 01 11 10 B3 B2 00 01 11 10
00 00 1 1 00 1 1
01 1 1 1 1 01 1 1 01 1 1
11 11 1 1 11 1 1
10 1 1 1 1 10 1 1 10 1 1
G3=B
3
G2 = B3 B2‟ + B3 B2‟
G2 = B3 B2
G1 = B2 B1‟ + B1 B2‟
G1 = B1 B2
G0 = B1‟B0 + B1
B0‟
G0 = B1 B0
RESULT:
Binary inputs Gray Outputs
B3 B2 B1 B0 G3 G2 G1 G0
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 1
0 0 1 0 0 0 1 1
0 0 1 1 0 0 1 0
0 1 0 0 0 1 1 0
0 1 0 1 0 1 1 1
0 1 1 0 0 1 0 1
0 1 1 1 0 1 0 0
1 0 0 0 1 1 0 0
1 0 0 1 1 1 0 1
1 0 1 0 1 1 1 1
1 0 1 1 1 1 1 0
1 1 0 0 1 0 1 0
1 1 0 1 1 0 1 1
1 1 1 0 1 0 0 1
1 1 1 1 1 0 0 0
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 12
2.(E) (I) VERILOG CODE FOR 1:4 DEMUX
module DEMUX1_4(D_IN, SEL, D_OUT);
input D_IN;
input [1:0] SEL;
output [3:0] D_OUT;
reg[3:0] D_OUT;
always @(D_IN, SEL)
begin
case (SEL)
2b00:D_OUT[0]=D_IN;
2'b01:D_OUT[1]=D_IN;
2'b10:D_OUT[2]=D_IN;
2'b11:D_OUT[3]=D_IN;
default: D_OUT=3'b000;
endcase
end
endmodule
RESULT:-
SELECT INPU
T
OUTPUT
SEL[
1]
SEL[
0]
D_IN D_OUT[
3]
D_OUT[
2]
D_OUT[
1]
D_OUT[
0]
0 0 1 X X X 1
0 1 1 X X 1 X
1 0 1 X 1 X X
1 1 1 1 X X X
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 13
2 (E)(II). COMBINATIONAL VERILOG CODE FOR 4-BIT COMPARATOR
module COMPARATER(A, B, ALB,AGB,AEB);
input [3:0] A;
input [3:0] B;
output ALB;
output AGB;
output AEB;
reg ALB,AGB,AEB;
always @ (A,B)
begin
if (A<B)
ALB=1'b1;
else
ALB=1'b0;
if (A>B)
AGB=1'b1;
else
AGB=1'b0;
if (A==B)
AEB=1'b1;
else
AEB=1'b0;
end
endmodule
RESULT:
A B A=B A>B A<B
000
0
000
0
1 0 0
000
0
010
0
0 1 0
010
0
000
1
0 0 1
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 14
3.VERILOG CODE FOR THE IMPLEMENTATION OF HALF ADDER.
DATA FLOW STYLE
module HALFADDER(A, B, SUM, CARRY);
input A, B;
output SUM, CARRY;
assign SUM = A^B;
assign CARRY = A & B;
endmodule
BEHAVIORAL STYLE
module HALFADDER(AB, SUM, CARRY);
input[1:0] AB; RESULT
output SUM,CARRY;
reg SUM,CARRY;
always@(AB)
begin
case AB
2‟b00:begin SUM=1‟b0; CARRY=1‟b0;end
2‟b01:begin SUM=1‟b1; CARRY=1‟b0;end
2‟b10:begin SUM=1‟b1; CARRY=1‟b0;end
2‟b11:begin SUM=1‟b0; CARRY=1‟b1;end
endcase
end
endmodule
STRUCTURAL STYLE
module HALFADDER(A, B, SUM, CARRY);
input A,B;
output SUM,CARRY;
XOR U1 ( SUM , A, B);
AND U2 (CARRY, A, B);
Endmodule
Inputs Outputs
A B Sum(S) Carry(C)
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 15
TRUTH TABLE
Inputs Outputs
A B C Sum Carry
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
SUM
BC
CARRY
BC
A 00 01 11 10 A 00 01 11 10
0 0 1 0 1 0 0 0 1 0
1 1 0 1 0 1 0 1 1 1
SUM=A‟B‟C+A‟BC‟+AB‟C‟
+ABC
SUM = A B C
CARRY = AB+BC+AC
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 16
3b.VERILOG CODE FOR THE IMPLEMENTATION OF FULL ADDER.
DATA FLOW STYLE
module FULLADDER(A, B, CIN, SUM, CARRY);
input A, B,CIN;
output SUM, CARRY;
assign SUM = A^B^CIN;
assign CARRY = (A & B)|(B & CIN)|(A & CIN);
endmodule
BEHAVIORAL STYLE
module FULLADDER(ABC, SUM, CARRY);
input[2:0] ABC;
output SUM,CARRY;
reg SUM,CARRY;
always@(ABC)
begin
case (ABC)
3‟b000:begin SUM=1‟b0; CARRY=1‟b0;end
3‟b001:begin SUM=1‟b1; CARRY=1‟b0;end
3‟b010:begin SUM=1‟b1; CARRY=1‟b0;end
3‟b011:begin SUM=1‟b0; CARRY=1‟b1;end
3‟b100:begin SUM=1‟b1; CARRY=1‟b0end
3‟b101:begin SUM=1‟b0; CARRY=1‟b1;end
3‟b110:begin SUM=1‟b0; CARRY=1‟b1;end
3‟b111:begin SUM=1‟b1; CARRY=1‟b1;end
endcase
end
endmodule
STRUCTURAL STYLE
module FULLADDER(A, B, CIN, SUM, CARRY);
input A,B, CIN;
output SUM,CARRY;
wire Temp1, Temp2, Temp3;
HALFADDER HA1 (A, B, Temp1, Temp2);
HALFADDER HA2 (CIN, Temp1, SUM, Temp3);
assign CARRY=Temp3| Temp2;
endmodule
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 17
RESULT:-
Inputs Outputs
A B C Sum Carry
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 18
4. VERILOG CODE FOR 8-BIT ALU MODEL.
module ALU(A, B, SEL,EN,Y);
input [31:0] A,B;
input EN;
input [2:0] SEL;
output [31:0] Y;
reg [31:0]Y;
always @(A, B , SEL)
begin
if (EN==1)
begin
case (SEL)
3'b000:Y=A+B;
3'b001:Y=A-B;
3'b010:Y=~A;
3'b011:Y=A&B;
3'b100:Y=A|B;
3'b101:Y=~(A&B);
3'b101:Y=~(A|B);
3'b111:Y=A^B;
endcase
end
else
begin
Y=31‟bZ;
end
end
endmodule
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 19
5(A). VERILOG CODE FOR SR F/F
module SR_FF(SR, CLK, RST, Q, QBAR);
input [1:0]SR;
input RST, CLK;
output Q,QBAR;
reg Q,QBAR;
always @ (posedge CLK)
begin
if (RST==1)
begin
Q=0;
QBAR=1;
end
else
begin
case (SR)
2'b00: begin Q=Q; QBAR=QBAR; end
2'b01: begin Q=0; QBAR=1; end
2'b10: begin Q=1; QBAR=0; end
2'b11: begin Q=1'bX; QBAR=1'bX; end
endcase
end
end
endmodule
RESULT:
INPUTS OUTPUTS
RST S R Q QBA
R
1 X X 0 1
0 0 0 0 1
0 0 1 0 1
0 1 0 1 0
0 1 1 X X
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 20
5(B). VERILOG CODE FOR D-FLIPFLOP.
module D_FF(D, RESET, CLK, Q, QBAR);
input D;
input RESET;
input CLK;
output Q;
output QBAR;
reg Q,QBAR;
always@(posedge CLK)
begin
if (RESET==1)
begin
Q=0;
QBAR=1;
end
else
begin
Q=D;
QBAR=~D;
end
end
endmodule
RESULT:-
RESE
T
D Q QBA
R
1 X 0 1
0 0 0 1
0 1 1 0
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 21
5(C) . VERILOG CODE FOR JK-FLIPFLOP.
module JK_FF(J, K, CLK, RESET, Q, QBAR);
input [1:0]JK;
input CLK,RESET;
output Q, QBAR;
reg Q, QBAR;
reg [22:0] div;
reg clkdiv;
always @ (posedge CLK)
begin
div = div+1'b1;
clkdiv = div[22];
end
always @ (posedge clkdiv)
begin
if(RESET==1)
begin
Q=0;
QBAR=1;
end
else
begin
case (JK)
2'b00: begin Q=Q; QBAR=QBAR; end
2'b01: begin Q=0; QBAR=1; end
2'b10: begin Q=1; QBAR=0; end
2'b11: begin Q=~(Q); QBAR=~(QBAR); end
endcase
end
end
endmodule
RESULT:-
RESE
T J K Q QBAR
1 X X 0 1
0 0 0 0 1
0 0 1 0 1
0 1 0 1 0
0 1 1 1 0
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 22
5(D) . VERILOG CODE FOR T-FLIPFLOP.
module T_FF(T, CLK, RESET, Q, QBAR);
input T, CLK, RESET;
output Q, QBAR;
reg Q,QBAR;
always @ (posedge CLK)
begin
div = div+1'b1;
clkdiv = div[22];
end
always @ (posedge clkdiv)
begin
if (RESET==1)
begin
Q=0;
QBAR=1;
end
else
case T
1‟b0:begin Q=Q; QBAR=QBAR; end
1‟b1:begin Q=~(Q); QBAR=~(QBAR)S; end
endcase
end
endmodule
RESULT:
RESE
T T Q QBAR
1 X 0 1
0 0 Q QBAR
0 1 QBAR Q
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 23
6. Design a 4 bit binary, BCD counters (Synchronous reset and Asynchronous reset) and
“any sequence” counters, using Verilog code.
6).A).VERILOGCODE FOR SYNCHRONOUS UP COUNTER
Module sys_up (clk,q,qbar);
Input clk;
output [3:0]q,qbar;
Wire s0,s1
Supply1 vdd;
JK_FF jkff0(vdd,vdd,clk,q[0],qbar[0]);
JK_FF jkff1(vdd,vdd,clk,q[1],qbar[1]);
Assign s1=s0q[0]&q[1];
JK_FF jkff2(s0,s0,clk,q[2],qbar[2]);
Assign s1=s0 & q[2];
JK_FF jkff3(s1,s1,clk,q[3],qbar[3]);
endmodule
Module JK_FF(J,K,clk,q,qbar);
Input clk;
Input JK;
Output q,qbar;
Reg q,qbar;
Initial
Begin q=1‟b0;qbar=1‟b1;end
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 24
Always @(posedge clk)
Begin
Q=(J&(~q))|((~K)&q);
Qbar=((~q));
End
endmodule
RESULT:-
Clock Q3 Q2 Q1 Q0
0 0 0 0 0
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
8 1 0 0 0
9 1 0 0 1
10 1 0 1 0
11 1 0 1 1
12 1 1 0 0
13 1 1 0 1
14 1 1 1 0
15 1 1 1 1
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 25
6).B).VERILOGCODE FOR SYNCHRONOUS DOWN COUNTER
Module sys_down (clk,q,qbar);
Input clk;
Output [3:0]q,qbar;
Wire s0,s1
Supply1 vdd;
JK_FF jkff0(vdd,vdd,clk,q[0],qbar[0]);
JK_FF jkff1(vdd,vdd,clk,q[1],qbar[1]);
Assign s0=q[0]&qbar[1];
JK_FF jkff2(s0,s0,clk,q[2],qbar[2]);
Assign s1=s0 & qbar[2];
JK_FF jkff3(s1,s1,clk,q[3],qbar[3]);
endmodule
Module JK_FF(J,K,clk,q,qbar);
Input clk;
Input JK;
Output q,qbar;
Reg q,qbar;
Initial
Begin q=1‟b0;qbar=1‟b1;end
Always @(posedge clk)
Begin
Q=(J&(~q))|((~K)&q);
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 26
Qbar=~q;
End
Endmodule
RESULT:-
Clock Q3 Q2 Q1 Q0
15 1 1 1 1
14 1 1 1 0
13 1 1 0 1
12 1 1 0 0
11 1 0 1 1
10 1 0 1 0
9 1 0 0 1
8 1 0 0 0
7 0 1 1 1
6 0 1 1 0
5 0 1 0 1
4 0 1 0 0
3 0 0 1 1
2 0 0 1 0
1 0 0 0 1
0 0 0 0 0
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 27
VERILOG CODE FOR ASYNCHRONOUS COUNTER
6) C).VERILOG CODE FOR ASYNCHRONOUSUP COUNTER
Module sys_down (clk,q,qbar);
Input clk;
Output [3:0]q,qbar;
Supply1 vdd;
JK_FF jkff0(vdd,vdd,clk,q[0],qbar[0]);
JK_FF jkff1(vdd,vdd,q[0],Q[1],qbar[1]);
JK_FF jkff2(vdd,vdd,q[1],q[2],qbar[2]);
JK_FF jkff3(vdd,vdd,q[2],q[3],qbar[3]);
endmodule
Module JK_FF(J,K,clk,q,qbar);
Input clk;
Input JK;
Output q,qbar;
Reg q,qbar;
Initial
Begin q=1‟b0;qbar=1‟b1;end
Always @(posedge clk)
Begin
q=(J&(~q))|((~K)&q);
qbar=~q;
End
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 28
Endmodule
RESULT:-
Clock Q3 Q2 Q1 Q0
0 0 0 0 0
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
8 1 0 0 0
9 1 0 0 1
10 1 0 1 0
11 1 0 1 1
12 1 1 0 0
13 1 1 0 1
14 1 1 1 0
15 1 1 1 1
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 29
6) C).VERILOG CODE FOR ASYNCHRONOUS DOWN COUNTER
Module sys_down (clk,q,qbar);
Input clk;
Output [3:0]q,qbar;
Supply1 vdd;
JK_FF jkff0(vdd,vdd,clk,q[0],qbar[0]);
JK_FF jkff1(vdd,vdd,qbar[0],q[1],qbar[1]);
JK_FF jkff2(vdd,vdd,qbar[1],q[2],qbar[2]);
JK_FF jkff3(vdd,vdd,qbar[2],q[3],qbar[3]);
endmodule
Module JK_FF(J,K,clk,q,qbar);
Input clk;
Input JK;
Output q,qbar;
Reg q,qbar;
Initial
Begin q=1‟b0;qbar=1‟b1;end
Always @(posedge clk)
Begin
q=(J&(~q))|((~K)&q);
qbar=~q;
End
Endmodule
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 30
RESULT:-
Clock Q3 Q2 Q1 Q0
15 1 1 1 1
14 1 1 1 0
13 1 1 0 1
12 1 1 0 0
11 1 0 1 1
10 1 0 1 0
9 1 0 0 1
8 1 0 0 0
7 0 1 1 1
6 0 1 1 0
5 0 1 0 1
4 0 1 0 0
3 0 0 1 1
2 0 0 1 0
1 0 0 0 1
0 0 0 0 0
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 31
INTERFACING
1 Write HDL code to display messages on an alpha numeric LCD display.
VHDL CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE WORK.LCD_GRAP.ALL;
ENTITY HEXKEY_LCD IS
PORT (
CLK: IN STD_LOGIC; -- 16 MHZ CLOCK
RESET: IN STD_LOGIC; -- MASTER RESET PIN
LCD_RW : OUT STD_LOGIC;
LCD_SELECT : OUT STD_LOGIC;
LCD_ENABLE : OUT STD_LOGIC;
ROW: IN STD_LOGIC_VECTOR(0 TO 3); -- THIS ARE THE ROW LINES
LCD_DATA: OUT STD_LOGIC_VECTOR (7 DOWNTO 0); -- GIVES REGISTERED
DATA OUTPUT
COL: INOUT STD_LOGIC_VECTOR(0 TO 3));
END HEXKEY_LCD;
ARCHITECTURE HEXKEY_BEH OF HEXKEY_LCD IS
TYPE KEYPAD_STATE_TYPE IS (WAIT_R_0, C3, C2, C1, C0, FOUND, SAMPLE,
WAIT_R_1); --
STATE NAMES
TYPE STATE_TYPE IS (INITIAL,DISPLAY,CLEAR,LOCATION,PUTCHAR);
SIGNAL STATE,NEXT_STATE: STATE_TYPE;
-- CLEAR SCREEN.
CONSTANT CLR: STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001";
-- DISPLAY ON, WITHOUT CURSOR.
CONSTANT DON: STD_LOGIC_VECTOR(7 DOWNTO 0) := "00001100";
-- FUNCTION SET FOR 8-BIT DATA TRANSFER AND 2-LINE DISPLAY
CONSTANT SET: STD_LOGIC_VECTOR(7 DOWNTO 0) := "00111000";
--FREQUENCY DIVIDER
CONSTANT BIG_DELAY: INTEGER :=16;
CONSTANT SMALL_DELAY: INTEGER :=2;
CONSTANT REG_SETUP: INTEGER :=1;
SIGNAL CS, NS: KEYPAD_STATE_TYPE; -- SIGNALS FOR CURRENT AND
NEXT STATES
SIGNAL DIV_REG: STD_LOGIC_VECTOR (16 DOWNTO 0); -- CLOCK DIVIDE
REGISTER
SIGNAL DCLK,DDCLK: STD_LOGIC; -- THIS HAS THE DIVIDED CLOCK.
SIGNAL COL_REG_VALUE: STD_LOGIC_VECTOR (0 TO 3);
SIGNAL R1: STD_LOGIC; -- ROW DETECTION SIGNAL
SIGNAL KEY_VALUE: STD_LOGIC_VECTOR (7 DOWNTO 0);
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 32
SIGNAL DATA: STD_LOGIC_VECTOR (7 DOWNTO 0);
BEGIN
R1 <= ROW(3) OR ROW(2) OR ROW(1) OR ROW(0);
---------------------------- BEGINING OF FSM1 (KEYPAD SCANNER) ---------------------
----------
SYNC_PROC: PROCESS (DCLK, RESET, KEY_VALUE) -- THIS IS THE
SYNCHRONOUS PART
BEGIN
IF (RESET = '0') THEN -- YOU MUST HAVE A RESET FOR FSM TO SYNTHESIZE
PROPERLY
CS <= WAIT_R_0;
ELSIF (DCLK'EVENT AND DCLK = '1') THEN
CS <= NS;
END IF;
END PROCESS;
COMB_PROC: PROCESS (CS, R1, COL_REG_VALUE) -- THIS IS THE
COMBINATIONAL PART
BEGIN
CASE CS IS
---------------------------------------------------------------------------------------------------
WHEN WAIT_R_0 => -- WAITS TILL A BUTTON IS PRESSED
COL <= "1111"; -- KEEP ALL COLUMNS ACTIVATED
IF R1 = '1' THEN -- A BUTTON WAS PRESSED. BUT WHICH ONE?
NS <= C3; -- LET'S FIND OUT
ELSE
NS <= WAIT_R_0;
END IF;
---------------------------------------------------------------------------------------------------
WHEN C3 => --
COL <= "0001"; -- ACTIVATE COLUMN 3
IF R1 = '0' THEN -- THIS MEANS BUTTON WAS NOT IN COLUMN 3
NS <= C2; -- SO CHECK IF IT WAS IN COLUMN 2
ELSE NS <= FOUND; -- BUTTON WAS IN COLUMN 3
END IF;
---------------------------------------------------------------------------------------------------
WHEN C2 => --
COL <= "0010"; -- ACTIVATE COLUMN 2
IF R1 = '0' THEN -- THIS MEANS BUTTON WAS NOT IN COLUMN 2
NS <= C1; -- SO CHECK IF IT WAS IN COLUMN 1
ELSE
NS <= FOUND; -- BUTTON WAS IN COLUMN 2
END IF;
---------------------------------------------------------------------------------------------------
WHEN C1 => --
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 33
COL <= "0100"; -- ACTIVATE COLUMN 1
IF R1 = '0' THEN -- THIS MEANS BUTTON WAS NOT IN COLUMN 1
NS <= C0; -- SO CHECK IF IT WAS IN COLUMN 0
ELSE
NS <= FOUND; -- BUTTON WAS IN COLUMN 1
END IF;
---------------------------------------------------------------------------------------------------
WHEN C0 => --
COL <= "1000"; -- ACTIVATE COLUMN 0
IF R1 = '0' THEN -- THIS MEANS BUTTON WAS NOT IN COLUMN 0 ??
NS <= WAIT_R_0; -- SO THE BUTTON MUST HAVE BEEN DEPRESSED FAST
ELSE
NS <= FOUND; -- BUTTON WAS IN COLUMN 3
END IF;
---------------------------------------------------------------------------------------------------
WHEN FOUND => --
COL <= COL_REG_VALUE;
IF R1 = '0' THEN -- THIS MEANS BUTTON IS DEPRESSED
NS <= WAIT_R_0; -- SO GO BACK TO INITIAL STATE
ELSE
NS <= SAMPLE; -- OTHERWISE WRITE THE KEY VALUE TO DATA REGISTER
END IF;
---------------------------------------------------------------------------------------------------
WHEN SAMPLE => -- THIS STATE WILL GENERATE A SIGNAL WITH ONE
CLOCK PERIOD FOR SAMPLING
COL <= COL_REG_VALUE;
NS <= WAIT_R_1; -- OTHERWISE WAIT TILL BUTTON IS PRESSED
---------------------------------------------------------------------------------------------------
WHEN WAIT_R_1 => --
COL <= COL_REG_VALUE;
IF R1 = '0' THEN -- THIS MEANS BUTTON WAS DEPRESSED
NS <= WAIT_R_0; -- SO GO BACK TO INITIAL STATE
ELSE
NS <= WAIT_R_1; -- OTHERWISE WAIT TILL BUTTON IS PRESSED
END IF;
---------------------------------------------------------------------------------------------------
END CASE;
END PROCESS;
---------------------------------------------------------------------------------------------------
WRITE_DATA: PROCESS (DCLK, CS, KEY_VALUE) -- WRITE VALID DATA TO
REGISTER
BEGIN
IF DCLK'EVENT AND DCLK = '0' THEN -- ON THE FALLING EDGE
IF CS = FOUND THEN
DATA <= KEY_VALUE;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 34
END IF;
END IF;
END PROCESS; -- WRITE_DATA
---------------------------------------------------------------------------------------------------
COL_REG: PROCESS (DCLK, CS, COL) -- THIS IS THE COLUMN VALUE
REGISTER
BEGIN
IF (DCLK'EVENT AND DCLK = '0') THEN -- REGISTER THE COL VALUE ON
THE FALLING EDGE
IF (CS = C3 OR CS = C2 OR CS = C1 OR CS = C0) THEN -- PROVIDED WE'RE IN
STATES C3 THRU C0 ONLY
COL_REG_VALUE <= COL; -- OTHERWISE THE COLUMN VALUE IS NOT
VALID
END IF;
END IF;
END PROCESS; -- COL_REG
---------------------------------------------------------------------------------------------------
DECODER: PROCESS(ROW, COL_REG_VALUE) -- DECODES BINARY VALUE
OF PRESSED KEY FROM ROW AND
COLUMN
VARIABLE CODE: STD_LOGIC_VECTOR (0 TO 7);
BEGIN
CODE := (ROW & COL_REG_VALUE);
CASE CODE IS
-- COL
-- ROW 0 0123
WHEN "00010001" => KEY_VALUE <= ZERO;--KEY 0
WHEN "00010010" => KEY_VALUE <= ONE;--KEY 1
WHEN "00010100" => KEY_VALUE <= TWO;--KEY 2
WHEN "00011000" => KEY_VALUE <= THREE;--KEY 3
-- ROW 1
WHEN "00100001" => KEY_VALUE <= FOUR;--KEY 4
WHEN "00100010" => KEY_VALUE <= FIVE;--KEY 5
WHEN "00100100" => KEY_VALUE <= SIX;--KEY 6
WHEN "00101000" => KEY_VALUE <= SEVEN;--KEY 7
-- ROW 2
WHEN "01000001" => KEY_VALUE <= EIGHT;--KEY 8
WHEN "01000010" => KEY_VALUE <= NINE;--KEY 9
WHEN "01000100" => KEY_VALUE <= A;--KEY A
WHEN "01001000" => KEY_VALUE <= B;--KEY B
-- ROW 3
WHEN "10000001" => KEY_VALUE <= C;--KEY C
WHEN "10000010" => KEY_VALUE <= D;--KEY D
WHEN "10000100" => KEY_VALUE <= E;--KEY E
WHEN "10001000" => KEY_VALUE <= F;--KEY F
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 35
WHEN OTHERS => KEY_VALUE <= SPACE; -- JUST IN CASE
END CASE;
END PROCESS; -- DECODER
---------------------------- END OF FSM1 (KEYPAD SCANNER) -----------------------------
----------
-- SELECT THE APPROPRIATE LINES FOR SETTING FREQUENCY
CLK_DIV: PROCESS (CLK, DIV_REG) -- CLOCK DIVIDER
BEGIN
IF (CLK'EVENT AND CLK='1') THEN
DIV_REG <= DIV_REG + 1;
END IF;
END PROCESS;
DCLK <= DIV_REG(8);
DDCLK<=DIV_REG(10);
---------------------------- END OF CLOCK DIVIDER -------------------------------------------
------
LCD_RW<='0';
PROCESS (DDCLK,RESET)
VARIABLE COUNT: INTEGER RANGE 0 TO BIG_DELAY;
VARIABLE C1 : STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
IF RESET = '0' THEN
STATE<=INITIAL;
COUNT:=0;
LCD_ENABLE<='0';
LCD_SELECT<='0';
C1 := "01111111";
ELSIF DDCLK'EVENT AND DDCLK = '1' THEN
CASE STATE IS
WHEN INITIAL => -- TO SET THE FUNCTION
IF COUNT=REG_SETUP THEN
LCD_ENABLE<='1';
ELSE
LCD_ENABLE<='0';
END IF;
LCD_DATA<=SET;
LCD_SELECT<='0';
IF COUNT=SMALL_DELAY THEN
STATE<=DISPLAY;
COUNT:=0;
ELSE
COUNT:=COUNT+1;
END IF;
WHEN DISPLAY => -- TO SET DISPLAY ON
IF COUNT=REG_SETUP THEN
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 36
LCD_ENABLE<='1';
ELSE
LCD_ENABLE<='0';
END IF;
LCD_DATA<=DON;
LCD_SELECT<='0';
IF COUNT=SMALL_DELAY THEN
STATE<=CLEAR;COUNT:=0;
ELSE
COUNT:=COUNT+1;
END IF;
WHEN CLEAR => -- CLEAR THE SCREEN
IF COUNT=REG_SETUP THEN
LCD_ENABLE<='1';
ELSE
LCD_ENABLE<='0';
END IF;
LCD_DATA<=CLR;
LCD_SELECT<='0';
IF COUNT=BIG_DELAY THEN
STATE<=LOCATION;
COUNT:=0;
ELSE
COUNT:=COUNT+1;
END IF;
WHEN LOCATION => -- CLEAR THE SCREEN
IF COUNT=REG_SETUP THEN
LCD_ENABLE<='1';
ELSE
LCD_ENABLE<='0';
END IF;
IF COUNT=0 THEN
IF C1="10001111" THEN
C1:="11000000";
ELSIF C1="11001111" THEN
C1:="10000000";
ELSE
C1:=C1+'1';
END IF;
END IF;
LCD_DATA <= C1 ;
LCD_SELECT<='0';
IF COUNT=BIG_DELAY THEN
STATE<=PUTCHAR;
COUNT:=0;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 37
ELSE
COUNT:=COUNT+1;
END IF;
WHEN PUTCHAR=> -- DISPLAY THE CHARACTER ON THE LCD
IF COUNT=REG_SETUP THEN
LCD_ENABLE<='1';
ELSE
LCD_ENABLE<='0';
END IF;
CASE C1 IS
WHEN "10000000" => LCD_DATA<= H ;--SIGLE LINE
WHEN "10000001" => LCD_DATA<= E ;--SIGLE LINE
WHEN "10000010" => LCD_DATA<= X ;--SIGLE LINE
WHEN "10000011" => LCD_DATA<= SPACE ;--SIGLE LINE
WHEN "10000100" => LCD_DATA<= SPACE ;--SIGLE LINE
WHEN "10000101" => LCD_DATA<= K ;--SIGLE LINE
WHEN "10000110" => LCD_DATA<= E ;--SIGLE LINE
WHEN "10000111" => LCD_DATA<= Y ;--SIGLE LINE
WHEN "10001000" => LCD_DATA<= B ;
WHEN "10001001" => LCD_DATA<= O ;
WHEN "10001010" => LCD_DATA<= A ;
WHEN "10001011" => LCD_DATA<= R ;
WHEN "10001100" => LCD_DATA<= D ;
WHEN "10001101" => LCD_DATA<= SPACE ;
WHEN "10001110" => LCD_DATA<= SPACE ;
WHEN "10001111" => LCD_DATA<= SPACE;
WHEN "11000000" => LCD_DATA<= K ;--SIGLE LINE
WHEN "11000001" => LCD_DATA<= E ;--SIGLE LINE
WHEN "11000010" => LCD_DATA<= Y ;--SIGLE LINE
WHEN "11000011" => LCD_DATA<= P ;--SIGLE LINE
WHEN "11000100" => LCD_DATA<= R ;--SIGLE LINE
WHEN "11000101" => LCD_DATA<= E ;--SIGLE LINE
WHEN "11000110" => LCD_DATA<= S ;--SIGLE LINE
WHEN "11000111" => LCD_DATA<= S ;--SIGLE LINE
WHEN "11001000" => LCD_DATA<= E ;
WHEN "11001001" => LCD_DATA<= D ;
WHEN "11001010" => LCD_DATA<= SPACE ;
-- WHEN "11001011" => LCD_DATA<= RIGHT_ARROW ;
WHEN "11001100" => LCD_DATA<= SPACE ;
WHEN "11001101" => LCD_DATA<= DATA ;
WHEN "11001110" => LCD_DATA<= SPACE ;
WHEN "11001111" => LCD_DATA<= SPACE;
WHEN OTHERS => NULL;
END CASE ;
LCD_SELECT<='1';
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 38
IF COUNT=SMALL_DELAY THEN
STATE<=LOCATION;
COUNT:=0;
ELSE
COUNT:=COUNT+1;
END IF;
END CASE;
END IF;
END PROCESS;
END HEXKEY_BEH;
VERILOG CODE
MODULE SEVEN_VERILOG(
INPUT CLK,
OUTPUT REG [3:0] CNTR,
OUTPUT REG [7:0] SEVEN
);
REG [20:0]CLK_DIV;
REG CLK1;
REG [1:0] STATE;
ALWAYS@(POSEDGE CLK)
BEGIN
CLK_DIV= CLK_DIV+1;
CLK1=CLK_DIV[19];
END
ALWAYS @(POSEDGE CLK1)
STATE = STATE +1;
ALWAYS @(STATE)
BEGIN
CASE(STATE) // *GFEDCBA
2'B00: SEVEN=8'B01110110;
2'B01: SEVEN=8'B01111001;
2'B10: SEVEN=8'B00111000;
2'B11: SEVEN=8'B01110011;
DEFAULT: SEVEN=8'B01111111;
ENDCASE
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 39
END
ALWAYS@(STATE)
BEGIN
CASE(STATE)
2'B00: CNTR=4'B1110;
2'B01: CNTR=4'B1101;
2'B10: CNTR=4'B1011;
2'B11: CNTR=4'B0111;
DEFAULT: CNTR=4'B1111;
ENDCASE
END
ENDMODULE
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 40
2. Write HDL code to interface Hex key pad and display the key code on seven segment
display.
VHDL CODING
------------------------------------
--CODE FOR SIMULATING 16 KEYS USING
--KEYBOARD PROVIDED ON SPARTAN BOARD
------------------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY KEY_40 IS
PORT ( SCAN_L : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
READ_L_IN : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
CLK : IN STD_LOGIC;
DISP_CNT: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
DISP : OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END KEY_40;
ARCHITECTURE BEHAVIORAL OF KEY_40 IS
SIGNAL DISP1 : STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL SCAN_L_SIG : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL CLK_DIV : STD_LOGIC_VECTOR( 11 DOWNTO 0);
SIGNAL CLK_4K : STD_LOGIC;
SIGNAL CNT_2BIT : STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL READ_L : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
---------------------------
--CLOCK DIVISION TO 4KHZ
--------------------------
PROCESS(CLK)
BEGIN
IF CLK='1' AND CLK'EVENT THEN
CLK_DIV <= CLK_DIV + '1';
END IF;
END PROCESS;
---------------------------
CLK_4K <= CLK_DIV(11);
---------------------------
-- 2 BIT COUNTER
--------------------------
PROCESS(CLK_4K)
BEGIN
IF CLK_4K = '1' AND CLK_4K'EVENT THEN
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 41
CNT_2BIT <= CNT_2BIT + '1';
END IF;
END PROCESS;
--------------------------
-- SCANNING THE LINES
--------------------------
PROCESS(CNT_2BIT)
BEGIN
CASE CNT_2BIT IS
WHEN "00" => SCAN_L_SIG <= "0001";
WHEN "01" => SCAN_L_SIG <= "0010";
WHEN "10" => SCAN_L_SIG <= "0100";
WHEN "11" => SCAN_L_SIG <= "1000";
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
------------------------------
--READ_L <= NOT READ_L_IN;
--SCAN_L <= NOT SCAN_L_SIG;
READ_L <= READ_L_IN;
SCAN_L <= SCAN_L_SIG;
DISP_CNT <= "1110";
--READING THE LINES
-------------------------------
PROCESS(SCAN_L_SIG,READ_L)
BEGIN
CASE SCAN_L_SIG IS
WHEN "0001" => CASE READ_L IS
WHEN "0001" => DISP1 <= "1111110";
WHEN "0010" => DISP1 <= "0110011";
WHEN "0100" => DISP1 <= "1111111";
WHEN "1000" => DISP1 <= "1001110";
WHEN OTHERS=> DISP1 <= "0000000";
END CASE;
WHEN "0010" => CASE READ_L IS
WHEN "0001" => DISP1 <= "0110000";
WHEN "0010" => DISP1 <= "1011011";
WHEN "0100" => DISP1 <= "1111011";
WHEN "1000" => DISP1 <= "0111101";
WHEN OTHERS=> DISP1 <= "0000000";
END CASE;
WHEN "0100" => CASE READ_L IS
WHEN "0001" => DISP1 <= "1101101";
WHEN "0010" => DISP1 <= "1011111";
WHEN "0100" => DISP1 <= "1110111";
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 42
WHEN "1000" => DISP1 <= "1001111";
WHEN OTHERS=> DISP1 <= "0000000";
END CASE;
WHEN "1000" => CASE READ_L IS
WHEN "0001" => DISP1 <= "1111001";
WHEN "0010" => DISP1 <= "1110000";
WHEN "0100" => DISP1 <= "0011111";
WHEN "1000" => DISP1 <= "1000111";
WHEN OTHERS=> DISP1 <= "0000000";
END CASE;
WHEN OTHERS=> NULL;
END CASE;
END PROCESS;
DISP<= DISP1;
END BEHAVIORAL;
VERILOG CODE
MODULE KEYPAD_VERILOG(
INPUT CLK,
INPUT [3:0] KEY_RET,
OUTPUT REG [3:0] KEY_SCAN,
OUTPUT REG [3:0] CNTR,
OUTPUT REG [7:0] SEVEN
);
REG [20:0]CLK_DIV;
REG CLK1;
REG [3:0] I;
INITIAL
BEGIN
KEY_SCAN =4'B1110;
SEVEN=8'B01111111;
CNTR=4'B1110;
END
ALWAYS@(POSEDGE CLK)
BEGIN
CLK_DIV= CLK_DIV+1;
CLK1=CLK_DIV[15];
END
ALWAYS@(POSEDGE CLK1)
BEGIN
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 43
CASE({KEY_SCAN,KEY_RET})
8'B1110_1110: SEVEN=8'B00111111;
8'B1110_1101: SEVEN=8'B00000110;
8'B1110_1011: SEVEN=8'B01011011;
8'B1110_0111: SEVEN=8'B01001111;
8'B1101_1110: SEVEN=8'B01100110;
8'B1101_1101: SEVEN=8'B01101101;
8'B1101_1011: SEVEN=8'B01111101;
8'B1101_0111: SEVEN=8'B00000111;
8'B1011_1110: SEVEN=8'B01111111;
8'B1011_1101: SEVEN=8'B01100111;
8'B1011_1011: SEVEN=8'B01110111;
8'B1011_0111: SEVEN=8'B01111100;
8'B0111_1110: SEVEN=8'B00111001;
8'B0111_1101: SEVEN=8'B01011110;
8'B0111_1011: SEVEN=8'B01111001;
8'B0111_0111: SEVEN=8'B01110001;
ENDCASE
CNTR=4'B1110;
END
ALWAYS @(POSEDGE CLK1)
BEGIN
IF(KEY_SCAN==4'B1110)
KEY_SCAN=4'B1101;
ELSE IF(KEY_SCAN==4'B1101)
KEY_SCAN=4'B1011;
ELSE IF(KEY_SCAN==4'B1011)
KEY_SCAN=4'B0111;
ELSE IF(KEY_SCAN==4'B0111)
KEY_SCAN=4'B1110;
END
ENDMODULE
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 44
3 A. Write HDL code to control speed, direction of DC and Stepper motor.
VHDL CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
LIBRARY UNISIM;
USE UNISIM.VCOMPONENTS.ALL;
ENTITY DCMOTOR IS
GENERIC(BITS : INTEGER := 8 ); -- NUMBER OF BITS USED FOR DUTY CYCLE.
-- ALSO DETERMINES PWM PERIOD.
PORT ( CLK: IN STD_LOGIC; -- 4 MHZ CLOCK
RESET,EN: IN STD_LOGIC; -- MASTER RESET PIN
PWM : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
RLY: OUT STD_LOGIC;
ROW: IN STD_LOGIC_VECTOR(0 TO 3) ); -- THIS ARE THE ROW LINES
END DCMOTOR;
ARCHITECTURE DCMOTOR1 OF DCMOTOR IS
SIGNAL COUNTER : STD_LOGIC_VECTOR(BITS - 1 DOWNTO 0):="11111110";
SIGNAL DIV_REG: STD_LOGIC_VECTOR (16 DOWNTO 0); -- CLOCK DIVIDE
REGISTER
SIGNAL DCLK,DDCLK,DATAIN,TICK: STD_LOGIC; -- THIS HAS THE DIVIDED
CLOCK.
SIGNAL DUTY_CYCLE: INTEGER RANGE 0 TO 255;
SIGNAL ROW1 : STD_LOGIC_VECTOR(0 TO 3); -- THIS ARE THE ROW LINES
BEGIN
-- SELECT THE APPROPRIATE LINES FOR SETTING FREQUENCY
CLK_DIV: PROCESS (CLK, DIV_REG) -- CLOCK DIVIDER
BEGIN
IF (CLK'EVENT AND CLK='1') THEN
DIV_REG <= DIV_REG + 1;
END IF;
END PROCESS;
DDCLK<=DIV_REG(12);
---------------------------- END OF CLOCK DIVIDER -------------------------------------------
------
TICK <= ROW(0) AND ROW(1) AND ROW(2) AND ROW(3);
PROCESS(TICK)
BEGIN
IF FALLING_EDGE(TICK) THEN
CASE ROW IS
WHEN "1110" => DUTY_CYCLE <= 255 ; --MOTOR SPEED 1
WHEN "1101" => DUTY_CYCLE <= 200 ; --MOTOR SPEED 2
WHEN "1011" => DUTY_CYCLE <= 150 ; --MOTOR SPEED 3
WHEN "0111" => DUTY_CYCLE <= 100 ; --MOTOR SPEED 4
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 45
WHEN OTHERS => DUTY_CYCLE <= 100;
END CASE;
END IF;
END PROCESS;
PROCESS(DDCLK, RESET)
BEGIN
IF RESET = '0' THEN
COUNTER <= (OTHERS => '0');
PWM<="01";
ELSIF (DDCLK'EVENT AND DDCLK = '1') THEN
COUNTER <= COUNTER + 1;
IF COUNTER >= DUTY_CYCLE THEN
PWM(1) <= '0';
ELSE
PWM(1) <= '1';
END IF; END IF;
END PROCESS;
-- RLY<='1'; --MOTOR DIRECTION CONTROL- CLOCK WISE
RLY<='0';--MOTOR DIRECTION CONTROL- COUNTER CLOCK WISE
END DCMOTOR1;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 46
3 B. WRITE A VHDL CODE TO CONTROL SPEED, DIRECTION OF STEPPER
MOTOR.
VHDL CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY STEPPER IS
PORT ( DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
CLK,RESET : IN STD_LOGIC);
END STEPPER;
ARCHITECTURE BEHAVIORAL OF STEPPER IS
SIGNAL CLK_DIV : STD_LOGIC_VECTOR(20 DOWNTO 0);
SIGNAL CLK_INT: STD_LOGIC;
SIGNAL SHIFT_REG : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(CLK)
BEGIN
IF RISING_EDGE (CLK) THEN
CLK_DIV <= CLK_DIV + '1';
END IF;
END PROCESS;
CLK_INT <= CLK_DIV(16);
PROCESS(RESET,CLK_INT)
BEGIN
IF RESET='0' THEN
SHIFT_REG <= "0001";
ELSIF RISING_EDGE(CLK_INT) THEN
SHIFT_REG <= SHIFT_REG(0) & SHIFT_REG(3 DOWNTO 1);
END IF;
END PROCESS;
DOUT <= SHIFT_REG;
END BEHAVIORAL;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 47
4. WRITE A VHDL CODE TO ACCEPT 8 CHANNEL ANALOG SIGNAL,
TEMPERATURE SENSORS AND DISPLAY THE DATA ON LCD PANEL OR
SEVEN SEGMENT DISPLAY.
VHDL CODING
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE WORK.LCD_GRAP.ALL;
LIBRARY UNISIM;
USE UNISIM.VCOMPONENTS.ALL;
ENTITY ADC_LCD IS
PORT ( CLK: IN STD_LOGIC; -- 4 MHZ CLOCK
RESET: IN STD_LOGIC; -- MASTER RESET PIN
INTR: IN STD_LOGIC;
ADC_OUT: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CS,RD,WR:OUT STD_LOGIC;
LCD_RW : OUT STD_LOGIC;
LCD_SELECT : OUT STD_LOGIC;
LCD_ENABLE : OUT STD_LOGIC;
LCD_DATA: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); -- GIVES REGISTERED
DATA OUTPUT
END ADC_LCD;
ARCHITECTURE ADC_BEH OF ADC_LCD IS
TYPE STATE_TYPE IS (INITIAL,DISPLAY,CLEAR,LOCATION,PUTCHAR);
SIGNAL STATE,NEXT_STATE: STATE_TYPE;
-- CLEAR SCREEN.
CONSTANT CLR: STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001";
-- DISPLAY ON, WITHOUT CURSOR.
CONSTANT DON: STD_LOGIC_VECTOR(7 DOWNTO 0) := "00001100";
-- FUNCTION SET FOR 8-BIT DATA TRANSFER AND 2-LINE DISPLAY
CONSTANT SET: STD_LOGIC_VECTOR(7 DOWNTO 0) := "00111000";
--FREQUENCY DIVIDER
SIGNAL COUNTER : STD_LOGIC_VECTOR(18 DOWNTO 0);
SIGNAL CLK_DIV :STD_LOGIC;
CONSTANT BIG_DELAY: INTEGER :=16;
CONSTANT SMALL_DELAY: INTEGER :=2;
CONSTANT REG_SETUP: INTEGER :=1;
SIGNAL DIGITAL_DATA1,DATA1,DATA2: STD_LOGIC_VECTOR(7 DOWNTO
0);
SIGNAL DIGITAL_DATA : INTEGER RANGE 0 TO 255;
SIGNAL NTR :STD_LOGIC;
BEGIN
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 48
IBUF_INST : IBUF
-- EDIT THE FOLLOWING GENERIC TO SPECIFY THE I/O STANDARD FOR
THIS PORT.
GENERIC MAP (
IOSTANDARD => "LVCMOS25")
PORT MAP (
O => NTR, -- BUFFER OUTPUT
I => INTR -- BUFFER INPUT (CONNECT DIRECTLY TO TOP-LEVEL PORT));
PROCESS(CLK)
BEGIN
IF CLK='1' AND CLK'EVENT THEN
COUNTER<=COUNTER+'1';
END IF;
END PROCESS;
CLK_DIV<=COUNTER(7);
CS <='0';
WR <=NTR;
DIGITAL_DATA1 <= ADC_OUT ;
RD <='0';
DIGITAL_DATA<=CONV_INTEGER(DIGITAL_DATA1) ;
PROCESS(DIGITAL_DATA)
BEGIN
CASE (DIGITAL_DATA) IS
WHEN 0 TO 100 => DATA1 <= ONE ; DATA2 <= NINE ;
WHEN 101 TO 110 => DATA1 <= TWO ; DATA2 <= ZERO ;
WHEN 111 TO 120 => DATA1 <= TWO ; DATA2 <= ONE ;
WHEN 121 TO 130 => DATA1 <= TWO ; DATA2 <= TWO ;
WHEN 131 TO 140 => DATA1 <= TWO ; DATA2 <= THREE ;
WHEN 141 TO 150 => DATA1 <= TWO ; DATA2 <= FOUR ;
WHEN 151 TO 160 => DATA1 <= TWO ; DATA2 <= FIVE ;
WHEN 161 TO 170 => DATA1 <= TWO ; DATA2 <= SIX ;
WHEN 171 TO 180 => DATA1 <= TWO ; DATA2 <= SEVEN ;
WHEN 181 TO 190 => DATA1 <= TWO ; DATA2 <= EIGHT ;
WHEN 191 TO 200 => DATA1 <= TWO ; DATA2 <= NINE ;
WHEN 201 TO 205 => DATA1 <= THREE ; DATA2 <= ZERO ;
WHEN 206 TO 210 => DATA1 <= THREE ; DATA2 <= ONE ;
WHEN 211 TO 215 => DATA1 <= THREE ; DATA2 <= TWO ;
WHEN 216 TO 220 => DATA1 <= THREE ; DATA2 <= THREE ;
WHEN 221 TO 225 => DATA1 <= THREE ; DATA2 <= FOUR ;
WHEN 226 TO 230 => DATA1 <= THREE ; DATA2 <= FIVE ;
WHEN 231 TO 235 => DATA1 <= THREE ; DATA2 <= SIX ;
WHEN 236 TO 240 => DATA1 <= THREE ; DATA2 <= SEVEN ;
WHEN 241 TO 245 => DATA1 <= THREE ; DATA2 <= EIGHT ;
WHEN 246 TO 250 => DATA1 <= THREE ; DATA2 <= NINE ;
WHEN OTHERS => DATA1 <= FOUR ; DATA2 <= ZERO ;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 49
END CASE;
END PROCESS;
LCD_RW<='0';
PROCESS (CLK_DIV,RESET)
VARIABLE COUNT: INTEGER RANGE 0 TO BIG_DELAY;
VARIABLE C1 : STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
IF RESET = '1' THEN
STATE<=INITIAL;
COUNT:=0;
LCD_ENABLE<='0';
LCD_SELECT<='0';
C1 := "01111111";
ELSIF CLK_DIV'EVENT AND CLK_DIV = '1' THEN
CASE STATE IS
WHEN INITIAL => -- TO SET THE FUNCTION
IF COUNT=REG_SETUP THEN
LCD_ENABLE<='1';
ELSE
LCD_ENABLE<='0';
END IF;
LCD_DATA<=SET;
LCD_SELECT<='0';
IF COUNT=SMALL_DELAY THEN
STATE<=DISPLAY;
COUNT:=0;
ELSE
COUNT:=COUNT+1;
END IF;
WHEN DISPLAY => -- TO SET DISPLAY ON
IF COUNT=REG_SETUP THEN
LCD_ENABLE<='1';
ELSE
LCD_ENABLE<='0';
END IF;
LCD_DATA<=DON;
LCD_SELECT<='0';
IF COUNT=SMALL_DELAY THEN
STATE<=CLEAR;
COUNT:=0;
ELSE
COUNT:=COUNT+1;
END IF;
WHEN CLEAR => -- CLEAR THE SCREEN
IF COUNT=REG_SETUP THEN
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 50
LCD_ENABLE<='1';
ELSE
LCD_ENABLE<='0';
END IF;
LCD_DATA<=CLR;
LCD_SELECT<='0';
IF COUNT=BIG_DELAY THEN
STATE<=LOCATION;
COUNT:=0;
ELSE
COUNT:=COUNT+1;
END IF;
WHEN LOCATION => -- CLEAR THE SCREEN
IF COUNT=REG_SETUP THEN
LCD_ENABLE<='1';
ELSE
LCD_ENABLE<='0';
END IF;
IF COUNT=0 THEN
IF C1="10001111" THEN
C1:="10000000";
ELSE
C1:=C1+'1';
END IF;
END IF;
LCD_DATA <= C1 ;
LCD_SELECT<='0';
IF COUNT=BIG_DELAY THEN
STATE<=PUTCHAR;
COUNT:=0; ELSE
COUNT:=COUNT+1;
END IF;
WHEN PUTCHAR=> -- DISPLAY THE CHARACTER ON THE LCD
IF COUNT=REG_SETUP THEN
LCD_ENABLE<='1';
ELSE LCD_ENABLE<='0';
END IF;
CASE C1 IS
WHEN "10000000" => LCD_DATA<= A ;
WHEN "10000001" => LCD_DATA<= D ;
WHEN "10000010" => LCD_DATA<= C ;
WHEN "10000011" => LCD_DATA<= SPACE ;
WHEN "10000100" => LCD_DATA<= V ;
WHEN "10000101" => LCD_DATA<= O ;
WHEN "10000110" => LCD_DATA<= L ;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 51
WHEN "10000111" => LCD_DATA<= T ;
WHEN "10001000" => LCD_DATA<= A ;
WHEN "10001001" => LCD_DATA<= G ;
WHEN "10001010" => LCD_DATA<= E ;
WHEN "10001011" => LCD_DATA<= SPACE ;
WHEN "10001100" => LCD_DATA<= EQUAL ;
WHEN "10001101" => LCD_DATA<= DATA1 ;
WHEN "10001110" => LCD_DATA<= DOT ;
WHEN "10001111" => LCD_DATA<= DATA2;
WHEN "11000000" => LCD_DATA<= SPACE ;
WHEN "11000001" => LCD_DATA<= SPACE ;
WHEN "11000010" => LCD_DATA<= SPACE;
WHEN "11000011" => LCD_DATA<= SPACE ;
WHEN "11000100" => LCD_DATA<= SPACE ;
WHEN "11000101" => LCD_DATA<= SPACE ;
WHEN "11000110" => LCD_DATA<= SPACE ;
WHEN "11000111" => LCD_DATA<= SPACE ;
WHEN "11001000" => LCD_DATA<= SPACE;
WHEN "11001001" => LCD_DATA<= SPACE ;
WHEN "11001010" => LCD_DATA<= SPACE ;
WHEN "11001011" => LCD_DATA<= SPACE ;
WHEN "11001100" => LCD_DATA<= SPACE ;
WHEN "11001101" => LCD_DATA<= SPACE ;
WHEN "11001110" => LCD_DATA<= SPACE ;
WHEN "11001111" => LCD_DATA<= SPACE;
WHEN OTHERS => NULL;
END CASE ;
LCD_SELECT<='1';
IF COUNT=SMALL_DELAY THEN
STATE<=LOCATION;
COUNT:=0;
ELSE
COUNT:=COUNT+1;
END IF;
END CASE;
END IF;
END PROCESS;
END ADC_BEH;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 52
5 A . WRITE A VHDL CODE TO GENERATE SINE WAVEFORMS USING DAC
CHANGE THE FREQUENCY ANDAMPLITUDE.
VHDL CODE FOR SINE WAVE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DIGITAL_SINE_WAVE IS
PORT ( CLK : IN STD_LOGIC;
RST : IN STD_LOGIC;
DAC_OUT : OUT STD_LOGIC_VECTOR(0 TO 7));
END DIGITAL_SINE_WAVE ;
ARCHITECTURE BEHAVIORAL OF DIGITAL_SINE_WAVE IS
SIGNAL I: INTEGER RANGE 0 TO 23;
TYPE LOOK_UP IS ARRAY(0 TO 23) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
CONSTANTSINE_LOOKUP: LOOK_UP:
=(“01111111”,”10100000”,10111110”,”11011001”,”11101101”,
”11111001”,”11111110”,--0 TO 90
“11111001”,”11101101”,”11011001”,”10111110”,”10100000”,”01111111”,--TILL
180
“01011110”,”00111111”,”00100101”,”00010001”,”00000100”,”00000000”,--TILL
270
“00000100”,”00010001”,”00100101”,”00111111”,”01011110”);
SIGNAL TEMP : STD_LOGIC_VECTOR(2 DOWNTO 0):=”000”;
BEGIN
PROCESS(CLK)
BEGIN
IF RISING_EDGE(CLK) THEN
TEMP <= TEMP + '1' ;
END IF;
END PROCESS;
PROCESS(TEMP(2))
BEGIN
IF TEMP(2)= '1' AND TEMP(2)‟EVENT THEN
IF RST='1' THEN
DAC <= "00000000";
ELSE
I<I+1;
DAC<=SINE_LOOKUP(I);
IF I=23 THEN
I<=0;
END IF;
END IF;
END PROCESS;
END BEHAVIORAL;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 53
5 B. WRITE A VHDL CODE TO GENERATE SQUARE WAVEFORMS USING
DAC CHANGE THE FREQUENCY AND AMPLITUDE.
VHDL CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SQUARE_WAVE IS
PORT ( CLK : IN STD_LOGIC;
RST : IN STD_LOGIC;
DAC_OUT : OUT STD_LOGIC_VECTOR(0 TO 7));
END SQUARE_WAVE;
ARCHITECTURE BEHAVIORAL OF SQUARE_WAVE IS
SIGNAL TEMP : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL COUNTER : STD_LOGIC_VECTOR(0 TO 7);
SIGNAL EN :STD_LOGIC;
BEGIN
PROCESS(CLK)
BEGIN
IF RISING_EDGE(CLK) THEN
TEMP <= TEMP + '1' ;
END IF;
END PROCESS;
PROCESS(TEMP(3))
BEGIN
IF RST='1' THEN
COUNTER <= "00000000";
ELSIF RISING_EDGE(TEMP(3)) THEN
IF COUNTER<255 AND EN='0' THEN
COUNTER <= COUNTER + 1 ;
EN<='0';
DAC_OUT <="00000000"; --DAC_OUT<=COUNTER;(FOR TRIANGULAR
WAVE)
ELSIF COUNTER=0 THEN
EN<='0';
ELSE
EN<='1';
COUNTER <= COUNTER-1;
DAC_OUT <="11111111"; --DAC_OUT<=COUNTER;(FOR TRIANGULAR
WAVE)
END IF;
END IF;
END PROCESS;
END BEHAVIORAL;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 54
VERILOG CODE FOR SQUARE WAVE
MODULE SQR_WAVE(
INPUT CLK,
OUTPUT REG [7:0] DOUT
);
REG [7:0]TEMP = 8'B0;
REG [25:0]DIVCLK;
REG CLK1;
ALWAYS@(POSEDGE CLK)
BEGIN
DIVCLK = DIVCLK+1;
CLK1 = DIVCLK[8];
END
ALWAYS@(POSEDGE CLK1)
BEGIN
TEMP = ~TEMP;
DOUT = TEMP;
END
ENDMODULE
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 55
5 C. WRITE A VHDL CODE TO GENERATE TRAINGULAR WAVEFORMS
USING DAC CHANGE THE FREQUENCY AND AMPLITUDE.
VHDL CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TRIANGULAR_WAVE IS
PORT ( CLK : IN STD_LOGIC;
RST : IN STD_LOGIC;
DAC_OUT : OUT STD_LOGIC_VECTOR(0 TO 7));
END TRIANGULAR_WAVE ;
ARCHITECTURE BEHAVIORAL OF TRIANGULAR_WAVE IS
SIGNAL COUNTER : STD_LOGIC_VECTOR(0 TO 8);
SIGNAL TEMP : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL EN :STD_LOGIC;
BEGIN
PROCESS(CLK)
BEGIN
IF RISING_EDGE(CLK) THEN
TEMP <= TEMP + '1' ;
END IF;
END PROCESS;
PROCESS(TEMP(3))
BEGIN
IF RST='1' THEN
COUNTER <= "000000000";
ELSIF RISING_EDGE(TEMP(3)) THEN
COUNTER <= COUNTER + 1 ;
IF COUNTER(0)='1' THEN
DAC_OUT <=COUNTER(1 TO 8);
ELSE
DAC_OUT <=NOT(COUNTER(1 TO 8));
END IF;
END IF;
END PROCESS; END BEHAVIORAL;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 56
VERILOG CODE FOR TRIANGULAR
MODULE TRI_WAVE(
INPUT CLK,
OUTPUT REG [7:0] DACOUT
);
REG [7:0] TEMP=8'B00000000;
REG A=1;
ALWAYS@ (POSEDGE CLK)
BEGIN
IF ((TEMP==8'D0)|| (TEMP ==8'D255))
A=~A;
IF (A==1)
TEMP =TEMP+1;
IF(A==0)
TEMP = TEMP-1;
DACOUT =TEMP;
ENDMODULE
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 57
5 D. WRITE A VHDL CODE TO GENERATE RAMP WAVEFORMS USING
DAC CHANGE THE FREQUENCY AND AMPLITUDE.
VHDL CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY RAMP_WAVE IS
PORT ( CLK : IN STD_LOGIC;
RST : IN STD_LOGIC;
DAC_OUT : OUT STD_LOGIC_VECTOR(0 TO 7));
END RAMP_WAVE;
ARCHITECTURE BEHAVIORAL OF RAMP_WAVE IS
SIGNAL TEMP : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL COUNTER : STD_LOGIC_VECTOR(0 TO 7);
SIGNAL EN :STD_LOGIC;
BEGIN
PROCESS(CLK)
BEGIN
IF RISING_EDGE(CLK) THEN
TEMP <= TEMP + '1' ;
END IF;
END PROCESS;
PROCESS(TEMP(3))
BEGIN
IF RST='1' THEN
COUNTER <= "00000000";
ELSIF RISING_EDGE(TEMP(3)) THEN
COUNTER <= COUNTER + 15 ;
END IF;
END PROCESS;
DAC_OUT <=COUNTER;
END BEHAVIORAL;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 58
5 E. WRITE A VHDL CODE TO GENERATE SAWTOOTH WAVEFORMS
USING DAC CHANGE THE FREQUENCY AND AMPLITUDE.
VHDL CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SWATOOTH_WAVE IS
PORT ( CLK : IN STD_LOGIC;
RST : IN STD_LOGIC;
DAC_OUT : OUT STD_LOGIC_VECTOR(0 TO 7));
END SWATOOTH_WAVE;
ARCHITECTURE BEHAVIORAL OF SWATOOTH_WAVE IS
SIGNAL TEMP : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL COUNTER : STD_LOGIC_VECTOR(0 TO 7);
SIGNAL EN :STD_LOGIC;
BEGIN
PROCESS(CLK)
BEGIN
IF RISING_EDGE(CLK) THEN
TEMP <= TEMP + '1' ;
END IF;
END PROCESS;
PROCESS(TEMP(3))
BEGIN
IF RST='1' THEN
COUNTER <= "00000000";
ELSIF RISING_EDGE(TEMP(3)) THEN
COUNTER <= COUNTER + 1 ;
END IF;
END PROCESS;
DAC_OUT <=COUNTER;
END BEHAVIORAL;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 59
VERILOG CODE FOR SAWTOOTH WAVE
MODULE SAW(
INPUT CLK,
OUTPUT REG [7:0] DACOUT
);
REG [7:0] COUNTER;
ALWAYS@ (POSEDGE CLK)
BEGIN
COUNTER = COUNTER +1;
DACOUT=COUNTER;
END
ENDMODULE
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 60
6. WRITE A VHDL CODE TO SIMULATE ELEVATOR OPERATIONS.
VHDL CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE WORK.LCD_GRAP.ALL;
ENTITY ELEVATOR IS
GENERIC(BITS : INTEGER := 8 ); -- NUMBER OF BITS USED FOR DUTY CYCLE.
-- ALSO DETERMINES PWM PERIOD.
PORT ( CLK: IN STD_LOGIC; -- 4 MHZ CLOCK
RESET,EN: IN STD_LOGIC; -- MASTER RESET PIN
LCD_RW : OUT STD_LOGIC;
PWM : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
LCD_SELECT : OUT STD_LOGIC;
LCD_ENABLE : OUT STD_LOGIC;
ROW: IN STD_LOGIC_VECTOR(0 TO 3); -- THIS ARE THE ROW LINES
LCD_DATA: OUT STD_LOGIC_VECTOR (7 DOWNTO 0); -- GIVES REGISTERED
DATA OUTPUT
COL: INOUT STD_LOGIC_VECTOR(0 TO 3));
END ELEVATOR;
ARCHITECTURE RTL OF ELEVATOR IS
SIGNAL COUNTER : STD_LOGIC_VECTOR(BITS - 1 DOWNTO 0):="00000000";
TYPE KEYPAD_STATE_TYPE IS (WAIT_R_0, C3, C2, C1, C0, FOUND, SAMPLE,
WAIT_R_1);
-- STATE NAMES
TYPE STATE_TYPE IS (INITIAL,DISPLAY,CLEAR,LOCATION,PUTCHAR);
SIGNAL STATE,NEXT_STATE: STATE_TYPE;
-- CLEAR SCREEN.
CONSTANT CLR: STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001";
-- DISPLAY ON, WITHOUT CURSOR.
CONSTANT DON: STD_LOGIC_VECTOR(7 DOWNTO 0) := "00001100";
-- FUNCTION SET FOR 8-BIT DATA TRANSFER AND 2-LINE DISPLAY
CONSTANT SET: STD_LOGIC_VECTOR(7 DOWNTO 0) := "00111000";
--FREQUENCY DIVIDER
CONSTANT BIG_DELAY: INTEGER :=16;
CONSTANT SMALL_DELAY: INTEGER :=2;
CONSTANT REG_SETUP: INTEGER :=1;
SIGNAL CS, NS: KEYPAD_STATE_TYPE; -- SIGNALS FOR CURRENT AND
NEXT STATES
SIGNAL DUTY_CYCLE,DUTY_CYCLE1 : STD_LOGIC_VECTOR(BITS - 1
DOWNTO 0);
SIGNAL DIV_REG: STD_LOGIC_VECTOR (22 DOWNTO 0); -- CLOCK DIVIDE
REGISTER
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 61
SIGNAL DCLK,DDCLK: STD_LOGIC; -- THIS HAS THE DIVIDED CLOCK.
SIGNAL COL_REG_VALUE: STD_LOGIC_VECTOR (0 TO 3);
SIGNAL R1,CLK_D,START,STOP: STD_LOGIC; -- ROW DETECTION SIGNAL
SIGNAL KEY_VALUE1,FLOOR,KEY_VALUE: INTEGER RANGE 0 TO 15;
SIGNAL DATA,DATA1,FLOOR_NUM: STD_LOGIC_VECTOR (7 DOWNTO 0);
SIGNAL TEMP1,TEMP2,TEMP3,TEMP4: STD_LOGIC_VECTOR (7 DOWNTO 0);
SIGNAL TEMP5,TEMP6,TEMP7,TEMP8: STD_LOGIC_VECTOR (7 DOWNTO 0);
BEGIN
--CLK_OUT <= DCLK;
R1 <= ROW(3) OR ROW(2) OR ROW(1) OR ROW(0);
---------------------------- BEGINING OF FSM1 (KEYPAD SCANNER) ---------------------
----------
SYNC_PROC: PROCESS (DCLK, RESET, KEY_VALUE) -- THIS IS THE
SYNCHRONOUS PART
BEGIN
IF (RESET = '0') THEN -- YOU MUST HAVE A RESET FOR FSM TO SYNTHESIZE
PROPERLY
CS <= WAIT_R_0;
ELSIF (DCLK'EVENT AND DCLK = '1') THEN
CS <= NS;
END IF; END PROCESS;
COMB_PROC: PROCESS (CS, R1, COL_REG_VALUE) -- THIS IS THE
COMBINATIONAL PART
BEGIN
CASE CS IS
WHEN WAIT_R_0 => -- WAITS TILL A BUTTON IS PRESSED
COL <= "1111"; -- KEEP ALL COLUMNS ACTIVATED
IF R1 = '1' THEN -- A BUTTON WAS PRESSED. BUT WHICH ONE?
NS <= C3; -- LET'S FIND OUT
ELSE
NS <= WAIT_R_0;
END IF;
---------------------------------------------------------------------------------------------------
WHEN C3 => --
COL <= "0001"; -- ACTIVATE COLUMN 3
IF R1 = '0' THEN -- THIS MEANS BUTTON WAS NOT IN COLUMN 3
NS <= C2; -- SO CHECK IF IT WAS IN COLUMN 2
ELSE NS <= FOUND; -- BUTTON WAS IN COLUMN 3
END IF;
---------------------------------------------------------------------------------------------------
WHEN C2 => --
COL <= "0010"; -- ACTIVATE COLUMN 2
IF R1 = '0' THEN -- THIS MEANS BUTTON WAS NOT IN COLUMN 2
NS <= C1; -- SO CHECK IF IT WAS IN COLUMN 1
ELSE
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 62
NS <= FOUND; -- BUTTON WAS IN COLUMN 2
END IF;
---------------------------------------------------------------------------------------------------
WHEN C1 => --
COL <= "0100"; -- ACTIVATE COLUMN 1
IF R1 = '0' THEN -- THIS MEANS BUTTON WAS NOT IN COLUMN 1
NS <= C0; -- SO CHECK IF IT WAS IN COLUMN 0
ELSE
NS <= FOUND; -- BUTTON WAS IN COLUMN 1
END IF;
---------------------------------------------------------------------------------------------------
WHEN C0 => --
COL <= "1000"; -- ACTIVATE COLUMN 0
IF R1 = '0' THEN -- THIS MEANS BUTTON WAS NOT IN COLUMN 0 ??
NS <= WAIT_R_0; -- SO THE BUTTON MUST HAVE BEEN DEPRESSED FAST
ELSE
NS <= FOUND; -- BUTTON WAS IN COLUMN 3
END IF;
---------------------------------------------------------------------------------------------------
WHEN FOUND => --
COL <= COL_REG_VALUE;
IF R1 = '0' THEN -- THIS MEANS BUTTON IS DEPRESSED
NS <= WAIT_R_0; -- SO GO BACK TO INITIAL STATE
ELSE
NS <= SAMPLE; -- OTHERWISE WRITE THE KEY VALUE TO DATA REGISTER
END IF;
---------------------------------------------------------------------------------------------------
WHEN SAMPLE => -- THIS STATE WILL GENERATE A SIGNAL WITH ONE
CLOCK PERIOD FOR SAMPLING
COL <= COL_REG_VALUE;
NS <= WAIT_R_1; -- OTHERWISE WAIT TILL BUTTON IS PRESSED
---------------------------------------------------------------------------------------------------
WHEN WAIT_R_1 => --
COL <= COL_REG_VALUE;
IF R1 = '0' THEN -- THIS MEANS BUTTON WAS DEPRESSED
NS <= WAIT_R_0; -- SO GO BACK TO INITIAL STATE
ELSE
NS <= WAIT_R_1; -- OTHERWISE WAIT TILL BUTTON IS PRESSED
END IF;
---------------------------------------------------------------------------------------------------
END CASE;
END PROCESS;
---------------------------------------------------------------------------------------------------
WRITE_DATA: PROCESS (DCLK, CS, KEY_VALUE) -- WRITE VALID DATA TO
REGISTER
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 63
BEGIN
IF DCLK'EVENT AND DCLK = '0' THEN -- ON THE FALLING EDGE
IF CS = FOUND THEN
KEY_VALUE <= KEY_VALUE1;
END IF;
END IF;
END PROCESS; -- WRITE_DATA
---------------------------------------------------------------------------------------------------
COL_REG: PROCESS (DCLK, CS, COL) -- THIS IS THE COLUMN VALUE
REGISTER
BEGIN
IF (DCLK'EVENT AND DCLK = '0') THEN -- REGISTER THE COL VALUE ON
THE FALLING EDGE
IF (CS = C3 OR CS = C2 OR CS = C1 OR CS = C0) THEN -- PROVIDED WE'RE IN
STATES C3 THRU C0 ONLY
COL_REG_VALUE <= COL; -- OTHERWISE THE COLUMN VALUE IS NOT
VALID
END IF;
END IF;
END PROCESS; -- COL_REG
---------------------------------------------------------------------------------------------------
DECODER: PROCESS(ROW, COL_REG_VALUE) -- DECODES BINARY VALUE
OF PRESSED KEY FROM ROW AND
COLUMN
VARIABLE CODE: STD_LOGIC_VECTOR (0 TO 7);
BEGIN
CODE := (ROW & COL_REG_VALUE);
CASE CODE IS
-- COL
-- ROW 0 0123
WHEN "00010001" => KEY_VALUE1 <= 0;
WHEN "00010010" => KEY_VALUE1 <= 1;
WHEN "00010100" => KEY_VALUE1 <= 2;
WHEN "00011000" => KEY_VALUE1 <= 3;
-- ROW 1
WHEN "00100001" => KEY_VALUE1 <= 4;
WHEN "00100010" => KEY_VALUE1 <= 5;
WHEN "00100100" => KEY_VALUE1 <= 6;
WHEN "00101000" => KEY_VALUE1 <= 7;
-- ROW 2
WHEN "01000001" => KEY_VALUE1 <= 8;
WHEN "01000010" => KEY_VALUE1 <= 9;
WHEN "01000100" => KEY_VALUE1 <= 10;
WHEN "01001000" => KEY_VALUE1 <= 11;
-- ROW 3
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 64
WHEN "10000001" => KEY_VALUE1 <= 12;
WHEN "10000010" => KEY_VALUE1 <= 13;
WHEN "10000100" => KEY_VALUE1 <= 14;
WHEN "10001000" => KEY_VALUE1 <= 15;
WHEN OTHERS => KEY_VALUE1 <= 0;
END CASE;
END PROCESS; -- DECODER
---------------------------- END OF FSM1 (KEYPAD SCANNER) -----------------------------
----------
-- SELECT THE APPROPRIATE LINES FOR SETTING FREQUENCY
CLK_DIV: PROCESS (CLK, DIV_REG) -- CLOCK DIVIDER
BEGIN
IF (CLK'EVENT AND CLK='1') THEN
DIV_REG <= DIV_REG + 1;
END IF;
END PROCESS;
DCLK <= DIV_REG(8);
DDCLK<=DIV_REG(10);
CLK_D<=DIV_REG(22);
---------------------------- END OF CLOCK DIVIDER -------------------------------------------
------
LCD_RW<='0';
PROCESS (DDCLK,RESET)
VARIABLE COUNT: INTEGER RANGE 0 TO BIG_DELAY;
VARIABLE C1 : STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
IF RESET = '0' THEN
STATE<=INITIAL;
COUNT:=0;
LCD_ENABLE<='0';
LCD_SELECT<='0';
C1 := "01111111";
ELSIF DDCLK'EVENT AND DDCLK = '1' THEN
CASE STATE IS
WHEN INITIAL => -- TO SET THE FUNCTION
IF COUNT=REG_SETUP THEN
LCD_ENABLE<='1';
ELSE LCD_ENABLE<='0';
END IF;
LCD_DATA<=SET;
LCD_SELECT<='0';
IF COUNT=SMALL_DELAY THEN
STATE<=DISPLAY;
COUNT:=0;
ELSE COUNT:=COUNT+1;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 65
END IF;
WHEN DISPLAY => -- TO SET DISPLAY ON
IF COUNT=REG_SETUP THEN
LCD_ENABLE<='1';
ELSE LCD_ENABLE<='0';
END IF;
LCD_DATA<=DON;
LCD_SELECT<='0';
IF COUNT=SMALL_DELAY THEN
STATE<=CLEAR;
COUNT:=0;
ELSE COUNT:=COUNT+1;
END IF;
WHEN CLEAR => -- CLEAR THE SCREEN
IF COUNT=REG_SETUP THEN
LCD_ENABLE<='1';
ELSE LCD_ENABLE<='0';
END IF;
LCD_DATA<=CLR;
LCD_SELECT<='0';
IF COUNT=BIG_DELAY THEN
STATE<=LOCATION;
COUNT:=0;
ELSE COUNT:=COUNT+1;
END IF;
WHEN LOCATION => -- CLEAR THE SCREEN
IF COUNT=REG_SETUP THEN
LCD_ENABLE<='1';
ELSE LCD_ENABLE<='0';
END IF;
IF COUNT=0 THEN
IF C1="10001111" THEN
C1:="11000000";
ELSIF C1="11001111" THEN
C1:="10000000";
ELSE C1:=C1+'1';
END IF;
END IF;
LCD_DATA <= C1;
LCD_SELECT<='0';
IF COUNT=BIG_DELAY THEN
STATE<=PUTCHAR;
COUNT:=0;
ELSE COUNT:=COUNT+1;
END IF;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 66
WHEN PUTCHAR=> -- DISPLAY THE CHARACTER ON THE LCD
IF COUNT=REG_SETUP THEN
LCD_ENABLE<='1';
ELSE LCD_ENABLE<='0';
END IF;
CASE C1 IS
WHEN "10000000" => LCD_DATA<= F ;--SIGLE LINE
WHEN "10000001" => LCD_DATA<= L ;--SIGLE LINE
WHEN "10000010" => LCD_DATA<= O ;--SIGLE LINE
WHEN "10000011" => LCD_DATA<= O ;--SIGLE LINE
WHEN "10000100" => LCD_DATA<= R ;--SIGLE LINE
WHEN "10000101" => LCD_DATA<= SPACE ;--SIGLE LINE
WHEN "10000110" => LCD_DATA<= N ;--SIGLE LINE
WHEN "10000111" => LCD_DATA<= U ;--SIGLE LINE
WHEN "10001000" => LCD_DATA<= M ;
WHEN "10001001" => LCD_DATA<= B ;
WHEN "10001010" => LCD_DATA<= E ;
WHEN "10001011" => LCD_DATA<= R ;
WHEN "10001100" => LCD_DATA<= SPACE ;
WHEN "10001101" => LCD_DATA<= EQUAL ;
WHEN "10001110" => LCD_DATA<= FLOOR_NUM ;
WHEN "10001111" => LCD_DATA<= SPACE;
WHEN "11000000" => LCD_DATA<= S ;--SIGLE LINE
WHEN "11000001" => LCD_DATA<= T ;--SIGLE LINE
WHEN "11000010" => LCD_DATA<= A ;--SIGLE LINE
WHEN "11000011" => LCD_DATA<= T ;--SIGLE LINE
WHEN "11000100" => LCD_DATA<= U ;--SIGLE LINE
WHEN "11000101" => LCD_DATA<= S ;--SIGLE LINE
WHEN "11000110" => LCD_DATA<= SPACE ;--SIGLE LINE
WHEN "11000111" => LCD_DATA<= TEMP1 ;--SIGLE LINE
WHEN "11001000" => LCD_DATA<= TEMP2 ;
WHEN "11001001" => LCD_DATA<= TEMP3 ;
WHEN "11001010" => LCD_DATA<= TEMP4 ;
WHEN "11001011" => LCD_DATA<= SPACE ;
WHEN "11001100" => LCD_DATA<= TEMP5 ;
WHEN "11001101" => LCD_DATA<= TEMP6 ;
WHEN "11001110" => LCD_DATA<= TEMP7 ;
WHEN "11001111" => LCD_DATA<= TEMP8 ;
WHEN OTHERS => NULL;
END CASE ;
LCD_SELECT<='1';
IF COUNT=SMALL_DELAY THEN
STATE<=LOCATION;
COUNT:=0;
ELSE COUNT:=COUNT+1;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 67
END IF; END CASE; END IF; END PROCESS;
PROCESS(CLK_D,RESET)
VARIABLE COU : STD_LOGIC_VECTOR(1 DOWNTO 0);
VARIABLE START,STOP: STD_LOGIC; -- ROW DETECTION SIGNAL
BEGIN
IF RESET='0' THEN
COU:="00";
TEMP1 <= L ;
TEMP2 <= I ;
TEMP3 <= F ;
TEMP4 <= T ;
TEMP5 <= I ;
TEMP6 <= D ;
TEMP7 <= L ;
TEMP8 <= E ;
FLOOR_NUM <= ZERO ;
ELSIF RISING_EDGE(CLK_D) THEN
CASE KEY_VALUE IS
WHEN 0 => FLOOR_NUM <= ZERO ;
FLOOR <=0;
WHEN 1 => FLOOR_NUM <= ONE ;
FLOOR <=1;
WHEN 2 => FLOOR_NUM <= TWO ;
FLOOR <=2;
WHEN 3 => FLOOR_NUM <= THREE ;
FLOOR <=3;
WHEN 4 =>
TEMP1 <= D ;
TEMP2 <= O ;
TEMP3 <= O ;
TEMP4 <= R ;
TEMP5 <= O ;
TEMP6 <= P ;
TEMP7 <= E ;
TEMP8 <= N ;
WHEN 5 =>
TEMP1 <= D ;
TEMP2 <= O ;
TEMP3 <= O ;
TEMP4 <= R ;
TEMP5 <= C ;
TEMP6 <= L ;
TEMP7 <= O ;
TEMP8 <= S ;
WHEN 6 =>
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 68
START:='1';
STOP:='0';
WHEN 7 =>
STOP:='1';
START:='0';
WHEN OTHERS =>
TEMP1 <= I ;
TEMP2 <= D ;
TEMP3 <= L ;
TEMP4 <= E ;
TEMP5 <= K ;
TEMP6 <= E ;
TEMP7 <= Y ;
TEMP8 <= SPACE ;
END CASE;
IF START='1' THEN
IF COU=FLOOR THEN
START := '0';
COU:=COU;
TEMP7 <= "001100" & COU ;
ELSIF COU<=FLOOR THEN
COU:=COU + '1';
TEMP1 <= U ;
TEMP2 <= P ;
TEMP3 <= SPACE ;
TEMP4 <= SPACE ;
TEMP5 <= SPACE ;
TEMP6 <= "01111110" ;
TEMP7 <= "001100" & COU ;
TEMP8 <= SPACE ;
ELSIF COU>=FLOOR THEN
COU:=COU-'1';
TEMP1 <= D ;
TEMP2 <= O ;
TEMP3 <= W ;
TEMP4 <= N ;
TEMP5 <= SPACE ;
TEMP6 <= "01111111" ;
TEMP7 <= "001100" & COU ;
TEMP8 <= SPACE ;
END IF; END IF; END IF;
END PROCESS;
END RTL;
VSM‟S Somashekar R. Kothiwale Institute of Technology, Nipani.
DEPARTMENT OF ELECTRONICS & COMMUNICATION ENGINEERING
HDL 17ECL58 Page 69
EXTRA EXPERIMENT
4. WRITE A VHDL CODE TO CONTROL EXTERNAL LIGHTS USING
RELAYS.
VHDL CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY EXTLIGHT IS
PORT ( CNTRL1,CNTRL2 : IN STD_LOGIC;
LIGHT : OUT STD_LOGIC);
END EXTLIGHT;
ARCHITECTURE BEHAVIORAL OF EXTLIGHT IS
BEGIN
LIGHT<= CNTRL1 OR CNTRL2 ;
END BEHAVIORAL;
VERILOG CODE
VERILOG CODE FOR RELAY
MODULE REALY_VERILOG(
INPUT A,B,
OUTPUT Y );
ASSIGN Y = A | B;
ENDMODULE