Senin, 30 Oktober 2017

Contoh Program Verilog FPGA

Assalamualaikum Wr. Wb. 
Dibawah ini saya paparkan mengenai contoh serta logika program verilog FPGA menurut pengertian dari yang saya pahami. 

Mux

Logika Program :
  • Baris 1 – 6 adalah memberikan penjelasan berupa komentar yang diawali perintah “//”.
  • Perintah “module mux_using_case” adalah perintah untuk membuat module yang bernama “mux_using_case”.
  • Baris 8 – 12 adalah perintah untuk mendeklarasikan variabel yang akan dipakai pada program. Variabel yang digunakan pada program kali ini adalah din_0, din_1, sel, dan mux_out.
  • Perintah “input din_0, din_1, sel” maksudnya adalah variabel din_0, din_1, sel didefinisikan sebagai inputan.
  • Perintah “output mux_out” maksudnya adalah variabel mux_out didefinisikan sebagai output.
  • Perintah “reg mux_out” maksudnya adalah variabel mux_out disimpan sementara pada suatu register “reg”.
  • Perintah “always @ (sel or din_0 or din_1)” maksudnya adalah input sel atau din_0 atau din_1 selalu diatur secara terus-menerus untuk menghantarkan nilai masukkan ke pin-pin keluaran.
  • begin : MUX
     case(sel )
        1'b0 : mux_out = din_0;
        1'b1 : mux_out = din_1;
    Perintah “begin” digunakan untuk memulai proses kondisi case dari MUX. Perintah “case(sel)” untuk memasukkan variabel input sel untuk kondisi case.  Apabila 1’b0 maka output mux_out akan sama dengan input din_0. Apabila 1’b1 maka output mux_out akan sama dengan input din_1.
  • Perintah “endcase” digunakan untuk mengakhiri perintah kondisi case. 
  • Perintah “end module” digunakan untuk mengakhiri perintah program module up_counter.
 Encoder

 

Logika Program :
  • Baris 1 – 6 adalah memberikan penjelasan berupa komentar yang diawali perintah “//”.
  • Perintah “module encoder_using_case” adalah perintah untuk membuat module yang bernama “encoder_using_case”.
  • Baris 8 – 10 adalah perintah untuk mendeklarasikan variabel yang akan dipakai pada program. Variabel yang digunakan pada program kali ini adalah binary_out, encoder_in, dan enable.
  • Perintah “output [3:0] binary_out” maksudnya adalah varibel binary_out didefinisikan sebagai output pada FPGA yang memiliki 4 bit data (0-3).
  • Perintah “input enable” maksudnya adalah variabel enable didefinisikan sebagai inputan.
  • Perintah “input [15:0] encoder_in” maksudnya adalah variabel encoder_in didefinisikan sebagai inputan dengan 16 bit data (0-15).
  • Perintah “reg [3:0] binary_out” maksudnya adalah variabel binary_out disimpan sementara pada suatu register “reg”.
  • Perintah “always @ (enable or encoder_in)” maksudnya adalah input enable atau encoder_in selalu diatur secara terus-menerus untuk menghantarkan nilai masukkan ke pin-pin keluaran.
  • Perintah pada baris 19 – 37 maksudnya adalah 16 bit mewakili kondisi input h0002 akan menghasilkan output 1 berupa bilangan biner. 16 bit mewakili kondisi input h0004 akan menghasilkan output 2 berupa bilangan biner. 16 bit mewakili kondisi input h0008 akan menghasilkan output 3 berupa bilangan biner. Begitu seterusnya hingga 16 bit mewakili kondisi input h8000 akan menghasilkan output 15 berupa bilangan biner. Jadi pada rangkaian encoder ini akan merubah input berupa bilangan desimal menjadi output sebuah bilangan biner.
  • Perintah “endcase” digunakan untuk mengakhiri perintah kondisi case.
  • Perintah “end” digunakan untuk mengakhiri perintah.
  • Perintah “end module” digunakan untuk mengakhiri perintah program module decoder_using_case
 Decoder 


