Anda di halaman 1dari 18

MODUL 4 REGISTER, FINITE STATE MACHINE, DAN KOMUNIKASI SERIAL

Aloysius Efrata Sumaryo 13220057


Asisten: Christian Reivan Banjarnahor
Tanggal Percobaan: 19/10/2021
EL2102 – Sistem Digital
Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB

Abstrak
Abstrak mempelajari penggunaan register, FSM, dan
komunikasi serial. Bahasa VHDL yang digunakan
menjurus pada implementasi sequential circuit, shift register, ,
UART serta clock divider. Praktikum dilakukan dengan
bantuan software quartus prime, Modelsim dan Altera
Cyclone untuk membantu pemahaman terhadap praktikum.
Setelah praktikum didapat hasil sesuai spesifikasi serta
ketentuan yang diinginkan.
Kata kunci: VHDL, sequential circuit, UART, clock
divider, Praktikum.

1. PENDAHULUAN
Percobaan pada praktikum ini terbagi menjadi 3 Gambar 2-1 Flowchart perancangan FPGA
sub-modul. Sub-modul pertama memberikan 2.2. BCD Decoder
pemahaman tentang register serta implementasi
pada FPGA dengan menampilkan NIM pada seven BCD Decoder merupakan sebuah rangkaian
segment secara bergantian. Sub-modul kedua logika yang digunakan untuk ’mentranslate’
memberikan pemahaman tentang perbedaan FSM kode biner menjadi bilangan desimal. BCD
jika dibuat menggunakan dua level abstraksi yang Decoder sendiri tergolong rangkaian logika
berbeda. Sub-modul ketiga memberikan yang kombinasional, berarti output yang
pemahaman mendasar tentang protokol dikeluarkan bergantung dengan input yang
komunikasi UART serta penerapannya pada FPGA dimasukkan(tidak ada penyimpanan
dengan laptop. sementara).

2. STUDI PUSTAKA
2.1. FPGA
Field Progammable Gate Array (FPGA)
merupakan sebuah IC digital yang digunakan
untuk mengimplementasikan rangkaian
digital. FPGA sendiri terdiri dari 2 komponen
utama yaitu programmable logic dan
interkoneksi (sambungan terprogram) .
Programmable logic biasanya meliputi jenis
gerbang logika biasa (AND, OR, NOT). FPGA
biasa digunakan untuk meningkatkan
efisiensi rancangan rangkaian dengan Gambar 2-2 BCD to 7-Segment Decoder
mengurangi pemakaian software. Secara
2.3. Delay Flip-Flop
umum alur dari FPGA sebagai berikut.
Delay flip-flop merupakan sebuah rangkaian
elektronik flip-flop(menyimpan sebuah data)
yang digunakan untuk menghambat
perubahan pernyataan keluaran sinyal dari
rangkaian sampai munculnya rising edge dari
sebuah periode clock masukan sinyal.

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 1


Gambar 2-3 D-flip-flop
2.4. Clock Divider
Sesuai namanya clock divider berfungsi untuk
membagi masukan clock dan mengeluarkan
keluaran clock yang baru. Pada praktikum ini
clock divider digunakan untuk
mengubah ’natural clock’ FPGA 50 MHz
menjadi frekuensi yang diinginkan user.
2.5. Rangkaian Sekuensial
Rangkaian sekuensial adalah rangkaian yang
secara mudahnya memiliki memory. Hal ini
berarti output yang diberikan tidak hanya
bergantung pada input, tetapi ada pengaruh
dari state. Pada praktikum ini rangkaian Gambar 3-1 Diagram Metode Percobaan 4.1
sekuensial diterapkan pada sebuah FSM.
2.6. Finite State Machine(FSM)
FSM merupakan sebuah ’mesin’ yang bekerja
dengan urutan state. Level abstraksi pada
mesin ini pun bermacam-macam, tetapi pada
modul ini kita mengimplementasikan 2 level.
Sebelum mendesain mesin lebih baik untuk
merancang dari awal menggunakan state
diagram, truth table state, serta
meminimalisasi bentuk.

