← Ana Sayfa

Fırat Üniversitesi Mantık Laboratuvarı Deney Raporları

8 Şubat 2025

Mantık Laboratuvarı deney raporları aşağıda verilmiştir. Bu raporlar bilgilendirme amaçlı olup herhangi bir kâr amacı gütmez.

Devreler ve kodlar teker teker incelenmiştir. Deneylerde Verilog dili kullanılmıştır.

Deney 2

Deneyin amacı; davranışları sözel olarak ifade edilmiş bir devrenin tasarımı için gerekli adımların uygulanışını görmek.

4 bitlik sayıyı gray koda çeviren devre
4 bitlik sayıyı gray koda çeviren devre

4 Bit Sayının 2'ye Tümleyeni

Bu devreyi tasarlamak için A B C D değerleri 0'dan 15'e kadar yazılır. Çıkışlar 4 bitlik olacağı için aynı şekilde F1 F2 F3 F4 çıkışlarına değerler yazılır ve 4 Karnaugh haritasında çözülür, ortaya çıkan harita sonuçları birleştirilir ve devre tasarlanır.

module devre(
    input A, B, C, D,
    output F1, F2, F3, F4, F5
);

assign F1 = ~A & ~B & ~C & ~D;
assign F2 = (~A & B) | (~A & D) | (~A & C) | (A & ~B & ~C & ~D);
assign F3 = (B & ~C & ~D) | (~B & D) | (~B & C);
assign F4 = (~C & D) | (C & ~D);
assign F5 = D;

endmodule

UCF Dosyası

NET "A" LOC = "P10";
NET "B" LOC = "P11";
NET "C" LOC = "P12";
NET "D" LOC = "P13";
NET "F1" LOC = "P14";
NET "F2" LOC = "P15";
NET "F3" LOC = "P16";
NET "F4" LOC = "P17";
NET "F5" LOC = "P18";

4 Bitin Gray Kodunu Bulan Kod

Bir önceki uygulamada olduğu gibi tüm değerler yazılır ve haritalar çözümlenir. Çözümlenen haritalara göre devre tasarlanır.

Binary değeri gray koda nasıl çeviririm?
Öncelikle sayının MSB değeri korunur. MSB değeri basamağın sağına kaydırılır ve bir önceki sayıyla toplanır. Bu işlem basamaklar bitene kadar tekrarlanır.

Gray kodu binary değere nasıl çeviririm?
MSB değerini aşağıya indir. İndirdiğin değeri bir sonrakiyle topla, tekrardan aşağıya indir. Bu işlem basamaklar bitene kadar tekrarlanır.

module devre(
    input A, B, C, D,
    output F1, F2, F3, F4
);

assign F1 = A;
assign F2 = A ^ B;
assign F3 = B ^ C;
assign F4 = C ^ D;

endmodule

UCF Dosyası

NET "A" LOC = "P10";
NET "B" LOC = "P11";
NET "C" LOC = "P12";
NET "D" LOC = "P13";
NET "F1" LOC = "P14";
NET "F2" LOC = "P15";
NET "F3" LOC = "P16";
NET "F4" LOC = "P17";
4 bitlik sayının 2'ye tümleyenini alan devre
4 bitlik sayının 2'ye tümleyenini alan devre

Deney 3

Deneyin amacı; temel birkaç matematiksel işlemin donanım üzerinde gerçekleştirilmesidir.

4 Bitlik Toplayıcı

module FourBitAdder(
    input [3:0] A, B,
    input CarryIn,
    output [3:0] Sum,
    output CarryOut
);

wire [4:0] toplam;

assign toplam = A + B + CarryIn;
assign {CarryOut, Sum} = (toplam[3:0] > 9) ? toplam + 6 : toplam;

endmodule

UCF Dosyası

NET "A[0]" LOC = "K17" | IOSTANDARD = LVCMOS33;
NET "A[1]" LOC = "K18" | IOSTANDARD = LVCMOS33;
NET "A[2]" LOC = "L14" | IOSTANDARD = LVCMOS33;
NET "A[3]" LOC = "L13" | IOSTANDARD = LVCMOS33;

