commit 3b63d221af10d0bb78e73bd6de38055c647358dd Author: Kostas Drakontidis Date: Wed Nov 4 11:32:14 2026 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..35c418d --- /dev/null +++ b/.gitignore @@ -0,0 +1,74 @@ +######################################################################################### +## Project : Collect of various scripts for working with EDA-tools (ASIC/FPGA/etc) ## +## Link : https://github.com/iDoka/eda-scripts ## +## Description: .gitignore ## +## Usage : just rename or add contain to .gitignore ## +## License : MIT ## +######################################################################################### + +## log files +*.log +*.jou +*.rpt +*.vdi + +## bitstream +*.bit +*.bin +*.mcs +*.svf +*.image + +## netlist +*.edf +*.edif +*.vn +*.vm + +## SDF +*.sdf + +## sim dump +*.vcd +*.saif +*.tcf +*.wdb + +## others +unisims + +## C-files +*.elf +*.a +*.sa +*.so +*.lib + +## dirs +vivado.cache/ +vivado.hw/ +vivado.ip_user_files/ +vivado.runs/ +vivado.sim/ + +###### for Xilinx Vivado|ISE +.Xil/ +.cache/ +fsm_encoding.os +tab_*/ +webtalk.* +vivado_pid*.str +hs_err_pid* +xelab.* +xsim.* +xvlog.* +*.cache +*.sim +*.runs +*.hw +*.backup.* +*.debug + +## checkpoint files +*.dcp + diff --git a/lab1/lab1.ip_user_files/README.txt b/lab1/lab1.ip_user_files/README.txt new file mode 100644 index 0000000..023052c --- /dev/null +++ b/lab1/lab1.ip_user_files/README.txt @@ -0,0 +1 @@ +The files in this directory structure are automatically generated and managed by Vivado. Editing these files is not recommended. diff --git a/lab1/lab1.srcs/constrs_1/imports/source/boolean.xdc b/lab1/lab1.srcs/constrs_1/imports/source/boolean.xdc new file mode 100644 index 0000000..271be50 --- /dev/null +++ b/lab1/lab1.srcs/constrs_1/imports/source/boolean.xdc @@ -0,0 +1,19 @@ +## This file is a general .xdc for the Spartan-7 Boolean Board +### Clock Signal +set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { clk }]; +create_clock -add -name sys_clk -period 10.00 -waveform {0 5} [get_ports { clk }]; +### 7-Segment Display +set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { a }]; +set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { b }]; +set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { c }]; +set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { d }]; +set_property -dict { PACKAGE_PIN A7 IOSTANDARD LVCMOS33 } [get_ports { e }]; +set_property -dict { PACKAGE_PIN D6 IOSTANDARD LVCMOS33 } [get_ports { f }]; +set_property -dict { PACKAGE_PIN B5 IOSTANDARD LVCMOS33 } [get_ports { g }]; +set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { dp }]; +set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { an0 }]; +set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { an1 }]; +set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { an2 }]; +set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { an3 }]; +### Button(s) +set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { reset }]; diff --git a/lab1/lab1.srcs/sim_1/imports/source/tb.v b/lab1/lab1.srcs/sim_1/imports/source/tb.v new file mode 100644 index 0000000..b34a746 --- /dev/null +++ b/lab1/lab1.srcs/sim_1/imports/source/tb.v @@ -0,0 +1,26 @@ +`timescale 1ns / 1ps + +module tb; + + reg [3:0] char; + wire [6:0] LED; + integer i; + + LEDdecoder dut ( + .char(char), + .LED (LED) + ); + + initial begin + $dumpfile("wave.vcd"); + $dumpvars(0, tb); + + for (i = 0; i < 16; i = i + 1) begin + char = i; + #10; + $display("char=%h LED{a..g}=%b", char, LED); + end + $finish; + end + +endmodule diff --git a/lab1/lab1.srcs/sim_1/imports/source/tb_driver.v b/lab1/lab1.srcs/sim_1/imports/source/tb_driver.v new file mode 100644 index 0000000..1d21fca --- /dev/null +++ b/lab1/lab1.srcs/sim_1/imports/source/tb_driver.v @@ -0,0 +1,60 @@ +`timescale 1ns / 1ps + +module tb_driver; + + reg clk = 0; + reg reset = 1; + wire an3, an2, an1, an0; + wire a, b, c, d, e, f, g, dp; + + FourDigitLEDdriver dut ( + .clk(clk), + .reset(reset), + .an3(an3), + .an2(an2), + .an1(an1), + .an0(an0), + .a(a), + .b(b), + .c(c), + .d(d), + .e(e), + .f(f), + .g(g), + .dp(dp) + ); + + always #5 clk = ~clk; // 100 MHz + + wire [3:0] low = ~{an3, an2, an1, an0}; + always @(low) + if ((low & (low - 1)) != 0) + $display("ERROR t=%0t: επικάλυψη ανόδων, an=%b", $time, {an3, an2, an1, an0}); + + always @(an3 or an2 or an1 or an0) + $display( + "t=%0t state=%b digit=%h an=%b%b%b%b seg(abcdefg)=%b%b%b%b%b%b%b", + $time, + dut.state, + dut.digit, + an3, + an2, + an1, + an0, + a, + b, + c, + d, + e, + f, + g + ); + + initial begin + $dumpfile("wave_driver.vcd"); + $dumpvars(0, tb_driver); + #100 reset = 0; + #20000 $finish; + end + +endmodule diff --git a/lab1/lab1.srcs/sources_1/imports/source/FourDigitLEDdriver.v b/lab1/lab1.srcs/sources_1/imports/source/FourDigitLEDdriver.v new file mode 100644 index 0000000..058b785 --- /dev/null +++ b/lab1/lab1.srcs/sources_1/imports/source/FourDigitLEDdriver.v @@ -0,0 +1,91 @@ +module FourDigitLEDdriver ( + input clk, + input reset, + output an3, + an2, + an1, + an0, + output a, + b, + c, + d, + e, + f, + g, + dp +); + + wire clk_fb, clk_slow_raw, clk_slow, locked; + + MMCME2_BASE #( + .BANDWIDTH ("OPTIMIZED"), + .CLKIN1_PERIOD (10.0), // 100 MHz + .DIVCLK_DIVIDE (1), + .CLKFBOUT_MULT_F (6.0), // VCO = 600 MHz + .CLKOUT1_DIVIDE (120), // 600/120 = 5 MHz + .CLKFBOUT_PHASE (0.0), + .CLKOUT1_PHASE (0.0), + .CLKOUT1_DUTY_CYCLE(0.5), + .STARTUP_WAIT ("FALSE") + ) MMCME2_BASE_inst ( + .CLKIN1(clk), + .CLKFBIN(clk_fb), + .CLKFBOUT(clk_fb), + .CLKOUT1(clk_slow_raw), + .LOCKED(locked), + .PWRDWN(1'b0), + .RST(reset) + ); + + BUFG bufg_slow ( + .I(clk_slow_raw), + .O(clk_slow) + ); + + wire rst_int = reset | ~locked; + + reg [3:0] state; + always @(posedge clk_slow or posedge rst_int) begin + if (rst_int) state <= 4'b1111; + else state <= state - 1; // one step per 200 ns + end + + reg [3:0] an; + reg [3:0] digit; + + always @(*) begin + case (state) + 4'b1110: an = 4'b0111; + 4'b1010: an = 4'b1011; + 4'b0110: an = 4'b1101; + 4'b0010: an = 4'b1110; + default: an = 4'b1111; + endcase + end + + always @(*) begin + case (state) + 4'b0000, 4'b1111, 4'b1110, 4'b1101: digit = 4'h0; + 4'b1100, 4'b1011, 4'b1010, 4'b1001: digit = 4'h1; + 4'b1000, 4'b0111, 4'b0110, 4'b0101: digit = 4'h2; + default: digit = 4'h3; + endcase + end + + wire [6:0] LED; + LEDdecoder LEDdecoder_inst ( + .char(digit), + .LED (LED) + ); + + assign {an3, an2, an1, an0} = an; + assign a = ~LED[6]; + assign b = ~LED[5]; + assign c = ~LED[4]; + assign d = ~LED[3]; + assign e = ~LED[2]; + assign f = ~LED[1]; + assign g = ~LED[0]; + assign dp = 1'b1; + +endmodule diff --git a/lab1/lab1.srcs/sources_1/imports/source/LEDdecoder.v b/lab1/lab1.srcs/sources_1/imports/source/LEDdecoder.v new file mode 100644 index 0000000..a639af1 --- /dev/null +++ b/lab1/lab1.srcs/sources_1/imports/source/LEDdecoder.v @@ -0,0 +1,24 @@ +module LEDdecoder ( + input [3:0] char, + output [6:0] LED +); + + assign LED = (char == 4'h0) ? 7'b1111110 : // 0 + (char == 4'h1) ? 7'b0110000 : // 1 + (char == 4'h2) ? 7'b1101101 : // 2 + (char == 4'h3) ? 7'b1111001 : // 3 + (char == 4'h4) ? 7'b0110011 : // 4 + (char == 4'h5) ? 7'b1011011 : // 5 + (char == 4'h6) ? 7'b1011111 : // 6 + (char == 4'h7) ? 7'b1110000 : // 7 + (char == 4'h8) ? 7'b1111111 : // 8 + (char == 4'h9) ? 7'b1111011 : // 9 + (char == 4'hA) ? 7'b1110111 : // A + (char == 4'hB) ? 7'b0011111 : // B + (char == 4'hC) ? 7'b1001110 : // C + (char == 4'hD) ? 7'b0111101 : // D + (char == 4'hE) ? 7'b1001111 : // E + (char == 4'hF) ? 7'b1000111 : // F + 7'b0000000; + +endmodule diff --git a/lab1/lab1.xpr b/lab1/lab1.xpr new file mode 100644 index 0000000..530f711 --- /dev/null +++ b/lab1/lab1.xpr @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Vivado Synthesis Defaults + + + + + + + + + + + Default settings for Implementation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default_dashboard + + + + + +