uni

University stuff
git clone git://git.christosmarg.xyz/uni-assignments.git
Log | Files | Refs | README | LICENSE

commit 89b5525de39b47b99e2aaab1b430e81c487cb39e
parent d0e34320b93525004ad9003096272246f0359c8c
Author: Christos Margiolis <christos@margiolis.net>
Date:   Sun, 11 Apr 2021 00:17:43 +0300

more stuff

Diffstat:
ALICENSE | 20++++++++++++++++++++
Dc-data-structures/a.out | 0
Dc-data-structures/data | 2--
Ac-os2/ex1/ex1.c | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Ac-os2/ex1/ex2.c | 103+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ac-os2/ex1/ex3.c | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ac-os2/lab2_fifo.c | 48++++++++++++++++++++++++++++++++++++++++++++++++
Ac-os2/lab2_pipe.c | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ajava-development/Occurences.java | 22++++++++++++++++++++++
Ajava-development/RecursiveRev.java | 14++++++++++++++
Ajava-development/lol/Main.java | 12++++++++++++
Ajava-development/lol/Pixel.java | 27+++++++++++++++++++++++++++
Ajava-development/lol/Point.java | 23+++++++++++++++++++++++
Ajava-development/lol/Rectangle.java | 37+++++++++++++++++++++++++++++++++++++
Aoctave-signals-systems/ex1/doc.pdf | 0
Aoctave-signals-systems/ex1/doc.tex | 618+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aoctave-signals-systems/ex1/res/fig1.jpg | 0
Aoctave-signals-systems/ex1/res/fig2.jpg | 0
Aoctave-signals-systems/ex1/res/fig3.jpg | 0
Aoctave-signals-systems/ex1/res/fig4.jpg | 0
Aoctave-signals-systems/ex1/res/fig5.jpg | 0
Aoctave-signals-systems/ex2/doc.pdf | 0
Aoctave-signals-systems/ex2/doc.tex | 310+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aoctave-signals-systems/ex2/res/fig2.png | 0
Aoctave-signals-systems/ex2/res/fig3.png | 0
Aoctave-signals-systems/ex2/res/fig4.png | 0
Aoctave-signals-systems/ex2/res/fig5.png | 0
Aoctave-signals-systems/ex2/res/fig6.png | 0
Aoctave-signals-systems/ex2/res/fig7.png | 0
Aoctave-signals-systems/ex2/res/uniwalogo.png | 0
Avhdl-digital-design/Makefile | 12++++++++++++
Avhdl-digital-design/ex1/Makefile | 1+
Avhdl-digital-design/ex1/dec2to4.vhd | 16++++++++++++++++
Avhdl-digital-design/ex1/dec2to4_tb.vhd | 37+++++++++++++++++++++++++++++++++++++
Avhdl-digital-design/ex1/dec2to4en.vhd | 17+++++++++++++++++
Avhdl-digital-design/ex1/dec2to4en_tb.vhd | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Avhdl-digital-design/ex1/ex1.pdf | 0
Avhdl-digital-design/ex1/fa.vhd | 14++++++++++++++
Avhdl-digital-design/ex1/fa_tb.vhd | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Avhdl-digital-design/ex1/ha.vhd | 14++++++++++++++
Avhdl-digital-design/ex1/ha_tb.vhd | 43+++++++++++++++++++++++++++++++++++++++++++
Avhdl-digital-design/ex1/mux4to1.vhd | 22++++++++++++++++++++++
Avhdl-digital-design/ex1/mux4to1_tb.vhd | 44++++++++++++++++++++++++++++++++++++++++++++
Avhdl-digital-design/ex1/mux_triple_2to1.vhd | 14++++++++++++++
Avhdl-digital-design/ex1/mux_triple_2to1_tb.vhd | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Avhdl-digital-design/mux2to1.vhd | 15+++++++++++++++
Avhdl-digital-design/mux2to1_tb.vhd | 33+++++++++++++++++++++++++++++++++
47 files changed, 1916 insertions(+), 2 deletions(-)