NET "B[0]" LOC = "P15" | IOSTANDARD = LVCMOS33;
NET "B[1]" LOC = "P16" | IOSTANDARD = LVCMOS33;
NET "B[2]" LOC = "N14" | IOSTANDARD = LVCMOS33;
NET "B[3]" LOC = "N13" | IOSTANDARD = LVCMOS33;

NET "CarryIn" LOC = "M17" | IOSTANDARD = LVCMOS33;

NET "Sum[0]" LOC = "F12" | IOSTANDARD = LVCMOS33;
NET "Sum[1]" LOC = "G12" | IOSTANDARD = LVCMOS33;
NET "Sum[2]" LOC = "H14" | IOSTANDARD = LVCMOS33;
NET "Sum[3]" LOC = "H13" | IOSTANDARD = LVCMOS33;

NET "CarryOut" LOC = "J14" | IOSTANDARD = LVCMOS33;

4 Bitlik Toplayıcı/Çıkarıcı

module four_bit_adder_subtractor(
    input [3:0] sw_a, sw_b,
    input mode,
    output [3:0] leds,
    output carry_borrow
);

assign {carry_borrow, leds} = (mode == 0) ? sw_a + sw_b : sw_a - sw_b;

endmodule

UCF Dosyası

NET "sw_a<0>" LOC = "P1";
NET "sw_a<1>" LOC = "P2";
NET "sw_a<2>" LOC = "P3";
NET "sw_a<3>" LOC = "P4";

NET "sw_b<0>" LOC = "P5";
NET "sw_b<1>" LOC = "P6";
NET "sw_b<2>" LOC = "P7";
NET "sw_b<3>" LOC = "P8";

NET "mode" LOC = "P9";

NET "leds<0>" LOC = "P10";
NET "leds<1>" LOC = "P11";
NET "leds<2>" LOC = "P12";
NET "leds<3>" LOC = "P13";

NET "carry_borrow" LOC = "P14";

Deney 4 (MSI Elemanlar: Kod Çözücü ve Veri Seçiciler)

Deneyin amacı; küçük ölçekte tümleşik yapıların kombinezonal devre tasarımında kullanımını görmek.

module led_control(
    input s0, s1,
    input a, b, c, d,
    output reg led
);

always @(*) begin
    case ({s1, s0})
        2'b00: led = a & b;
        2'b01: led = c & d;
        2'b10: led = b & ~d;
        2'b11: led = ~a & c;
    endcase
end

endmodule

UCF Dosyası

NET "s0" LOC = "N3" | IOSTANDARD = LVCMOS33;
NET "s1" LOC = "E2" | IOSTANDARD = LVCMOS33;

NET "a" LOC = "F3" | IOSTANDARD = LVCMOS33;
NET "b" LOC = "G3" | IOSTANDARD = LVCMOS33;
NET "c" LOC = "B4" | IOSTANDARD = LVCMOS33;
NET "d" LOC = "K3" | IOSTANDARD = LVCMOS33;

NET "led" LOC = "G1" | IOSTANDARD = LVCMOS33;

Deney 5 (Sayıcılar)

Deneyin amacı; Flip-flop'ları kullanarak senkron ardışıl ve asenkron ardışıl lojik uygulamalarından sayıcı tasarımını gerçekleştirmek.

Uygulama 2: Bir giriş (x) yardımıyla 3 bitlik ileri/geri (x=0 ileri, x=1 geri) sayan bir senkron ardışıl sayıcının JK FF'lar ile gerçekleştirilmesi.

Uygulama 3: 0-15 arası 0-2-4-6-8-10-12-14-0-2… şeklinde sürekli olarak sadece çift sayıları sayan dalga iletimli bir sayıcıyı düşen kenar tetiklemeli JK tipi FF'ler ile tasarlayınız.

