Fırat Üniversitesi Mantık Laboratuvarı Deney Raporları
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 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";
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.