Logika Program :
  • Baris 1 – 6 adalah memberikan penjelasan berupa komentar yang diawali perintah “//”.
  • Perintah “module decoder_using_case” adalah perintah untuk membuat module yang bernama “decoder_using_case”.
  • Baris 8 – 10 adalah perintah untuk mendeklarasikan variabel yang akan dipakai pada program. Variabel yang digunakan pada program kali ini adalah binary_in, decoder_out, dan enable.
  • Perintah “input [3:0] binary_in” maksudnya adalah variabel binary_in didefinisikan sebagai inputan dengan 4 bit data.
  • Perintah “input enable” maksudnya adalah variabel enable didefinisikan sebagai inputan.
  • Perintah “output [15:0] decoder_out” maksudnya adalah varibel decoder_out didefinisikan sebagai output pada FPGA yang memiliki 16 bit data (0-15).
  • Perintah “reg [15:0] decoder_out” maksudnya adalah variabel decoder_out disimpan sementara pada suatu register “reg”.
  • Perintah “always @ (enable or binary_in)” maksudnya adalah input enable atau binary_in selalu diatur secara terus-menerus untuk menghantarkan nilai masukkan ke pin-pin keluaran.
  • Maksud perintah baris ke 19 – 38 adalah 4 bit sebagai input apabila kondisi h0 maka output dari decoder_out akan mengeksekusi bilangan desimal 1. 4 bit sebagai input apabila kondisi h1 maka output dari decoder_out akan mengeksekusi bilangan desimal 2. 4 bit sebagai input apabila kondisi h2 maka output dari decoder_out akan mengeksekusi bilangan desimal 3. Begitu seterusnya sampai 4 bit sebagai input apabila kondisi hf maka output dari decoder_out akan mengeksekusi bilangan desimal 15. Jadi pada rangkaian decoder ini akan merubah input berupa bilangan biner menjadi output sebuah bilangan desimal.
  • Perintah “endcase” digunakan untuk mengakhiri perintah kondisi case.
  • Perintah “end” digunakan untuk mengakhiri perintah.
  • Perintah “end module” digunakan untuk mengakhiri perintah program module decoder_using_case.
 Flip-Flop 

 
Logika Program :

  • Baris 1 – 6 adalah memberikan penjelasan berupa komentar yang diawali perintah “//”. 
  • Perintah “module dlatch_reset” adalah perintah untuk membuat module yang bernama “dlatch_reset”.
  • Baris 8 – 12 adalah perintah untuk mendeklarasikan variabel yang akan dipakai pada program. Variabel yang digunakan pada program kali ini adalah data, en, reset, dan q. 
  • Perintah “input data, en, reset” maksudnya adalah variabel data, en, reset didefinisikan sebagai inputan.
  • Perintah “output q” maksudnya adalah varibel q didefinisikan sebagai output. 
  • Perintah “reg q” maksudnya adalah variabel q disimpan sementara pada suatu register “reg”.
  • Perintah “always @ (en or reset or data)” maksudnya adalah input en atau reset atau data selalu diatur secara terus-menerus untuk menghantarkan nilai masukkan ke pin-pin keluaran. 
  • If (~reset) begin
    q <= 1’b0 ;

    end else if (en) begin

    q <= data ;

    Perintah tersebut maksudnya adalah Jika tidak me-reset, maka output q kurang dari sama dengan 1b’0. Dan jika input en, maka output q kurang dari sama dengan data. 
  • Perintah “end” digunakan untuk mengakhiri perintah kondisi.
  • Perintah “end module” digunakan untuk mengakhiri perintah program module dlatch_reset.

 Counter




Logika Program :

  • Baris 1 – 6 adalah memberikan penjelasan berupa komentar yang diawali perintah “//”.
  • Perintah “module up_counter” adalah perintah untuk membuat module yang bernama “up_counter”.
  • Baris 8 – 12 adalah perintah untuk mendeklarasikan variabel yang akan dipakai pada program. Variabel yang digunakan pada program kali ini adalah out, enable, clk, dan reset.
  • Perintah “output [7:0] out” maksudnya adalah varibel out didefinisikan sebagai output pada FPGA yang memiliki 8 buah output (0-7).
  • Perintah “input enable, clk, reset” maksudnya adalah variabel enable, clk, reset didefinisikan sebagai inputan.
  • Perintah “reg [7:0] out” maksudnya adalah variabel out disimpan sementara pada suatu register “reg”.
  • Perintah “always @ (posedge clk)” maksudnya adalah clock (clk) diatur secara terus-menerus untuk menghantarkan nilai masukkan ke pin-pin keluaran. Perintah “posedge” maksudnya adalah pendefinisian clock (clk) yang aktif pada sisi naik-positif.
  • if (reset) begin
    out <= 8'b0 ;
    end else if (enable) begin
    out <= out + 1;
    Perintah tersebut maksudnya adalah sebuah kondisi.  Jika kondisi inputnya reset, maka output yang akan dihasilkan adalah 0 semua dari 8 bit (akan me-reset). Jika kondisi inputnya enable maka outputnya adalah output sebelumnya + 1.
  • Perintah “end” digunakan untuk mengakhiri perintah kondisi.
  • Perintah “end module” digunakan untuk mengakhiri perintah program module up_counter.
 Memori