3. METODOLOGI
Alat dan komponen yang digunakan pada modul
ini adalah:
1. Komputer yang terinstal program Quartus
Prime Lite serta ModelSim Altera
2. FPGA board tipe Cyclone IV E serial
EP4CE6E22C8 lengkap dengan kabel
penyambung serta kabel supply power
Langkah pada praktikum modul 3 kali ini dapat
dilihat sebagai berikut.

Gambar 3-2 Diagram Metode Percobaan 4.2

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 2


praktikum yang sudah dilakukan didapatkan hasil
yang sesuai dengan ekspektasi awal.
Register bekerja dengan dasar sekuensial.
Sekuensial berarti memiliki urutan atau dalam
istilah ini biasa disebut ring counter. Hal ini berarti
kita berusaha mendesain suatu rangkaian yang
menyalakan 7 segment urut dari kiri ke kanan
ataupun sebaliknya. Aplikasi lebih lanjut dari
desain rangkaian ini adalah shift register. Shift
register memungkinkan kita untuk menggerakkan
dari kanan ke kiri ataupun sebaliknya tergantung
permintaan(seperti rolling text).
4.2. FSM Gate Level dan RTL

Gambar 4-2 Hasil Simulasi Gate Level

Gambar 3-2 Diagram Metode Percobaan 4.3

4. HASIL DAN ANALISIS


Bagian ini menjelaskan tentang hasil setelah
melakukan percobaan beserta analisis terhadap
hasil yang didapat.
Gambar 4-3 Hasil Simulasi RTL

4.1. Register on 7-Segment

Gambar 4-1 Hasil implementasi alat FPGA


Pada percobaan pertama kita melakukan
Gambar 4-4 State Diagram
rancangan desain rangkaian register on 7-segment.
Kita diminta untuk memunculkan 4 angka nim
terakhir masing-masing praktikkan. Berdasarkan

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 3


Tabel 4-1 State Table

Present Next
Input State State Output
X1 X0 A1 A0 B1 B0 Y
0 0 0 0 0 0 0
0 0 0 1 0 0 0
0 0 1 0 0 0 0
0 0 1 1 x x x
0 1 0 0 0 1 0
0 1 0 1 0 1 0
0 1 1 0 0 1 1 Gambar 4-4 Hasil implementasi alat FPGA
0 1 1 1 x x x Percobaan empat mengenalkan kita pada UART.
1 0 0 0 1 0 0 UART sendiri merupakan sebuah protocol
1 0 0 1 1 0 1 komunikasi serial sederhana. Dalam percobaan ini
1 0 1 0 1 0 0 UART diterapkan antara FPGA dengan laptop.
UART sendiri bekerja seperti walky-talky anak
1 0 1 1 1 0 x
kecil yaitu secara 2 arah dan tertutup.
1 1 0 0 0 0 0
1 1 0 1 0 0 0 Pada percobaan empat ini saya kesulitan untuk
membuat angka yang bagus terkadang
1 1 1 0 0 0 0 mengeluarkan suatu symbol random. Hal ini
1 1 1 1 x x x mungkin terjadi karena setting dari termite.
Tabel 4-2 K-Map
5. KESIMPULAN
input
00 01 11 10 Dari percobaan yang dilakukan dapat disimpulkan
next state

beberapa hal berikut.


00 0 0 x 0
01 0 1 x 0 1. Selain memforce value langsung ke 7-segment
11 0 0 x 0 kita bisa menyalakan 7-segment dengan
10 0 0 x 1 prosedur register.
2. High level abstraction sebuah desain
𝑌 = തതത
𝑋1 𝑋0 𝐴1 + 𝑋1 തതത
𝑋0 𝐴0 rangkaian akan menghasilkan efisiensi waktu
Dari percobaan modul 3.2 kita diminta untuk serta kemudahan bagi pendesain rangkaian.
merancang dua buah FSM dengan level abstraksi
3. Baik gate-level maupun RTL memberikan
yang berbeda. Walaupun, keduanya memberikan
output yang sama persis yang membedakan
output yang sama level abstraksi dari RTL lebih
hanya cara mendapat hasilnya.
tinggi dari gate. Langkah utama pada percobaan ini
bagaimana kita merancang FSM dari awal yaitu 4. Termite merupakan salah satu protokol
state diagram. Berawal dari situ, berlanjut komunikasi yang cukup mudah untuk
membuat state table dan terakhir melakukan menyambungkan FPGA dengan laptop.
simplifikasi untuk menentukan logic dari mesin.
DAFTAR PUSTAKA
Berbeda dengan gate level, FSM dengan high level
abstraction jauh lebih mudah dan enak untuk [1] Brown, Stephen, dan Vranesic, Zvonko,
dikerjakan. Bahasa yang lebih mendekati ke bahasa Fundamental of Digital Logic Third Edition, 2009.
manusia membuat kita lebih mudah mengerti dan
[2] Arif Sasongko, Modul 4 SisDig, LDTE ITB,
tidak terlalu berpikir banyak.
2021.
4.3. Simple UART

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 4