module counter(
    input clk, reset, button,
    output reg [3:0] count
);

reg eski = 0;

always @(posedge clk) begin
    if (reset)
        count <= 0;
    else if (button == 1 && eski == 0)
        count <= count + 2;
    eski <= button;
end

endmodule

UCF Dosyası

NET "clk" LOC = "B8";
NET "button" LOC = "G12";
NET "count[0]" LOC = "G1";
NET "count[1]" LOC = "P4";
NET "count[2]" LOC = "N4";
NET "count[3]" LOC = "N5";

Deney 6 (Senkron Ardışıl Lojik Uygulamaları)

Deneyin amacı Flip-flop'lar kullanılarak senkron ardışıl lojik uygulamalarından entegre ile sayıcı tasarımı uygulamaları.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity seven_segment_counter is
    Port (
        clk     : in STD_LOGIC;
        reset   : in STD_LOGIC;
        button  : in STD_LOGIC;
        up_down : in STD_LOGIC;
        seg_out : out STD_LOGIC_VECTOR(6 downto 0);
        anode   : out STD_LOGIC_VECTOR(3 downto 0)
    );
end seven_segment_counter;

architecture Behavioral of seven_segment_counter is

    signal count : STD_LOGIC_VECTOR(3 downto 0) := "0000";
    signal eski  : STD_LOGIC := '0';

begin

    process(clk, reset)
    begin
        if reset = '1' then
            count <= "0000";
        elsif rising_edge(clk) then
            if button = '1' and eski = '0' then
                if up_down = '1' then
                    if count = "1001" then
                        count <= "0000";
                    else
                        count <= count + 1;
                    end if;
                else
                    if count = "0000" then
                        count <= "1001";
                    else
                        count <= count - 1;
                    end if;
                end if;
            end if;
            eski <= button;
        end if;
    end process;

    with count select
        seg_out <= "1000000" when "0000",
                   "1111001" when "0001",
                   "0100100" when "0010",
                   "0110000" when "0011",
                   "0011001" when "0100",
                   "0010010" when "0101",
                   "0000010" when "0110",
                   "1111000" when "0111",
                   "0000000" when "1000",
                   "0010000" when "1001",
                   "1111111" when others;

    anode <= "1110";

end Behavioral;

UCF Dosyası

NET "clk" LOC = "B8";
NET "reset" LOC = "M6";
NET "button" LOC = "G12";
NET "up_down" LOC = "P11";

NET "seg_out<0>" LOC = "L14";
NET "seg_out<1>" LOC = "H12";
NET "seg_out<2>" LOC = "N14";
NET "seg_out<3>" LOC = "N11";
NET "seg_out<4>" LOC = "P12";
NET "seg_out<5>" LOC = "L13";
NET "seg_out<6>" LOC = "M12";

NET "anode<0>" LOC = "F12";
NET "anode<1>" LOC = "J12";
NET "anode<2>" LOC = "M13";
NET "anode<3>" LOC = "K14";

Deney 7

module deney7(
    input clk, x,
    output reg y
);

wire clk_out;
reg state = 0;

frequency f1(.clk(clk), .clk_out(clk_out));

always @(posedge clk_out) begin
    if (x == 1)
        state <= 0;
    else
        state <= 1;
end

always @(*) begin
    if (state == 1 && x == 1)
        y = 0;
    else
        y = 1;
end

endmodule

UCF Dosyası

NET "clk" LOC = "B8";
NET "x" LOC = "P11";
NET "y" LOC = "M5";

Frekans Dosyası

module frequency(
    input clk,
    output reg clk_out = 0
);

reg [25:0] sayac = 0;

always @(posedge clk) begin
    if (sayac == 49999999) begin
        sayac <= 0;
        clk_out <= ~clk_out;
    end
    else
        sayac <= sayac + 1;
end

endmodule

Öneri ve görüşlerinizi sağ üstte bulunan "İletişim" butonu üzerinden iletebilirsiniz.