Logika Program :

  • Baris 1 – 6 adalah memberikan penjelasan berupa komentar yang diawali perintah “//”.
  • Perintah “module rom_using_file” adalah perintah untuk membuat module yang bernama “rom_using_file”.
  • Baris 8 – 12 adalah perintah untuk mendeklarasikan variabel yang akan dipakai pada program. Variabel yang digunakan pada program kali ini adalah address, data, read_en, dan ce.
  • Perintah “input [7:0] address” maksudnya adalah variabel address didefinisikan sebagai inputan 8 buah (0-7).
  • Perintah “output [7:0] data” maksudnya adalah variabel data didefinisikan sebagai output 8 buah (0-7).
  • Perintah “input read_en” maksudnya adalah variabel read_en didefinisikan sebagai inputan.  
  • Perintah “input ce” maksudnya adalah variabel ce didefinisikan sebagai inputan.
  • Perintah “reg [7:0] mem [0:255]” maksudnya adalah 0-7 bit dan 0-255 bit disimpan sementara pada suatu register “reg”.
  • assign data = (ce && read_en) ? mem[address] : 8'b0;”
    maksudnya adalah menetapkan input sebagai variabel read_en dan ce kemudian juga menetapkan address 8’b0 sebagai input memori data.
  • initial begin
    $readmemb("memory.list", mem); // memory_list is memory file
    Maksudnya adalah memori yang diprogram dapat diaca dan dihapus serta dapat ditulis kembali disebut “memori.list” menggunakan ukuran yang tertera pada register pada perintah sebelumnya. Memori ini juga bersifat non-volatile atau tidak hilang kalau tidak ada aliran listrik.
  • Perintah “end” digunakan untuk mengakhiri perintah program.
  • Perintah “end module” digunakan untuk mengakhiri perintah program module rom_using_file.
Parity and CRC 

Logika Program :
  • Baris 1 – 6 adalah memberikan penjelasan berupa komentar yang diawali perintah “//”.
  • Perintah “module parity_using_assign” adalah perintah untuk membuat module yang bernama “parity_using_assign”.
  • Baris 8 – 10 adalah perintah untuk mendeklarasikan variabel yang akan dipakai pada program. Variabel yang digunakan pada program kali ini adalah data_in dan parity_out.
  • Perintah “output parity_out” maksudnya adalah variabel parity_out didefinisikan sebagai output.
  • Perintah “input [7:0] data_in” maksudnya adalah variabel data_in didefinisikan sebagai inputan 8 buah (0-7).
  • Perintah “wire parity_out” maksudnya adalah sebagai penyambung pin ke output parity_out.
  • assign parity_out =  (data_in[0] ^ data_in[1]) ^
         
                   (data_in[2] ^ data_in[3]) ^
                        
    (data_in[4] ^ data_in[5]) ^
                        
    (data_in[6] ^ data_in[7]);
    Perintah tersebut maksudnya adalah menetapkan output variabel parity out dengan data_in[0] sampai data_in[7] membentuk sebuah parity sesuai dengan inputannya serta membandingkannya, apabila ganjil maka led akan menyala. 
  • Perintah “end module” digunakan untuk mengakhiri perintah program module parity_using_assign.

Sumber sintaks : http://asic-world.com/examples/verilog/index.html

        Sekian tugas ini saya buat. Mohon maaf apabila banyak kesalahan dan kekurangan karena saya juga masih belajar. Mohon maklum.
Wassalamualaikum Wr. Wb.