LAMPIRAN
Link Video Praktikum https://youtu.be/kKZDc5Qbjq8
1. Source Code 4.1
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity sevensegnim is
port (
std_clock : in std_logic;
reset : in std_logic;
digit : out std_logic_vector (3 downto 0);
seven_segment : out std_logic_vector (6 downto 0)
);
end sevensegnim;

architecture rtl of sevensegnim is


signal selector : std_logic_vector (3 downto 0):= "1111"
;
signal clockdiv : unsigned(15 downto 0):=(others => '0')
;
signal clock_out : std_logic;
signal dig_3,dig_2,dig_1,dig_0 : std_logic_vector (6 downto 0);

begin
dig_3 <= "0001111";
dig_2 <= "0100100";
dig_1 <= "0000001";
dig_0 <= "0000001";

clockdivider : process(reset,std_clock)
begin
if(reset='0') then
clockdiv <= (others => '0');
elsif (rising_edge(std_clock)) then
clockdiv <= clockdiv+1;
end if;
end process clockdivider;

clock_out <= clockdiv(15);

sekuential : process(clock_out,reset)
begin
if reset = '0' then
selector <= "0111";
elsif rising_edge(clock_out) then
selector(1) <= selector (0);
selector(2) <= selector (1);
selector(3) <= selector (2);

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 5


selector(0) <= selector (3);
end if;
end process sekuential;

selektor : process(selector)
begin
digit <= selector;
case selector is
when "0111" => seven_segment <= dig_0;--0
when "1011" => seven_segment <= dig_1;--0
when "1101" => seven_segment <= dig_2;--5
when "1110" => seven_segment <= dig_3;--7
when others => seven_segment <= "1111111";--null
end case;
end process selektor;
end rtl;

2. Source Code 4.2


• Variasi Gate
library ieee;
use ieee.std_logic_1164.all;

entity fsm_gate is
port(
std_clock : in std_logic;
reset : in std_logic;
p : in std_logic_vector(1 downto 0);
q : out std_logic
);
end entity;

architecture gatelevel of fsm_gate is


signal current_state,next_state : std_logic_vector(1 downto 0);
begin
process(std_clock,reset)
begin
if reset = '1' then
current_state <= "00";
elsif rising_edge(std_clock) then
current_state <= next_state;
end if;
end process;

--logic next
next_state(0) <= (not(p(1)) and p(0));
next_state(1) <= (p(1) and not (p(0)));
--logic output
q <= ((next_state(1) and current_state(0)) or (next_state(0) and current_stat
e(1)));

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 6


end gatelevel;

• Variasi RTL
library ieee;
use ieee.std_logic_1164.all;

entity fsm_rtl is
port(
std_clock : in std_logic;
reset : in std_logic;
p : in std_logic_vector(1 downto 0);
q : out std_logic
);
end entity;

architecture rtl of fsm_rtl is


type my_state_type is (a,b,c);
-- a = 00
-- b = 01
-- c = 10
signal current_state,next_state : my_state_type;
signal y : std_logic;
begin
process(std_clock,reset)
begin
if reset = '1' then
current_state <= a;
elsif rising_edge(std_clock) then
current_state <= next_state;
end if;
end process;