diff --git a/LICENSE b/LICENSE @@ -0,0 +1,20 @@ +MIT License + +(c) 2019-Present Christos Margiolis <christos@christosmarg.xyz> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/c-data-structures/a.out b/c-data-structures/a.out Binary files differ. diff --git a/c-data-structures/data b/c-data-structures/data @@ -1,2 +0,0 @@ -123 held 123.00 -1911 lll 11.00 diff --git a/c-os2/ex1/ex1.c b/c-os2/ex1/ex1.c @@ -0,0 +1,49 @@ +#include <unistd.h> + +/* + * Εργαστήριο ΛΣ2 (Δ6) / Εργασία 1: Άσκηση 1 / 2020-2021 + * Ονοματεπώνυμο: Χρήστος Μαργιώλης + * ΑΜ: 19390133 + * Τρόπος μεταγλώττισης: `cc ex1.c -o ex1` + */ + +int +main(int argc, char *argv[]) +{ + pid_t pid1, pid2, pid3, pid4, pid5; + + /* + * Το παρακάτω πρόγραμμα παράγει 7 διεργασίες. Το παρακάτω διάγραμμα + * περιγράφει την συγγένεια μεταξύ των διεργασιών που δημιουργήθηκαν. + * + * P0 + * / | \ + * P2 P1 P3 + * / | + * P3 P4 + * | + * P5 + * + * Πιο αναλυτικά, το πρόγραμμα λειτουργεί ως εξής: + * - pid1 = fork(): δημιουργείται από την αρχική διεργασία ένα + * child. + * - Αν βρισκόμαστε στον πατέρα, τότε + * - pid2 = fork(); + * - pid3 = fork(); + * Δηλαδή δημιουργούμε άλλες 3 διεργασίες. + * - Αν βρισκόμαστε στο παιδί, δημιουργούμε άλλη μία διεργασία + * με την pid4 = fork(). + * - Το παιδί που δημιουργεί η παραπάνω διεργασία, παράγει άλλη + * μία διεργασία με την pid5 = fork(). + */ + + if ((pid1 = fork()) != 0) { + pid2 = fork(); + pid3 = fork(); + } else { + if ((pid4 = fork()) == 0) + pid5 = fork(); + } + + return 0; +} diff --git a/c-os2/ex1/ex2.c b/c-os2/ex1/ex2.c @@ -0,0 +1,103 @@ +#include <sys/wait.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +/* + * Εργαστήριο ΛΣ2 (Δ6) / Εργασία 1: Άσκηση 2 / 2020-2021 + * Ονοματεπώνυμο: Χρήστος Μαργιώλης + * ΑΜ: 19390133 + * Τρόπος μεταγλώττισης: `cc ex2.c -o ex2` + */ + +static char *argv0; + +/* + * Print a process' info. `n` indicates which process is being + * printed -- for example `printproc(2)` will print P2. + */ +static void +printproc(int n) +{ + printf("p: %d\tpid: %d\tppid: %d\n", n, getpid(), getppid()); +} + +static void +die(const char *str) +{ + fprintf(stderr, "%s: ", argv0); + perror(str); + exit(EXIT_FAILURE); +} + +int +main(int argc, char *argv[]) +{ + char buf[32]; /* message buffer */ + int fd[2]; /* pipe(2) file descriptors */ + int n; /* bytes returned from read(2) */ + int i = 3; /* P2 will create 3 child procs */ + + argv0 = *argv; + + /* create pipe */ + if (pipe(fd) < 0) + die("pipe"); + + printproc(0); + + /* create P1 */ + switch (fork()) { + case -1: + die("fork"); + case 0: + printproc(1); + (void)strcpy(buf, "Hello from your first child\n"); + /* close read fd and send message to P0 */ + (void)close(fd[0]); + if (write(fd[1], buf, sizeof(buf)) != sizeof(buf)) + die("write"); + exit(EXIT_SUCCESS); + default: + /* close write fd and receive message from P1 */ + (void)close(fd[1]); + if ((n = read(fd[0], buf, sizeof(buf))) != sizeof(buf)) + die("read"); + if (write(STDOUT_FILENO, buf, n) != n) + die("write"); + if (wait(NULL) == -1) + die("wait"); + /* create P2 */ + switch (fork()) { + case -1: + die("fork"); + case 0: + printproc(2); + /* create P3, P4 and P5 */ + while (i--) { + switch (fork()) { + case -1: + die("fork"); + case 0: + printproc(2 + i + 1); + exit(EXIT_SUCCESS); + default: + /* wait for all children to exit first */ + if (wait(NULL) == -1) + die("wait"); + } + } + exit(EXIT_SUCCESS); + default: + /* wait for P2 to exit */ + if (wait(NULL) == -1) + die("waitpid"); + } + if (execl("/bin/ps", "ps", NULL) == -1) + die("execl"); + } + + return 0; +} diff --git a/c-os2/ex1/ex3.c b/c-os2/ex1/ex3.c @@ -0,0 +1,86 @@ +#include <pthread.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +/* + * Εργαστήριο ΛΣ2 (Δ6) / Εργασία 1: Άσκηση 3 / 2020-2021 + * Ονοματεπώνυμο: Χρήστος Μαργιώλης + * ΑΜ: 19390133 + * Τρόπος μεταγλώττισης: `cc ex3.c -lpthread -o ex3` + */ + +static char *argv0; + +static void * +calcsum(void *tid) +{ + printf("td: %ld\n", (long)tid); + return NULL; +} + +static void +die(const char *str) +{ + fprintf(stderr, "%s: ", argv0); + perror(str); + exit(EXIT_FAILURE); +} + +int +main(int argc, char *argv[]) +{ + pthread_t *tds; + FILE *fp; + int *arr; + long i; + long n; + int nt; + + argv0 = *argv++; + + do { + /* we cannot have < 0 threads */ + printf("p: "); + scanf("%d", &nt); + } while (nt < 0); + + do { + /* make sure `n` is positive and also a multiple of `nt` */ + printf("n: "); + scanf("%ld", &n); + } while (n < 0 || n % nt != 0); + + if ((tds = malloc(nt * sizeof(pthread_t))) == NULL) + die("malloc"); + + if ((arr = malloc(n * sizeof(int))) == NULL) + die("malloc:"); + + /* + * if an argument was passed, use it as a file to read from, + * otherwise read from stdin. + */ + if (*argv == NULL) + fp = stdin; + else + if ((fp = fopen(*argv, "r")) == NULL) + die("fopen"); + for (i = 0; i < n; i++) + fscanf(fp, "%d", &arr[i]); + (void)fclose(fp); + + for (i = 0; i < n; i++) { + if (pthread_create(&tds[i], NULL, calcsum, (void *)i) != 0) + die("pthread_create"); + /* TODO: :-) */ + if (pthread_join(tds[i], NULL) != 0) + die("pthread_join"); + } + pthread_exit(NULL); + + free(tds); + free(arr); + + return 0; +} diff --git a/c-os2/lab2_fifo.c b/c-os2/lab2_fifo.c @@ -0,0 +1,48 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/wait.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +static void +die(const char *str) +{ + perror(str); + exit(EXIT_FAILURE); +} + +int +main(int argc, char *argv[]) +{ + FILE *cfp, *pfp; + char coolfifo[] = "/tmp/coolfifo"; + pid_t pid; + int ret, val; + + if ((ret = mkfifo(coolfifo, 0600)) < 0) + die("mkfifo"); + switch (pid = fork()) { + case -1: + die("fork"); + case 0: + if ((cfp = fopen(coolfifo, "w")) == NULL) + die("fopen"); + ret = fprintf(cfp, "%d", 1000); + fflush(cfp); + exit(0); + default: + if ((pfp = fopen(coolfifo, "r")) == NULL) + die("fopen"); + if ((ret = fscanf(pfp, "%d", &val)) < 0) + die("fscanf"); + fclose(pfp); + printf("parent: recv: %d\n", val); + unlink(coolfifo); + exit(0); + } + + return 0; +} diff --git a/c-os2/lab2_pipe.c b/c-os2/lab2_pipe.c @@ -0,0 +1,68 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/wait.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define DEFPAGER "/usr/bin/less" + +static void +die(const char *str) +{ + perror(str); + exit(EXIT_FAILURE); +} + +int +main(int argc, char *argv[]) +{ + FILE *fp; + char buf[BUFSIZ], *pager, *argv0; + pid_t pid; + int fd[2], n; + + if (argc != 2) + die("usage: foo file"); + if ((fp = fopen(argv[1], "r")) == NULL) + die("fopen"); + if (pipe(fd) < 0) + die("pipe"); + + switch (pid = fork()) { + case -1: + die("fork"); + case 0: + close(fd[1]); + if (fd[0] != STDIN_FILENO) { + if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO) + die("dup2"); + close(fd[0]); + } + if ((pager = getenv("PAGER")) == NULL) + pager = DEFPAGER; + if ((argv0 = strrchr(pager, '/')) != NULL) + argv0++; + else + argv0 = pager; + if (execlp(pager, argv0, NULL) < 0) + die("execlp"); + default: + close(fd[0]); + while (fgets(buf, BUFSIZ, fp) != NULL) { + n = strlen(buf); + if (write(fd[1], buf, n) != n) + die("write"); + } + if (ferror(fp)) + die("fgets"); + close(fd[1]); + if (waitpid(pid, NULL, 0) < 0) + die("waitpid"); + exit(0); + } + + return 0; +} diff --git a/java-development/Occurences.java b/java-development/Occurences.java @@ -0,0 +1,22 @@ +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class Occurences { + public static void main(String[] args) { + ArrayList<String> strs = new ArrayList<String>(); + HashMap<String, Integer> occ = new HashMap<String, Integer>(); + + strs.add("foo"); + strs.add("foo"); + strs.add("foo"); + strs.add("bar"); + strs.add("baz"); + strs.add("baz"); + + for (String s : strs) + occ.put(s, 1 + (occ.containsKey(s) ? occ.get(s) : 0)); + for (Map.Entry<String, Integer> e : occ.entrySet()) + System.out.println(e.getKey() + ": " + e.getValue()); + } +} diff --git a/java-development/RecursiveRev.java b/java-development/RecursiveRev.java @@ -0,0 +1,14 @@ +public class RecursiveRev { + public static String strrev(String s) { + if (s.isEmpty()) + return s; + else + return strrev(s.substring(1)) + s.charAt(0); + } + + public static void main(String[] args) { + String s = "Hello world"; + + System.out.println(strrev(s)); + } +} diff --git a/java-development/lol/Main.java b/java-development/lol/Main.java @@ -0,0 +1,12 @@ +public class Main { + public static void main(String[] args) { + Point pt = new Point(50.55, 23.11); + Pixel px = new Pixel(pt, 0xffaaee); + Rectangle rect = new Rectangle(); + + System.out.println(pt.toString()); + System.out.println(px.toString()); + rect.print(); + rect.info(); + } +} diff --git a/java-development/lol/Pixel.java b/java-development/lol/Pixel.java @@ -0,0 +1,27 @@ +class Pixel extends Point { + int color; + static int n = 0; + + Pixel() { + super(0.0, 0.0f); + this.color = 0x000000; + n++; + } + + Pixel(double x, double y, int color) { + super(x, y); + this.color = color; + n++; + } + + Pixel(Point p, int color) { + super(p); + this.color = color; + n++; + } + + public String toString() { + return "x: " + x + "\ty: " + y + "\tcolor: " + + String.format("0x%06X", color); + } +} diff --git a/java-development/lol/Point.java b/java-development/lol/Point.java @@ -0,0 +1,23 @@ +class Point { + double x; + double y; + + Point() { + this.x = 0.0; + this.y = 0.0; + } + + Point(double x, double y) { + this.x = x; + this.y = y; + } + + Point(Point p) { + this.x = p.x; + this.y = p.y; + } + + public String toString() { + return "(" + x + ", " + y + ")"; + } +} diff --git a/java-development/lol/Rectangle.java b/java-development/lol/Rectangle.java @@ -0,0 +1,37 @@ +class Rectangle { + private Point pts[]; + + Rectangle() { + pts = new Point[4]; + for (int i = 0; i < pts.length; i++) + pts[i] = new Point(0.0, 0.0); + } + + Rectangle(Point[] p) { + pts = p; + } + + public Point[] getpoints() { + return pts; + } + + public double width() { + return Math.abs(pts[1].x - pts[0].x); + } + + public double height() { + return Math.abs(pts[2].y - pts[1].y); + } + + public void info() { + System.out.println("Top: " + pts[0]); + System.out.println("Width: " + width()); + System.out.println("Height: " + height()); + } + + public void print() { + for (Point p : pts) + System.out.print(p.toString() + " "); + System.out.println(); + } +} diff --git a/octave-signals-systems/ex1/doc.pdf b/octave-signals-systems/ex1/doc.pdf Binary files differ. diff --git a/octave-signals-systems/ex1/doc.tex b/octave-signals-systems/ex1/doc.tex @@ -0,0 +1,618 @@ +\documentclass{article} +\usepackage[utf8]{inputenc} +\usepackage[greek,english]{babel} +\usepackage{alphabeta} +\usepackage{fancyhdr} +\usepackage{listings} +\usepackage{mathtools} +\usepackage{graphicx} +\usepackage{blindtext} +\usepackage{xcolor} +\usepackage{float} +\usepackage[backend=biber]{biblatex} + +\title{Σήματα και Συστήματα - Εργασία 1} +\author{Χρήστος Μαργιώλης - 19390133} +\date{Μάρτιος 2021} + +% uniwa logo + +\begin{document} + +\begin{titlepage} + \maketitle +\end{titlepage} + +\renewcommand{\contentsname}{Περιεχόμενα} +\tableofcontents + +\section{'Ασκηση 1} + +\begin{itemize} + \item Δημιουργήστε ένα διάνυσμα $a = [0,0.1,0.2,...,10]$ και ένα διάνυσμα + $b = [\cos(0),\cos(0.2),\cos(0.4),...,\cos(20)]$ + \item Να βρεθούν τα: + \begin{itemize} + \item $c = a / b$ + \item $d = a^4$ + \item το εσωτερικό γινόμενο των $a$ και $b$. + \end{itemize} +\end{itemize} + +Για να δημιουργήσουμε ένα διάνυσμα, τού δίνουμε ένα όνομα και στην συνέχεια μέσα +σε [] ορίζουμε τα στοιχεία χωρισμένα είτε με κόμμα είτε με κενά. Το διάνυσμα +που ζητείται από την εκφώνηση έχει την μορφή $0,0.1,0.2...,10$ το οποίο σημαίνει +ότι είναι ένα διάνυσμα με αριθμούς από το 1 έως το 10 με διάστηματα 0.1. Για να +αναπαραστήσουμε κάτι τέτοιο αυτόματα χωρίς να γράψουμε όλους τους αριθμούς μηχανικά, +δηλώνουμε το διάνυσμα ως εξής: αρχή:διάστημα:τέλος. Οπότε: + +\begin{lstlisting}[language=octave] + octave:1> a = 0:0.1:10 +\end{lstlisting} + +Αντίστοιχα για το διάνυσμα $b$, βλέπουμε ότι τα διαστήματα είναι $0.2$ +και σε κάθε αριθμό του διανύσματος υπολογίζεται το συνημίτονο. Θα ορίσουμε +ένα διάνυσμα από το 0 έως το 20 με διαστήματα $0.2$ και θα υπολογίσουμε +τα συνημίτονα όλων των στοιχείων χρησιμοποιώντας την συνάρτηση \lstinline{cos()}: + +\begin{lstlisting}[language=octave] + octave:2> b = cos(0:0.2:20) +\end{lstlisting} + +Για την διαίρεση διανυσμάτων χρησιμοποιούμε το σύμβολο / που χρησιμοποιείται +γενικότερα για διαίρεση, οπότε το $c = a / b$ θα γίνει: + +\begin{lstlisting}[language=octave] + octave:3> c = a / b + c = 0.89415 +\end{lstlisting} + +Προκειμένου να υψώσουμε σε δύναμη όλα τα στοιχεία ενός διανύσματος πρέπει να +χρησιμοποιήσουμε τον τελεστή \lstinline{.^}, οπότε η πράξη $d = a^4$ θα γραφτεί +ως \lstinline{d = a.^4}. Αυτό το statement θα υπολογίσει ουσιαστικά την σειρά +\[d = [a_1^4, a_2^4, a_3^4, ..., a_n^4]\] +Η στοίχηση της εξόδου από το Octave έχει τροποποιηθεί +επειδή είναι πολύ μεγάλη και δεν χωράει σωστά στην σελίδα: + +\begin{lstlisting}[language=octave] + octave:4> d = a.^4 +\end{lstlisting} +\begin{lstlisting}[language=octave,basicstyle=\tiny] + d = + + Columns 1 through 17: + +0.00000 0.00010 0.00160 0.00810 0.02560 0.06250 0.12960 0.24010 +0.40960 0.65610 1.00000 1.46410 2.07360 2.85610 3.84160 5.06250 6.55360 + + Columns 18 through 34: + +8.35210 10.49760 13.03210 16.00000 19.44810 23.42560 27.98410 33.17760 +39.06250 45.69760 53.14410 61.46560 70.72810 81.00000 92.35210 104.85760 118.59210 + + Columns 35 through 51: + +133.63360 150.06250 167.96160 187.41610 208.51360 231.34410 256.00000 +282.57610 311.16960 341.88010 374.80960 410.06250 447.74560 487.96810 +530.84160 576.48010 625.00000 + + Columns 52 through 68: + +676.52010 731.16160 789.04810 850.30560 915.06250 983.44960 1055.60010 +1131.64960 1211.73610 1296.00000 1384.58410 1477.63360 1575.29610 1677.72160 +1785.06250 1897.47360 2015.11210 + + Columns 69 through 85: + +2138.13760 2266.71210 2401.00000 2541.16810 2687.38560 2839.82410 +2998.65760 3164.06250 3336.21760 3515.30410 3701.50560 3895.00810 +4096.00000 4304.67210 4521.21760 4745.83210 4978.71360 + + Columns 86 through 101: + +5220.06250 5470.08160 5728.97610 5996.95360 6274.22410 6561.00000 +6857.49610 7163.92960 7480.52010 7807.48960 8145.06250 8493.46560 +8852.92810 9223.68160 9605.96010 10000.00000 +\end{lstlisting} + +Για να υπολογίσουμε το εσωτερικό γινόμενο του $a$ και $b$, θα χρησιμοποιήσουμε +την συνάρτηση \lstinline{dot()} (Dot Product). Η συνάρτηση αυτή όταν εφαρμοστεί +στα διανύσματα $a$ και $b$, θα υπολογίσει την παρακάτω παράσταση: + +\[x = a_1 \cdot b_1 + a_2 \cdot b_2 + a_3 \cdot b_3 + ... + a_n \cdot b_n\] + +Οπότε: + +\begin{lstlisting}[language=octave] + octave:5> dot(a, b) + ans = 46.051 +\end{lstlisting} + +\section{'Ασκηση 2} + +\begin{itemize} + \item Να γραφεί συνάρτηση (function) η οποία θα παίρνει ως όρισμα + έναν αριθμό σε ακτίνια (rad) και θα επιστρέφει την τιμή του + σε μοίρες. + \item Βρείτε πόσες μοίρες είναι τα $\pi/4$ rad. +\end{itemize} + +Για να δηλώσουμε μία συνάρτηση χρησιμοποιούμε την εντολή \lstinline{function} +ακολουθώμενη από από το όνομα της συνάρτησης. Εάν θέλουμε η συνάρτηση να δέχεται +ορίσματα, τα δηλώνουμε σε παρένθεση μετά το όνομα της συνάρτησης. Στην περίπτωση +που θέλουμε να επιστρέφεται και κάποια τιμή, δηλώνουμε το όνομά της μεταβλητής +που επιστρέφεται πριν το όνομα της συνάρτησης. Τέλος, για να σημάνουμε το τέλος +της συνάρτησης, γράφουμε την εντολή \lstinline{endfunction} + +Για την συνάρτηση μετατροπής ακτινίων σε μοίρες θα χρειαστεί να υλοποιήσουμε +τον τύπο: +\[deg = rad \cdot 180 / \pi\] +Οπότε βάσει τα παραπάνω, η συνάρτηση θα υλοποιηθεί ως εξής: + +\begin{lstlisting}[language=octave] + function ret = deg(rad) + ret = rad * 180 / pi + endfunction +\end{lstlisting} + +Τώρα μπορούμε να καλέσουμε την συνάρτηση δίνοντας της μία τιμή σε ακτίνια. +Τα $\pi / 4$ ακτίνια σε μοίρες είναι: + +\begin{lstlisting}[language=octave] + octave:6> x = deg(pi / 4) + x = 45 +\end{lstlisting} + +\section{'Ασκηση 3} + +\begin{itemize} + \item Να γραφεί συνάρτηση (function) που να σχεδιάζει τη + συνάρτηση: \[\sin c(x) = \frac{\sin(\pi x)}{\pi x}\] + \item Σχεδιάστε τη για το διάστημα $[-2\pi,2\pi]$. +\end{itemize} + +Για να σχεδιάσουμε την συνάρτηση +\[\sin c(x) = \frac{\sin(\pi x)}{\pi x}, -2\pi < x < 2\pi\] +πρέπει να ακολουθήσουμε τα εξής βήματα στο Octave: + +\begin{itemize} + \item Να ορίσουμε το διάστημα $[-2\pi, 2\pi]$ + \item Να υπολογίσουμε το $c(x)$ για κάθε $x$ + \item Να υπολογίσουμε το $\sin c(x)$ +\end{itemize} + +Αρχικά, θα δηλώσουμε το διάστημα $[-2\pi,2\pi]$ με αποστάσεις 0.1 +από τον κάθε αριθμό ώστε να έχουμε μία πιο ακριβή γραφική παράσταση. +Το διάνυσμα που θα προκύψει το αποθηκεύουμε στην μεταβλητή $x$: + +\begin{lstlisting}[language=octave] + octave:7> x = -2*pi:0.1:2*pi +\end{lstlisting} + +'Επειτα υπολογίζουμε την συνάρτηση +\[c(x) = \frac{\sin(\pi x)}{\pi x}\] +Είναι σημαντικό να σημειωθεί ότι +πρέπει να χρησιμοποιηθεί ο τελεστής ./ ώστε να επιστραφεί διάνυσμα +και όχι ένας αριθμός: + +\begin{lstlisting}[language=octave] + octave:8> c = sin(x * pi) ./ (pi * x) +\end{lstlisting} + +Θα υπολογίσουμε το ημίτονο της συνάρτησης $c(x)$ κατευθείαν στην κλήση +της συνάρτησης σχεδίασης - η συναρτήση αυτή είναι η \lstinline{plot()} και παίρνει +ως ορίσματα τις τιμές του άξονα $x$ και $y$ (\lstinline{plot(x, y)}). Στην +προκειμένη περίπτωση θα της δώσουμε ως $x$ το $x$ που υπολογίσαμε στην αρχή, +και ως $y$ το συνημίτονο της συνάρτησης $c(x)$: + +\begin{lstlisting}[language=octave] + octave:9> plot(x, sin(c)) +\end{lstlisting} + +Παρατηρούμε ότι η γραφική παράσταση που προκύπτει έχει ένα \textit{ενδιαφέρον} +σχήμα: + +\begin{figure}[H] + \centering + \includegraphics[width=\linewidth]{res/fig1.jpg} + \caption{$\sin c(x) = \frac{\sin(\pi x)}{\pi x}, -2\pi < x < 2\pi$} +\end{figure} + +\section{'Ασκηση 4} + +\begin{itemize} + \item Να γραφεί συνάρτηση (function) η οποία θα παίρνει ως όρισμα + έναν μιγαδικό αριθμό και θα επιστρέφει: + \begin{itemize} + \item Την φάση. + \item Το μέτρο. + \item Το πραγματικό μέρος. + \item Το φανταστικό μέρος του μιγαδικού. + \end{itemize} + \item Υπολογίστε τα παραπάνω μεγέθη για τους εξής μιγαδικούς: + \begin{itemize} + \item $i$ + \item $-i$ + \item $1$ + \item $e^{3+4i}$ + \end{itemize} +\end{itemize} + +Το Octave (και το Matlab) διαθέτουν συναρτήσεις χειρισμού μιγαδικών αριθμών. + +Για τον υπολογισμό της φάσης ενός μιγαδικού αριθμού χρησιμοποιούμε την συνάρτηση +\lstinline{angle()}. Η συνάρτηση αυτή όταν της δωθεί μιγαδικός αριθμός θα +υπολογίσει τον παρακάτω τύπο: +\[\theta = atan(y, x)\] + +Ο υπολογισμός του μέτρου ενός μιγαδικού αριθμό γίνεται μέσω της συνάρτησης +\lstinline{abs()} η οποία εφαρμόζει τον παρακάτω τύπο: +\[|z| = \sqrt{x^2 + y^2}\] + +Οι συναρτήσεις \lstinline{real()} και \lstinline{imag()} επιστρέφουν το πραγματικό +και φανταστικό αντίστοιχα μέρος ενός μιγαδικού αριθμού. + +Οπότε με την χρήση όλων των παραπάνω συναρτήσεων μπορούμε να υλοποιήσουμε μία +συνάρτηση η οποία υπολογίζει και επιστρέφει κατευθείαν τις τέσσερεις αυτές +τιμές (φάση, μέτρο, πραγματικό μέρος, φανταστικό μέρος): + +\begin{lstlisting}[language=octave] + function imaginary(num) + phase = angle(num) + magnitude = abs(num) + realpart = real(num) + imagpart = imag(num) + endfunction +\end{lstlisting} + +Τώρα μπορούμε να δώσουμε στην συνάρτηση οποιοδήποτε μιγαδικό αριθμό για +επαληθεύσουμε ότι λειτουργεί σωστά. + +Για $i$: +\begin{lstlisting}[language=octave] + octave:10> imaginary(i) + phase = 1.5708 + magnitude = 1 + realpart = 0 + imagpart = 1 +\end{lstlisting} + +Για $-i$: +\begin{lstlisting}[language=octave] + octave:11> imaginary(-i) + phase = -1.5708 + magnitude = 1 + realpart = -0 + imagpart = -1 +\end{lstlisting} + +Για $1$: +\begin{lstlisting}[language=octave] + octave:12> imaginary(1) + phase = 0 + magnitude = 1 + realpart = 1 + imagpart = 0 +\end{lstlisting} + +Για $e^{3 + 4i}$: +\begin{lstlisting}[language=octave] + octave:13> imaginary(e^(3 + 4*i)) + phase = -2.2832 + magnitude = 20.086 + realpart = -13.129 + imagpart = -15.201 +\end{lstlisting} + +\section{'Ασκηση 5} + +\begin{itemize} + \item Διαχωρίστε το διάστημα $[0, 2\pi]$ σε 500 σημεία. + \item Να σχεδιάσετε σε αυτό το διάστημα (στο ίδιο figure) + τα παρακάτω σήματα: + \begin{itemize} + \item $f(x) = xe^{-x}, 0 < x < 2\pi$ + \item $y(x) = 2^{cos(x)}, 0 < x < 2\pi$ + \end{itemize} + \item Βάλτε τίτλο στην γραφική παράσταση (ό,τι θέλετε). + \item Βάλτε ταμπέλες στον $x$ και $y$ άξονα (ό,τι θέλετε). + \item Βάλτε μία επιγραφή για όλες τις καμπύλες με την εντολή + \lstinline{legend}. + \item Να σχεδιάσετε τα δύο παραπάνω σήματα σε ένα δεύτερο figure + αλλά σε \textbf{2 διαφορετικά} παράθυρα. +\end{itemize} + +Για να χωρίσουμε το διάστημα $[0,2\pi]$, απλώς θα διαιρέσουμε το $2\pi$ με +500 ώστε να μας δώσει τις αποστάσεις ανάμεσα στους αριθμούς του διαστήματος. +Το διάνυσμα που θα φτιάξουμε εννοείται ότι θα το χρησιμοποιήσουμε ως $x$. + +\begin{lstlisting}[language=octave] + octave:14> 2 * pi / 500 + ans = 0.012566 +\end{lstlisting} + +Με αυτό το 0.012566 θα φτιάξουμε το διάνυσμα $x$: + +\begin{lstlisting}[language=octave] + octave:15> 0:0.012566:2*pi +\end{lstlisting} + +Τώρα μπορούμε να υπολογίσουμε τα $f(x)$ και $y(x)$. Με παρόμοια λογική όπως +και στην προηγούμενη άσκηση, πρέπει να χρησιμοποιηθεί ο τελεστής \lstinline{.^} +και \lstinline{.*} ώστε να πάρουμε διάνυσμα και όχι αριθμό: + +\begin{lstlisting}[language=octave] + octave:16> f = x.*e.^-x + octave:17> y = 2.^cos(x) +\end{lstlisting} + +Σχεδιάζουμε την γραφική παράσταση της $f(x)$: + +\begin{lstlisting}[language=octave] + octave:18> plot(x, f) +\end{lstlisting} + +Τώρα προκειμένου να σχεδιάσουμε και την γραφική παράσταση της $y(x)$ στο ίδιο +figure πρέπει να δώσουμε στο Octave την εντολή \lstinline{hold on} ώστε να μην +δημιουργήσει νέο παράθυρο για την $y(x)$. Στην συνέχεια σχεδιάζουμε και την $y(x)$: + +\begin{lstlisting}[language=octave] + octave:19> hold on + octave:20> plot(x, y) +\end{lstlisting} + +Σε αυτό το σημείο έχουνε σχεδιαστεί και οι δύο γραφικές παραστάσεις στο ίδιο figure. + +\begin{figure}[H] + \centering + \includegraphics[width=\linewidth]{res/fig2.jpg} + \caption{Μμπλε: $f(x) = xe^{-x}$, Πορτοκαλί: $y(x) = xe^{-x}$} +\end{figure} + +Για να δώσουμε τίτλο στην γραφική παράσταση, χρησιμοποιούμε την συνάρτηση +\lstinline{title()} και σαν όρισμα της δίνουμε ένα string με τον τίτλο που θέλουμε. + +\begin{lstlisting}[language=octave] + octave:21> title("f(x) and y(x)") +\end{lstlisting} + +Για τις ταμπέλες (labels) χρησιμοποιούμε τις συναρτήσεις \lstinline{xlabel()} +και \lstinline{ylabel()} για τους άξονες $x$ και $y$ αντίστοιχα. Σαν όρισμα δέχονται +ένα string με τις ταμπέλες που θέλουμε: + +\begin{lstlisting}[language=octave] + octave:22> xlabel("x") + octave:23> ylabel("y") +\end{lstlisting} + +Για να δώσουμε μία επιγραφή καλούμε την συνάρτηση \lstinline{legend()}. +Εφόσον θέλουμε το legend να περιέχει επιγραφή και για τις δύο συνάρτησεις +που σχεδιάσαμε, θα δώσουμε ως όρισμα στην \lstinline{legend()} τις επιγραφές +κλεισμένες σε αγκύλες και χωρισμένες με κόμμα: + +\begin{lstlisting}[language=octave] + octave:24> legend({"f(x)", "y(x)"}) +\end{lstlisting} + +\begin{figure}[H] + \centering + \includegraphics[width=\linewidth]{res/fig3.jpg} + \caption{$f(x)$ και $y(x)$ με επιγραφές και τίτλο} +\end{figure} + +Για να σχεδιάσουμε σε ξεχωριστά παράθυρα τις συναρτήσεις $f(x)$ και $y(x)$ +θα ακολουθήσουμε την ίδια διακασία με πριν, αλλά χωρίς την εντολή +\lstinline{hold on}. Δηλαδή απλώς θα καλέσουμε δύο φορές την +\lstinline{plot()} - μία με όρισμα την $f(x)$ και μία με την $y(x)$. + +\begin{lstlisting}[language=octave] + octave:25> plot(x, f) +\end{lstlisting} + +\begin{figure}[H] + \centering + \includegraphics[width=\linewidth]{res/fig4.jpg} + \caption{$f(x)$} +\end{figure} + +\begin{lstlisting}[language=octave] + octave:26> plot(x, y) +\end{lstlisting} + +\begin{figure}[H] + \centering + \includegraphics[width=\linewidth]{res/fig5.jpg} + \caption{$f(x)$} +\end{figure} + +\section{'Ασκηση 6} + +\begin{itemize} + \item Υπολογίστε τις μερικές παραγώγους της συνάρτησης: + \[f(x, t) = \cos x + \sin t + e^t\] + \item Υπολογίστε το ολοκλήρωμα: + \[\int_{0}^{\infty} te^tdt\] + \item Υπολογίστε το διπλό αόριστο ολοκλήρωμα: + \[\iint x^3e^tdxdt\] + \item Υπολογίστε το άθροισμα: + \[\sum_{k = 0}^{\infty} \frac{x^k}{k!}\] + \item Μετατρέψτε σε ρητή την παράσταση: + \[f(x) = \frac{3}{x+2} + \frac{x}{x^2+1}\] + \item Να λυθεί η εξίσωση δευτέρου βαθμού: + \[f(x) = x^3 + 2x^2 - x - 2\] +\end{itemize} + +Πρώτα από όλα, για την χρήση συναρτήσεων υπολογισμού παραγώγων και ολοκληρωμάτων, +χρειαζόμαστε το \lstinline{symbolic} πακέτο του Octave - κάτι αντίστοιχο υπάρχει +και στο Matlab. Αφού το εγκατασήσουμε, το φορτώνουμε στο Octave ως εξής: + +\begin{lstlisting}[language=octave] + octave:27> pkg load symbolic +\end{lstlisting} + +\begin{itemize} +\item +Προκειμένου να υπολογίσουμε την μερική παράγωγο της συνάρτησης +\[f(x, t) = \cos x + \sin t + e^t\] +πρέπει να ορίσουμε της συμβολικές μεταβλητές $x$ και $t$: +\begin{lstlisting}[language=octave] + octave:28> syms x t +\end{lstlisting} + +Στην συνέχεια ορίζουμε την συνάρτηση $f(x, t)$: +\begin{lstlisting}[language=octave] + octave:29> y = cos(x) + sin(t) + e^t + y = (sym) +\end{lstlisting} + +Τέλος, υπολογίζουμε την μερική παράγωγο: + +\[\frac{\partial}{\partial x}f(x, t) \Rightarrow +\frac{\partial}{\partial x}(\cos x + \sin t + e^t) \] + +Για τον υπολογισμό της παραγώγου χρησιμοποιούμε την συνάρτηση +\lstinline{diff()}: +\begin{lstlisting}[language=octave] + octave:30> diff(y, x) + ans = (sym) -sin(x) +\end{lstlisting} + +Μπορούμε να επαληθεύσουμε ότι το αποτέλεσμα είναι σωστό εφόσον: +\[\frac{\partial}{\partial x}(\cos x + \sin t + e^t) \Rightarrow +\frac{\partial}{\partial x} \cos x + +\frac{\partial}{\partial x} \sin t + +\frac{\partial}{\partial x} e^t \Rightarrow +-\sin x + 0 + 0 \Rightarrow -\sin x\] + +\item +Για να υπολογίσουμε το ολοκλήρωμα +\[\int_{0}^{\infty} te^{-t}dt\] +αρχικά ορίζουμε την συνάρτηση που θέλουμε να ολοκληρώσουμε. Στο πρώτο +μέρος (\lstinline{@(t)}) ορίζουμε την μεταβλητή ως προς την οποία +θέλουμε να ολοκληρώσουμε: +\begin{lstlisting}[language=octave] + octave:31> f = @(t) t *. e .^(-t) +\end{lstlisting} +Μετά με την χρήση της συνάρτησης \lstinline{integral()} υπολογίζουμε το +ολοκλήρωμα. Η συνάρτηση αυτή παίρνει τρία ορίσματα: την συνάρτηση, το πάνω +και το κάτω όριο. Οπότε: +\begin{lstlisting}[language=octave] + octave:32> integral(f, 0, Inf) + ans = 1 +\end{lstlisting} + +\item +Δεν υλοποιήθηκε λόγο απώλειας χρόνου. + +\item +Δεν υλοποιήθηκε λόγο απώλειας χρόνου. + +\item +Δεν υλοποιήθηκε λόγο απώλειας χρόνου. + +\item +Για να λύσουμε την τριτοβάθμια εξίσωση: +\[f(x) = x^3 + 2x^2 - x - 2\] +oρίζουμε αρχικά την συμβολική μεταβλητή $x$ και την συνάρτηση $f(x)$: +\begin{lstlisting}[language=octave] + octave:33> syms x + octave:34> f = x^3 + 2*x^2 - x - 2 +\end{lstlisting} +Βρίσκουμε τις ρίζες της παραπάνω τριτοβάθμιας εξίσωσης με την χρήση της +συνάρτησης \lstinline{solve()}: +\begin{lstlisting}[language=octave] + octave:35> solve(f) + ans = [-2 -1 1] +\end{lstlisting} + +\end{itemize} + +\section{'Ασκηση 7} + +\begin{itemize} + \item Να γραφεί function για τον υπολογισμό των ριζών ενός τριωνύμου. +\end{itemize} + +Προκειμένου να υπολογίσουμε τις ρίζες ενός τριωνύμου χρειάζεται να χρησιμοποιήσουμε +λογικούς τελεστές και \lstinline{if} statements. Ο λόγος που χρειάζονται είναι +διότι υπάρχουνε ορισμένες περιπτώσεις που οι ρίζες του τριωνύμου δεν μπορούνε να +υπολογιστούν, και όταν μπορούν, μπορεί να έχουμε είτε μία είτε δύο ρίζες, οπότε +πρέπει να καλύψουμε όλες τις περιπτώσεις αυτές. + +Ο τρόπος που δουλεύουνε τα \lstinline{if} statements στο Octave είναι ο ίδιος με +τις περισσότερες γλώσσες προγραμματισμού, δηλαδή: +\begin{lstlisting}[language=octave] + if (condition) + code + elseif (condition) + code + else + code + endif +\end{lstlisting} + +Αρχικά η συνάρτηση δέχεται τρία ορίσματα, τα $a$, $b$, και $c$ εφόσον το τριώνυμο +έχει την μορφή: +\[ax^2 + bx + c = 0\] + +'Επειτα πρέπει να σιγουρέψουμε ότι το $a$ \textit{δεν} είναι 0, διότι σε αυτή την +περίπτωση δεν έχουμε δευτεροβάθμια εξίσωση. + +Στην συνέχεια υπολογίζουμε την διακρίνουσα χρησιμοποιώντας τον κλασσικό τύπο: +\[d = b^2 - 4ac\] +και ελέγχουμε τις τιμές της. + +Αν η διακρίνουσα είναι μεγαλύτερη του 0, τότε οι ρίζες είναι: +\[x_1, x_2 = \frac{-b \pm \sqrt d}{2a}\] + +Αν η διακρίνουσα είναι ίση με 0, τότε έχουμε μία ρίζα: +\[x = \frac{-b}{2a}\] + +Αν η διακρίνουσα είναι μικρότερη του 0 δεν έχουμε ρίζες. + +Οπότε ο τελικός κώδικας που θα προκύψει είναι ο παρακάτω: + +\begin{lstlisting}[language=octave] + function quadratic(a, b, c) + if (a != 0) + d = b^2 - 4*a*c + if (d > 0) + x1 = (-b + sqrt(d)) / (2 * a) + x2 = (-b - sqrt(d)) / (2 * a) + elseif (d == 0) + x = -b / (2 * a) + else + printf("no solutions\n") + endif + else + printf("a cannot be 0\n") + endif + endfunction +\end{lstlisting} + +Είναι καλύτερο να γράψουμε ένα αρχείο \lstinline{.m} που να +περιέχει τον παραπάνω κώδικα και να το τρέξουμε μέσα από +το Octave με την εντολή \lstinline{run()}. Αφού διαβαστεί το +αρχείο μπορούμε να καλέσουμε την συνάρτηση κανονικά, για +παράδειγμα: + +\begin{lstlisting}[language=octave] + octave:28> quadratic(2, 2, -4) + d = 36 + x1 = 1 + x2 = -2 +\end{lstlisting} + +\pagebreak +\section{Εργαλεία} +Τα εργαλεία που χρησιμοποιήθηκαν για την υλοποίηση αυτής της εργασίας ήτανε +τα εξής: + +\begin{itemize} + \item Περιβάλλον: GNU Octave 5.2.0 + \item Επιπλέον πακέτα: \lstinline{octave-forge-symbolic} + \item Λειτουργικό σύστημα: FreeBSD 12.2 + \item Κειμενογράφος: Vim + \item Μορφοποίηση κειμένου: \LaTeX +\end{itemize} +\end{document} diff --git a/octave-signals-systems/ex1/res/fig1.jpg b/octave-signals-systems/ex1/res/fig1.jpg Binary files differ. diff --git a/octave-signals-systems/ex1/res/fig2.jpg b/octave-signals-systems/ex1/res/fig2.jpg Binary files differ. diff --git a/octave-signals-systems/ex1/res/fig3.jpg b/octave-signals-systems/ex1/res/fig3.jpg Binary files differ. diff --git a/octave-signals-systems/ex1/res/fig4.jpg b/octave-signals-systems/ex1/res/fig4.jpg Binary files differ. diff --git a/octave-signals-systems/ex1/res/fig5.jpg b/octave-signals-systems/ex1/res/fig5.jpg Binary files differ. diff --git a/octave-signals-systems/ex2/doc.pdf b/octave-signals-systems/ex2/doc.pdf Binary files differ. diff --git a/octave-signals-systems/ex2/doc.tex b/octave-signals-systems/ex2/doc.tex @@ -0,0 +1,310 @@ +\documentclass{article} +\usepackage[utf8]{inputenc} +\usepackage[greek,english]{babel} \usepackage{alphabeta} +\usepackage{fancyhdr} +\usepackage{listings} +\usepackage{mathtools} +\usepackage{xcolor} +\usepackage{graphicx} +\usepackage{float} +\usepackage[backend=biber]{biblatex} + +\title{Σήματα και Συστήματα - Εργασία 2} +\author{Χρήστος Μαργιώλης - 19390133} +\date{Απρίλιος 2021} + +\begin{document} + +\begin{titlepage} + \maketitle + \begin{figure}[t!] + \begin{center} + \includegraphics[scale=0.3]{./res/uniwalogo.png} \\ + \Large + \textbf{Πανεπιστήμιο Δυτικής Αττικής} \\ + \large + Τμήμα Μηχανικών Πληροφορικής και Ηλεκτρονικών Υπολογιστών + \end{center} + \end{figure} +\end{titlepage} + +\renewcommand{\contentsname}{Περιεχόμενα} +\tableofcontents + +\section{'Ασκηση 1} + +\begin{itemize} + \item Να σχεδιαστεί το σήμα + \[x(t) = u(t + 1) - u(t - 2) + u(t + 4)\] +\end{itemize} + +Αρχικά ορίζουμε ένα χρονικό διάστημα $t$ - θα το ορίσουμε από το -5 εώς το 10: +\begin{lstlisting}[language=octave] + octave> t = -5:0.1:10 +\end{lstlisting} + +Με τη χρήση της συνάρτησης \lstinline{heaviside()} θα υπολογίσουμε τις +τιμές των συναρτήσεων $u(t + 1)$, $u(t - 2)$ και $u(t + 4)$. Μπορούμε +για κάθε συνάρτηση να αποθηκεύσουμε την έξοδό της \lstinline{heaviside()} +σε μία προσωρινή μεταβλητή, αλλά για μεγαλύτερη άνεση και εξοικονόμιση +χρόνου θα αποθηκεύσουμε τα πάντα κατευθείαν στο $x$: +\begin{lstlisting}[language=octave] + octave> x = heaviside(t+1)-heaviside(t-2)+heaviside(t+4) +\end{lstlisting} + +Τέλος, σχεδιάζουμε το σήμα $x(t)$ και τροποποιούμε τον άξονα $x$ +για καλύτερη εμφάνιση της γραφικής παράστασης: +\begin{lstlisting}[language=octave] + octave> plot(t, x) + octave> xlim([-5 10]) +\end{lstlisting} + +\begin{figure}[H] + \centering + \includegraphics[width=\linewidth]{res/fig2.png} + \caption{$x(t) = u(t + 1) - u(t - 2) + u(t + 4)$ με τη χρήση της + \lstinline{heaviside()}} +\end{figure} + +\section{'Ασκηση 2} + +\begin{itemize} + \item Να σχεδιαστεί το σήμα + \[x(t) = t\sin(2\pi t)(u(t) - u(t - 3))\] +\end{itemize} + +Αρχικά ορίζουμε το διάστημα το χρονικό διάστημα $t$ από από το -5 ως το 10: +\begin{lstlisting}[language=octave] + octave> t = -5:0.1:10 +\end{lstlisting} + +Για να υπολογίσουμε τις τιμές των μοναδιαίων βηματικών συναρτήσεων $u(t)$ +και $u(t - 3)$ θα χρησιμοποιήσουμε κατευθείαν την συνάρτηση +\lstinline{heaviside()}: +\begin{lstlisting}[language=octave] + octave> x = t.*sin(2*pi*t).*(heaviside(t)-heaviside(t-3)) +\end{lstlisting} + +Τέλος, σχεδιάζουμε το σήμα $x(t)$ και τροποποιούμε τον άξονα $x$ +για καλύτερη εμφάνιση της γραφικής παράστασης: +\begin{lstlisting}[language=octave] + octave> plot(t, x) + octave> xlim([-5 10]) +\end{lstlisting} + +\begin{figure}[H] + \centering + \includegraphics[width=\linewidth]{res/fig3.png} + \caption{$x(t) = t\sin(2\pi t)(u(t) - u(t - 3))$} +\end{figure} + +\section{'Ασκηση 3} + +\begin{itemize} + \item Να σχεδιαστεί το σήμα + \[x(t) = t^3 \cos(10\pi t)p 2(t - 1)\] + όπου $pT(t)$ τετραγωνικός παλμός διάρκειας $T$. +\end{itemize} + +Ο τετραγωνικός παλμός $pT(t)$ ορίζεται ως +\[pT(t) = u(t + \frac{T}{2}) - u(t - \frac{T}{2})\] +Οπότε, με βάση την εκφώνηση και τον παραπάνω τύπο έχουμε ότι: +\[p2(t - 1) \Rightarrow u(t - 1 + \frac{2}{2}) - u(t - 1 - \frac{2}{2}) +\Rightarrow u(t - 1 + 1) - u(t - 1 - 1) \Rightarrow u(t) - u(t - 2)\] + +Τώρα, με την χρήση της συνάρτησης \lstinline{heaviside()} μπορούμε να +υπολογίσουμε τις τιμές του τετραγωνικού παλμού $p2(t - 1)$: +\begin{lstlisting}[language=octave] + octave> p = heaviside(t)-heaviside(t-2) +\end{lstlisting} + +'Εχοντας το $p2(t - 1)$ μπορούμε τώρα να υπολογίσουμε και να σχεδιάσουμε +το σήμα $x(t)$. Επίσης θα τροποποιήσουμε τον άξονα $x$ ώστε να εμφανιστεί +πιο καθαρά η γραφική παράσταση: +\begin{lstlisting}[language=octave] + octave> x = t.^3.*cos(10*pi*t).*p + octave> plot(t, x) + octave> xlim([-5 10]) +\end{lstlisting} + +\begin{figure}[H] + \centering + \includegraphics[width=\linewidth]{res/fig4.png} + \caption{$x(t) = t^3cos(10\pi t)p2(t - 1)$} +\end{figure} + +\section{'Ασκηση 4} + +\begin{itemize} + \item Να εκφταστεί και να σχεδιαστεί το σήμα (φυλλάδιο εργασίας + σελίδα 28) ως άθροισμα μόνο συναρτήσεων ράμπας. +\end{itemize} + +Η συνάρτηση ράμπας ορίζεται ως: +\[r(t) = tu(t)\] +Στο Octave, αυτό υπολογίζεται ως: +\begin{lstlisting}[language=octave] + octave> r = t.*heaviside(t) +\end{lstlisting} +Οπότε θα φτιάξουμε μία συνάρτηση - θα την ονομάσουμε \lstinline{ramp} - +η οποία θα υπολογίζει την συνάρτηση ράμπας. Η συνάρτηση θα δέχεται +ως όρισμα ένα $t$ και θα επιστρέφει τις τιμές της συνάρτησης $r(t)$: +\begin{lstlisting}[language=octave] + function r = ramp(t) + r = t.*heaviside(t) + endfunction +\end{lstlisting} + +Το σήμα που ζητάει η εκφώνηση εκφράζεται ως +\[x(t) = r(t) - r(t-1) - r(t-2)\] +και το χρονικό διάστημα είναι το $t = [-2,3]$. Οπότε: +\begin{lstlisting}[language=octave] + octave> t = -2:0.1:3 + octave> r = ramp(t)-ramp(t-1)-ramp(t-2) + octave> plot(t, r) + octave> ylim([-0.3 1.3]) +\end{lstlisting} + +\begin{figure}[H] + \centering + \includegraphics[width=\linewidth]{res/fig7.png} + \caption{$x(t) = r(t) - r(t-1) - r(t-2)$} +\end{figure} + +\section{'Ασκηση 5} + +\begin{itemize} + \item Δίνεται το σήμα + \[x(t) = te^{-t}, 0 \leq t \leq 5\] + Να σχεδιαστούν: + \begin{itemize} + \item Το σήμα $x(t)$ + \item Το άρτιο σήμα $x_e(t)$ του $x(t)$ + \item Το περιττό σήμα $x_o(t)$ του $x(t)$ + \item Το άθροισμα $x_e(t) + x_o(t)$ + \end{itemize} +\end{itemize} + +Θα σχεδιάσουμε τα τέσσερα ζητούμενα σήματα στο ίδιο παράθυρο με την +χρήση της συνάρτησης \lstinline{subplot()}. + +Αρχικά ορίζουμε το διάστημα $t = [0, 5]$: +\begin{lstlisting}[language=octave] + octave> t = 0:0.1:5 +\end{lstlisting} + +Υπολογίζουμε τις τιμές του σήματος $x(t) = te^{-t}$ και σχεδιάζουμε το σήμα. +Σε όλα τα σήματα που θα σχεδιάσουμε θα τους δώσουμε και επίσης και έναν τίτλο +ώστε να μπορούμε να ξεχωρίσουμε σε ποιο σήμα αντιστοιχεί η κάθε γραφική +παράσταση: +\begin{lstlisting}[language=octave] + octave> x = t.*exp(-t) + octave> sublot(2, 2, 1) + octave> plot(t, x) + octave> title("x(t) = t.*exp(-t)") +\end{lstlisting} + +Το άρτιο μέρος ενός σήματος ορίζεται ως: +\[x_e(t) = \frac{1}{2}(x(t) + x(-t))\] +και το περιττό μέρος ως: +\[x_o(t) = \frac{1}{2}(x(t) - x(t))\] +Για να υπολογίσουμε το $x(-t)$ θα μπορούσαμε να φτιάξουμε μία νέα μεταβλητή +$-t$ η οποία θα κρατάει το διάστημα χρόνου αντιστραμένο - δηλαδή +$-t = [-5, 0]$ - αλλά το Octave παρέχει την συνάρτηση \lstinline{fliplr()} +η οποία μπορεί να αντιστρέψει ένα διάνυσμα. Το αποτέλεσμα της +\lstinline{fliplr()} θα το αποθηκεύσουμε στο διάνυσμα \lstinline{xrev} +ώστε να το χρησιμοποιήσουμε για τον υπολογισμό του αρτίου και περιττού +σήματος: +\begin{lstlisting}[language=octave] + octave> xrev = fliplr(x) + octave> xe = 0.5*(x + xrev) + octave> xo = 0.5*(x - xrev) + octave> subplot(2, 2, 2) + octave> plot(t, xe) + octave> title("x_{even}") + octave> subplot(2, 2, 3) + octave> plot(t, xo) + octave> title("x_{odd}") +\end{lstlisting} + +Για τον υπολογισμό του αθροίσματος, απλώς προσθέτουμε τα σήματα +$x_e(t)$ και $x_o(t)$ που υπολογίσαμε παραπάνω. +\begin{lstlisting}[language=octave] + octave> xeo = xe + xo + octave> subplot(2, 2, 4) + octave> plot(t, xeo) + octave> title("x_{eo}") +\end{lstlisting} + +Παρατηρούμε ότι ισχύει +\[x(t) = x_e + x_o\] +δηλαδή το άθροισμα του αρτίου και του περιττού σήματος είναι ίσο +με το αρχικό σήμα $x(t)$: +\begin{figure}[H] + \centering + \includegraphics[width=\linewidth]{res/fig5.png} + \caption{$x(t)$, $x_e(t)$, $x_o(t)$, $x_e(t) + x_o(t)$} +\end{figure} + +\section{'Ασκηση 6} + +\begin{itemize} + \item 'Εστω το σήμα + \[x(t) = t\cos(2\pi t), 0 \leq t \leq 5\] + Να σχεδιάσετε τα σήματα: + \begin{itemize} + \item $x(t)$ + \item $x(-t)$ + \item $x(t/5)$ + \item $x(1 + 3t)$ + \item $x(-1 - 3t)$ + \end{itemize} +\end{itemize} + +\begin{lstlisting}[language=octave] + octave> t = 0:0.1:5 + octave> x1 = t.*cos(2*pi*t) + octave> x2 = -x1 + octave> x3 = (t/5).*cos(2*pi*(t/5)) + octave> x4 = (1 + 3*t).*cos(2*pi*(1 + 3*t)) + octave> x5 = -x4 + octave> subplot(3, 2, 1) + octave> plot(t, x1) + octave> title("x(t)") + octave> subplot(3, 2, 2) + octave> plot(t, x2) + octave> title("x(-t)") + octave> subplot(3, 2, 3) + octave> plot(t, x3) + octave> title("x(t/5)") + octave> subplot(3, 2, 4) + octave> plot(t, x4) + octave> title("x(1+3*t)") + octave> subplot(3, 2, 5) + octave> plot(t, x5) + octave> title("x(-1-3*t)") +\end{lstlisting} + +\begin{figure}[H] + \centering + \includegraphics[width=\linewidth]{res/fig6.png} + \caption{$x(t)$, $x(-t)$, $x(t/5)$, $x(1+3t)$, $x(-1-3t)$} +\end{figure} + +\pagebreak +\section{Εργαλεία} +Τα εργαλεία που χρησιμοποιήθηκαν για την υλοποίηση αυτής της εργασίας ήτανε +τα εξής: +\begin{itemize} + \item Περιβάλλον: GNU Octave 5.2.0 + \item Επιπλέον πακέτα: + \begin{itemize} + \item \lstinline{octave-forge-symbolic} + \item \lstinline{octave-forge-signal} + \end{itemize} + \item Λειτουργικό σύστημα: FreeBSD 12.2 + \item Κειμενογράφος: Vim + \item Μορφοποίηση κειμένου: \LaTeX +\end{itemize} + +\end{document} diff --git a/octave-signals-systems/ex2/res/fig2.png b/octave-signals-systems/ex2/res/fig2.png Binary files differ. diff --git a/octave-signals-systems/ex2/res/fig3.png b/octave-signals-systems/ex2/res/fig3.png Binary files differ. diff --git a/octave-signals-systems/ex2/res/fig4.png b/octave-signals-systems/ex2/res/fig4.png Binary files differ. diff --git a/octave-signals-systems/ex2/res/fig5.png b/octave-signals-systems/ex2/res/fig5.png Binary files differ. diff --git a/octave-signals-systems/ex2/res/fig6.png b/octave-signals-systems/ex2/res/fig6.png Binary files differ. diff --git a/octave-signals-systems/ex2/res/fig7.png b/octave-signals-systems/ex2/res/fig7.png Binary files differ. diff --git a/octave-signals-systems/ex2/res/uniwalogo.png b/octave-signals-systems/ex2/res/uniwalogo.png Binary files differ. diff --git a/vhdl-digital-design/Makefile b/vhdl-digital-design/Makefile @@ -0,0 +1,12 @@ +all: + ghdl -a ${IN}.vhd + ghdl -e ${IN} + +vcd: all + ghdl -r ${IN} --vcd=${IN}.vcd + +sim: + gtkwave ${IN}.vcd + +clean: + rm -f *.o *.cf *.vcd ${IN} diff --git a/vhdl-digital-design/ex1/Makefile b/vhdl-digital-design/ex1/Makefile @@ -0,0 +1 @@ +include ../Makefile diff --git a/vhdl-digital-design/ex1/dec2to4.vhd b/vhdl-digital-design/ex1/dec2to4.vhd @@ -0,0 +1,16 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity dec2to4 is port ( + a: in std_logic_vector(1 downto 0); + d: out std_logic_vector(3 downto 0) +); +end dec2to4; + +architecture dataflow of dec2to4 is +begin + d(0) <= not a(0) and not a(1); + d(1) <= not a(0) and a(1); + d(2) <= a(0) and not a(1); + d(3) <= a(0) and a(1); +end dataflow; diff --git a/vhdl-digital-design/ex1/dec2to4_tb.vhd b/vhdl-digital-design/ex1/dec2to4_tb.vhd @@ -0,0 +1,37 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity dec2to4_tb is +end dec2to4_tb; + +architecture behav of dec2to4_tb is + +signal a1: std_logic_vector(1 downto 0); +signal d1: std_logic_vector(3 downto 0); + +component dec2to4 is port ( + a: in std_logic_vector(1 downto 0); + d: out std_logic_vector(3 downto 0) +); +end component; + +begin + uut: dec2to4 port map ( + a => a1, + d => d1 + ); + + process begin + a1 <= "00"; + wait for 20 ps; + + a1 <= "01"; + wait for 20 ps; + + a1 <= "10"; + wait for 20 ps; + + a1 <= "11"; + wait for 20 ps; + end process; +end behav; diff --git a/vhdl-digital-design/ex1/dec2to4en.vhd b/vhdl-digital-design/ex1/dec2to4en.vhd @@ -0,0 +1,17 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity dec2to4en is port ( + a: in std_logic_vector(1 downto 0); + en: in std_logic; + d: out std_logic_vector(3 downto 0) +); +end dec2to4en; + +architecture dataflow of dec2to4en is +begin + d(0) <= not a(0) and not a(1) and en; + d(1) <= a(0) and not a(1) and en; + d(2) <= not a(0) and a(1) and en; + d(3) <= a(0) and a(1) and en; +end dataflow; diff --git a/vhdl-digital-design/ex1/dec2to4en_tb.vhd b/vhdl-digital-design/ex1/dec2to4en_tb.vhd @@ -0,0 +1,60 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity dec2to4en_tb is +end dec2to4en_tb; + +architecture behav of dec2to4en_tb is + +signal a1: std_logic_vector(1 downto 0); +signal en1: std_logic; +signal d1: std_logic_vector(3 downto 0); + +component dec2to4en is port ( + a: in std_logic_vector(1 downto 0); + en: in std_logic; + d: out std_logic_vector(3 downto 0) +); +end component; + +begin + uut: dec2to4en port map ( + a => a1, + en => en1, + d => d1 + ); + + process begin + a1 <= "00"; + en1 <= '0'; + wait for 20 ps; + + a1 <= "01"; + en1 <= '0'; + wait for 20 ps; + + a1 <= "10"; + en1 <= '0'; + wait for 20 ps; + + a1 <= "11"; + en1 <= '0'; + wait for 20 ps; + + a1 <= "00"; + en1 <= '1'; + wait for 20 ps; + + a1 <= "01"; + en1 <= '1'; + wait for 20 ps; + + a1 <= "10"; + en1 <= '1'; + wait for 20 ps; + + a1 <= "11"; + en1 <= '1'; + wait for 20 ps; + end process; +end behav; diff --git a/vhdl-digital-design/ex1/ex1.pdf b/vhdl-digital-design/ex1/ex1.pdf Binary files differ. diff --git a/vhdl-digital-design/ex1/fa.vhd b/vhdl-digital-design/ex1/fa.vhd @@ -0,0 +1,14 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity fa is port ( + a, b, cin: in bit; + s, cout: out bit +); +end fa; + +architecture dataflow of fa is +begin + s <= a xor b xor cin; + cout <= (a and b) or (cin and (a xor b)); +end dataflow; diff --git a/vhdl-digital-design/ex1/fa_tb.vhd b/vhdl-digital-design/ex1/fa_tb.vhd @@ -0,0 +1,68 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity fa_tb is +end fa_tb; + +architecture behav of fa_tb is + +signal a1, b1, cin1: bit; +signal s1, cout1: bit; + +component fa is port ( + a, b, cin: in bit; + s, cout: out bit +); +end component; + +begin + uut: fa port map ( + a => a1, + b => b1, + cin => cin1, + s => s1, + cout => cout1 + ); + + process begin + a1 <= '0'; + b1 <= '0'; + cin1 <= '0'; + wait for 20 ps; + + a1 <= '0'; + b1 <= '0'; + cin1 <= '1'; + wait for 20 ps; + + a1 <= '0'; + b1 <= '1'; + cin1 <= '0'; + wait for 20 ps; + + a1 <= '0'; + b1 <= '1'; + cin1 <= '1'; + wait for 20 ps; + + a1 <= '1'; + b1 <= '0'; + cin1 <= '0'; + wait for 20 ps; + + a1 <= '1'; + b1 <= '0'; + cin1 <= '1'; + wait for 20 ps; + + a1 <= '1'; + b1 <= '1'; + cin1 <= '0'; + wait for 20 ps; + + a1 <= '1'; + b1 <= '1'; + cin1 <= '1'; + wait for 20 ps; + end process; +end behav; diff --git a/vhdl-digital-design/ex1/ha.vhd b/vhdl-digital-design/ex1/ha.vhd @@ -0,0 +1,14 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity ha is port ( + a, b: in bit; + s, c: out bit +); +end ha; + +architecture dataflow of ha is +begin + s <= a xor b; + c <= a and b; +end dataflow; diff --git a/vhdl-digital-design/ex1/ha_tb.vhd b/vhdl-digital-design/ex1/ha_tb.vhd @@ -0,0 +1,43 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity ha_tb is +end ha_tb; + +architecture behav of ha_tb is + +signal a1, b1: bit; +signal s1, c1: bit; + +component ha is port ( + a, b: in bit; + s, c: out bit +); +end component; + +begin + uut: ha port map ( + a => a1, + b => b1, + s => s1, + c => c1 + ); + + process begin + a1 <= '0'; + b1 <= '0'; + wait for 20 ps; + + a1 <= '0'; + b1 <= '1'; + wait for 20 ps; + + a1 <= '1'; + b1 <= '0'; + wait for 20 ps; + + a1 <= '1'; + b1 <= '1'; + wait for 20 ps; + end process; +end behav; diff --git a/vhdl-digital-design/ex1/mux4to1.vhd b/vhdl-digital-design/ex1/mux4to1.vhd @@ -0,0 +1,22 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity mux4to1 is port ( + a: in std_logic_vector(3 downto 0); + s: in std_logic_vector(1 downto 0); + d: out std_logic +); +end mux4to1; + +architecture behav of mux4to1 is +begin + process (a, s) begin + case s is + when "00" => d <= a(0); + when "01" => d <= a(1); + when "10" => d <= a(2); + when "11" => d <= a(3); + when others => d <= 'X'; + end case; + end process; +end behav; diff --git a/vhdl-digital-design/ex1/mux4to1_tb.vhd b/vhdl-digital-design/ex1/mux4to1_tb.vhd @@ -0,0 +1,44 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity mux4to1_tb is +end mux4to1_tb; + +architecture behav of mux4to1_tb is + +signal a1: std_logic_vector(3 downto 0); +signal s1: std_logic_vector(1 downto 0); +signal d1: std_logic; + +component mux4to1 port ( + a: in std_logic_vector(3 downto 0); + s: in std_logic_vector(1 downto 0); + d: out std_logic +); +end component; + +begin + uut: mux4to1 port map ( + a => a1, + s => s1, + d => d1 + ); + + process begin + a1 <= "0000"; + s1 <= "00"; + wait for 20 ps; + + a1 <= "0101"; + s1 <= "01"; + wait for 20 ps; + + a1 <= "1010"; + s1 <= "10"; + wait for 20 ps; + + a1 <= "1100"; + s1 <= "11"; + wait for 20 ps; + end process; +end behav; diff --git a/vhdl-digital-design/ex1/mux_triple_2to1.vhd b/vhdl-digital-design/ex1/mux_triple_2to1.vhd @@ -0,0 +1,14 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity mux_triple_2to1 is port ( + a, b: in std_logic_vector(2 downto 0); + s: in std_logic; + d: out std_logic_vector(2 downto 0) +); +end mux_triple_2to1; + +architecture dataflow of mux_triple_2to1 is +begin + d <= a when s = '1' else b; +end dataflow; diff --git a/vhdl-digital-design/ex1/mux_triple_2to1_tb.vhd b/vhdl-digital-design/ex1/mux_triple_2to1_tb.vhd @@ -0,0 +1,69 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity mux_triple_2to1_tb is +end mux_triple_2to1_tb; + +architecture behav of mux_triple_2to1_tb is + +signal a1, b1: std_logic_vector(2 downto 0); +signal s1: std_logic; +signal d1: std_logic_vector(2 downto 0); + +component mux_triple_2to1 port ( + a, b: in std_logic_vector(2 downto 0); + s: in std_logic; + d: out std_logic_vector(2 downto 0) +); +end component; + +begin + uut: mux_triple_2to1 port map ( + a => a1, + b => b1, + s => s1, + d => d1 + ); + + process begin + a1 <= "001"; + b1 <= "010"; + s1 <= '0'; + wait for 20 ps; + + a1 <= "010"; + b1 <= "100"; + s1 <= '0'; + wait for 20 ps; + + a1 <= "111"; + b1 <= "011"; + s1 <= '0'; + wait for 20 ps; + + a1 <= "101"; + b1 <= "111"; + s1 <= '0'; + wait for 20 ps; + + a1 <= "010"; + b1 <= "001"; + s1 <= '1'; + wait for 20 ps; + + a1 <= "000"; + b1 <= "101"; + s1 <= '1'; + wait for 20 ps; + + a1 <= "101"; + b1 <= "010"; + s1 <= '1'; + wait for 20 ps; + + a1 <= "111"; + b1 <= "101"; + s1 <= '1'; + wait for 20 ps; + end process; +end behav; diff --git a/vhdl-digital-design/mux2to1.vhd b/vhdl-digital-design/mux2to1.vhd @@ -0,0 +1,15 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity mux2to1 is +port ( + a, b, s: in bit; + c: out bit +); +end mux2to1; + +architecture dataflow of mux2to1 is +begin + c <= a when s = '1' else b; + --c <= (a and s) or (b and (not s)); -- logic form +end dataflow; diff --git a/vhdl-digital-design/mux2to1_tb.vhd b/vhdl-digital-design/mux2to1_tb.vhd @@ -0,0 +1,33 @@ +entity mux2to1_tb is +end mux2to1_tb; + +architecture tb of mux2to1_tb is + +signal a1, b1, s1, c1: bit; + +component mux2to1 +port ( + a, b, s: in bit; + c: out bit +); +end component; + +begin + m1: mux2to1 port map ( + a => a1, + b => b1, + s => s1, + c => c1 + ); + process begin + a1 <= '1'; + b1 <= '0'; + s1 <= '1'; + wait for 20 ps; + + a1 <= '1'; + b1 <= '0'; + s1 <= '0'; + wait for 20 ps; + end process; +end tb;