--logic next
process (current_state, p, y)
begin
next_state <= current_state;
case current_state is
when a =>
y <= '0';
if p = "01" then
next_state <= b;
elsif p = "10" then
next_state <= c;
else
next_state <= a;
end if;
when b =>
if p = "01" then
next_state <= b;
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 7
y <= '0';
elsif p = "10" then
next_state <= c;
y <= '1';
else
next_state <= a;
y <= '0';
end if;
when c =>
if p = "01" then
next_state <= b;
y <= '1';
elsif p = "10" then
next_state <= c;
y <= '0';
else
next_state <= a;
y <= '0';
end if;
end case;
end process;
--logic output
q <= y;
end rtl;

3. Source Code 4.3


-- library
library ieee;
use ieee.std_logic_1164.all;

-- entity
entity ContohUART is
port(
clk : in std_logic;
rst_n : in std_logic;

-- paralel part
button : in std_logic;
Seven_Segment : out std_logic_vector(7 downto 0) ;
Digit_SS : out std_logic_vector(3 downto 0) ;

-- serial part
rs232_rx : in std_logic;
rs232_tx : out std_logic

);
End entity;

Architecture RTL of ContohUART is


Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 8
Component my_uart_top is
port(
clk : in std_logic;
rst_n : in std_logic;
send : in std_logic;
send_data : in std_logic_vector(7 downto 0) ;
receive : out std_logic;
receive_data: out std_logic_vector(7 downto 0) ;
rs232_rx : in std_logic;
rs232_tx : out std_logic
);
end Component;

signal send_data,receive_data : std_logic_vector(7 downto 0);


signal receive : std_logic;
signal receive_c : std_logic;

begin

UART: my_uart_top
port map (
clk => clk,
rst_n => rst_n,
send => button,
send_data => send_data,
receive => receive,
receive_data=> receive_data,
rs232_rx => rs232_rx,
rs232_tx => rs232_tx
);

send_data <= "01010101";

Process(clk)
begin
if ((clk = '1') and clk'event) then
receive_c <= receive;
if ((receive = '0') and (receive_c = '1'))then
-- if (receive = '1') then
seven_segment <= receive_data;
end if;
end if;
end process;

Digit_SS <= "0101";

end architecture;

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 9


-- library
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

-- entity
entity my_uart_rx is
port(
clk: in std_logic;
rst_n: in std_logic;
rs232_rx: in std_logic;
clk_bps: in std_logic;
bps_start: out std_logic;
rx_data: out std_logic_vector(7 downto 0);
rx_int : out std_logic
);
end entity my_uart_rx;

architecture RTL of my_uart_rx is

-- signal for interrupt


signal rs232_rx0,rs232_rx1,rs232_rx2,rs232_rx3: std_logic;
signal neg_rs232_rx: std_logic;

signal bps_start_r: std_logic;


signal num: unsigned(3 downto 0);
signal rx_int_i: std_logic;

signal rx_temp_data, rx_data_r: std_logic_vector(7 downto 0);

begin

----------------------------------------------------------------

process(clk, rst_n)
begin
if (rst_n = '0') then
-- begin
rs232_rx0 <= '0';
rs232_rx1 <= '0';
rs232_rx2 <= '0';
rs232_rx3 <= '0';

-- end;
elsif (clk='1' and clk'event) then
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 10
-- begin
rs232_rx0 <= rs232_rx;
rs232_rx1 <= rs232_rx0;
rs232_rx2 <= rs232_rx1;
rs232_rx3 <= rs232_rx2;
-- end;
end if;
end process;

neg_rs232_rx <= rs232_rx3 and rs232_rx2 and (not rs232_rx1) and (not rs232_rx
0);

process( clk, rst_n)


begin
if (rst_n = '0') then
bps_start_r <= 'Z';
rx_int_i <= '0';
elsif clk = '1' and clk'event then
if (neg_rs232_rx= '1') then
bps_start_r <= '1';
rx_int_i <= '1';
elsif (num = "1010") then
bps_start_r <= '0';
rx_int_i <= '0';
end if;
end if;
end process;

bps_start <= bps_start_r;

process(clk, rst_n)
begin
if (rst_n = '0') then
rx_temp_data <= "00000000";
num <= "0000";
rx_data_r <= "00000000";
elsif (clk = '1' and clk'event) then
if (rx_int_i = '1') then
if(clk_bps = '1') then
num <= num + "0001";
case num is
when "0001" => rx_temp_data(0) <= rs232_rx; -
-//0bit
when "0010" => rx_temp_data(1) <= rs232_rx; -
-//1bit
when "0011" => rx_temp_data(2) <= rs232_rx; -
-//2bit
when "0100" => rx_temp_data(3) <= rs232_rx; -
-//3bit

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 11


when "0101" => rx_temp_data(4) <= rs232_rx; -
-//4bit
when "0110" => rx_temp_data(5) <= rs232_rx; -
-//5bit
when "0111" => rx_temp_data(6) <= rs232_rx; -
-//6bit
when "1000" => rx_temp_data(7) <= rs232_rx; -
-//7bit
when others =>
end case;
-- end;
elsif (num = "1010") then
num <= "0000";
rx_data_r <= rx_temp_data;
end if;
end if;
end if;
end process;

rx_data <= rx_data_r;


rx_int <= rx_int_i;

end architecture;

-- Very simple UART implementation


-- by Arif Sasongko

-- library
-- library IEEE;
library IEEE;
use IEEE.std_logic_1164.all;

-- Entity
Entity my_uart_top is
port(
clk : in std_logic;
rst_n : in std_logic;

-- paralel part
send : in std_logic;
send_data : in std_logic_vector(7 downto 0) ;
receive : out std_logic;
receive_data: out std_logic_vector(7 downto 0) ;

-- serial part
rs232_rx : in std_logic;
rs232_tx : out std_logic
);
end entity;

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 12


-- Architecture
Architecture structural of my_uart_top is

component my_uart_tx is
port(
clk,rst_n : in std_logic;
tx_data : in std_logic_vector(7 downto 0);
tx_int : in std_logic;
rs232_tx : out std_logic;
clk_bps : in std_logic;
bps_start : out std_logic

);
end component;

component my_uart_rx is
port(
clk : in std_logic;
rst_n : in std_logic;
rs232_rx : in std_logic;
clk_bps : in std_logic;
bps_start: out std_logic;
rx_data : out std_logic_vector(7 downto 0);
rx_int : out std_logic
);
end component;

component speed_select is
port(
clk : in std_logic;
rst_n : in std_logic;
bps_start : in std_logic;
clk_bps : out std_logic
);
end component ;

signal bps_start_rx,bps_start_tx : std_logic;


signal clk_bps_rx,clk_bps_tx: std_logic;

begin

speed_rx : speed_select
port map (
clk => clk,
rst_n => rst_n,
bps_start => bps_start_rx,
clk_bps => clk_bps_rx
);

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 13


speed_tx : speed_select
port map (
clk => clk,
rst_n => rst_n,
bps_start => bps_start_tx,
clk_bps => clk_bps_tx
);

receiver : my_uart_rx
port map (
clk => clk,
rst_n => rst_n,
rs232_rx => rs232_rx,
rx_data => receive_data,
rx_int => receive,
clk_bps => clk_bps_rx,
bps_start => bps_start_rx
);

transmitter : my_uart_tx
port map (
clk => clk,
rst_n => rst_n,
tx_data => send_data,
tx_int => send,
rs232_tx => rs232_tx,
clk_bps => clk_bps_tx,
bps_start => bps_start_tx
);

end architecture;

-- Arif Sasongko

-- library
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

-- entity
entity my_uart_tx is
port(
clk,rst_n : in std_logic;
tx_data : in std_logic_vector(7 downto 0);
tx_int : in std_logic;
rs232_tx : out std_logic;
clk_bps: in std_logic;
bps_start : out std_logic

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 14


);
end entity my_uart_tx;

--architecture

architecture RTL of my_uart_tx is


signal tx_int0,tx_int1,tx_int2, rs232_tx_r : std_logic;
signal neg_tx_int : std_logic;
signal tx_data_i : std_logic_vector(7 downto 0);
signal bps_start_r : std_logic;
signal tx_en: std_logic;
signal num : unsigned(3 downto 0);

begin
-
- The process below is to ensure 'neg_rx_int' react to negative edge of rx interr
upt
process (clk,rst_n)
begin
if rst_n = '0' then
tx_int0 <='0';
tx_int1 <='0';
tx_int2 <='0';
elsif (clk = '1' and clk'event) then
tx_int0 <= tx_int;
tx_int1 <= tx_int0;
tx_int2 <= tx_int1;
end if;
end process;

neg_tx_int <= ((not tx_int1) and tx_int2);

-- The process below is to control the transmission process:


-- --> take data from input (freeze the data)
-- --> generate bps_start_r signal
-- --> enable transmit signal (tx_en)

process( clk, rst_n)


begin
if rst_n = '0' then
bps_start_r <= 'Z';
tx_en <= '0';
tx_data_i <= "00000000";
elsif (clk= '1' and clk'event) then
if (neg_tx_int = '1') then
bps_start_r <= '1';
tx_data_i <= tx_data;
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 15
tx_en <= '1';
elsif (num = "1011") then
bps_start_r <= '0';
tx_en <= '0';
end if;
end if;
end process;

bps_start <= bps_start_r;

-- The process below send the data through the rs232_tx_r when tx_en is '1':
-- --> take data from input (freeze the data)
-- --> generate bps_start_r signal
-- --> enable transmit signal (tx_en)

process(clk, rst_n)
begin
if (rst_n = '0') then
num <= "0000";
rs232_tx_r <= '1';
elsif (clk = '1' and clk'event) then
if(tx_en = '1') then
if(clk_bps = '1') then
num <= num + "0001";
case num is
when "0000" => rs232_tx_r <= '0' ;
when "0001" => rs232_tx_r <= tx_data_i(0);
when "0010" => rs232_tx_r <= tx_data_i(1);
when "0011" => rs232_tx_r <= tx_data_i(2);
when "0100" => rs232_tx_r <= tx_data_i(3);
when "0101" => rs232_tx_r <= tx_data_i(4);
when "0110" => rs232_tx_r <= tx_data_i(5);
when "0111" => rs232_tx_r <= tx_data_i(6);
when "1000" => rs232_tx_r <= tx_data_i(7);
when "1001" => rs232_tx_r <= '1';
when others => rs232_tx_r <= '1';
end case;
elsif(num= "1011") then
num <= "0000";
end if;
end if;
end if;
end process;

rs232_tx <= rs232_tx_r;

end architecture;

-- Library

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 16


library IEEE;
use ieee.std_logic_1164.all;

-- entity
entity speed_select is
port(
clk : std_logic;
rst_n : std_logic;
bps_start : std_logic;
clk_bps : out std_logic
);
end entity;
--/*
--parameter bps9600 = 5207, //Ϊ9600bps
-- bps19200 = 2603, //Ϊ19200bps
-- bps38400 = 1301, //Ϊ38400bps
-- bps57600 = 867, //Ϊ57600bps
-- bps115200 = 433; //Ϊ115200bps

--parameter bps9600_2 = 2603,


-- bps19200_2 = 1301,
-- bps38400_2 = 650,
-- bps57600_2 = 433,
-- bps115200_2 = 216;
--*/

architecture RTL of speed_select is


signal cnt : integer range 0 to 8191; -- (2^13)-1

constant BPS_PARA: integer := 5207; -- 9600


constant BPS_PARA_2: integer := 2603; -- 9600

signal clk_bps_r : std_logic;


signal uart_ctrl : std_logic_vector(2 downto 0) ;
begin

process(clk, rst_n)
begin
if (rst_n = '0') then cnt <= 0;
elsif (clk='1' and clk'event) then
if ((cnt = BPS_PARA) or (bps_start = '0')) then cnt <= 0; -- end if;
else cnt <= cnt + 1;
end if;
end if;
end process;

process(clk, rst_n)
begin
if (rst_n = '0') then clk_bps_r <= '0';
elsif (clk='1' and clk'event) then
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 17
if((cnt = BPS_PARA_2) and (bps_start='1')) then clk_bps_r <= '1';
else clk_bps_r <= '0';
end if;
end if;
end process;

clk_bps <= clk_bps_r;

end architecture;

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 18

Anda mungkin juga menyukai