aboutsummaryrefslogtreecommitdiff
path: root/works/life
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-11-23 09:51:36 +0800
committercrupest <crupest@outlook.com>2021-11-23 09:51:36 +0800
commit224d5fec9b9377faa4bf8d3da0e37f675ef5ea03 (patch)
tree3b06ea5155efa5c1313e3af1c67b16e57adaf1d8 /works/life
parent226bfe84c5f690462adbf386dc66316cc21fdb28 (diff)
downloadcrupest-224d5fec9b9377faa4bf8d3da0e37f675ef5ea03.tar.gz
crupest-224d5fec9b9377faa4bf8d3da0e37f675ef5ea03.tar.bz2
crupest-224d5fec9b9377faa4bf8d3da0e37f675ef5ea03.zip
import(life): Add computer organization experiment 4.
Diffstat (limited to 'works/life')
-rw-r--r--works/life/computer-organization-experiment/Makefile11
-rw-r--r--works/life/computer-organization-experiment/adder_1.vhdl13
-rw-r--r--works/life/computer-organization-experiment/adder_32.vhdl20
-rw-r--r--works/life/computer-organization-experiment/adder_8.vhdl28
-rw-r--r--works/life/computer-organization-experiment/test_bench.vhdl22
5 files changed, 93 insertions, 1 deletions
diff --git a/works/life/computer-organization-experiment/Makefile b/works/life/computer-organization-experiment/Makefile
index 1335118..96a830d 100644
--- a/works/life/computer-organization-experiment/Makefile
+++ b/works/life/computer-organization-experiment/Makefile
@@ -3,6 +3,15 @@ all: build/test_bench
build:
mkdir -p build
+build/adder_1.o: build adder_1.vhdl
+ ghdl analyze --workdir=build -fsynopsys adder_1.vhdl
+
+build/adder_8.o: build adder_8.vhdl
+ ghdl analyze --workdir=build -fsynopsys adder_8.vhdl
+
+build/adder_32.o: build adder_32.vhdl
+ ghdl analyze --workdir=build -fsynopsys adder_32.vhdl
+
build/counter_4.o: build counter_4.vhdl
ghdl analyze --workdir=build -fsynopsys counter_4.vhdl
@@ -18,7 +27,7 @@ build/multiplexer_8_2.o: build multiplexer_8_2.vhdl
build/multiplexer_32_2.o: build multiplexer_32_2.vhdl
ghdl analyze --workdir=build -fsynopsys multiplexer_32_2.vhdl
-build/test_bench.o: build test_bench.vhdl build/counter_4.o build/full_adder_1.o build/multiplexer_1_2.o build/multiplexer_8_2.o build/multiplexer_32_2.o
+build/test_bench.o: build test_bench.vhdl build/counter_4.o build/full_adder_1.o build/multiplexer_1_2.o build/multiplexer_8_2.o build/multiplexer_32_2.o build/adder_1.o build/adder_8.o build/adder_32.o
ghdl analyze --workdir=build -fsynopsys test_bench.vhdl
build/test_bench: build/test_bench.o
diff --git a/works/life/computer-organization-experiment/adder_1.vhdl b/works/life/computer-organization-experiment/adder_1.vhdl
new file mode 100644
index 0000000..625aae4
--- /dev/null
+++ b/works/life/computer-organization-experiment/adder_1.vhdl
@@ -0,0 +1,13 @@
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.STD_LOGIC_UNSIGNED.ALL;
+
+entity adder_1 is
+ port (A, B, CIN:in std_logic; S, COUT: out std_logic);
+end adder_1;
+
+architecture behavior of adder_1 is
+begin
+ S <= (A XOR B) XOR CIN;
+ COUT <= (A AND B) OR (B AND CIN) OR (CIN AND A);
+end behavior;
diff --git a/works/life/computer-organization-experiment/adder_32.vhdl b/works/life/computer-organization-experiment/adder_32.vhdl
new file mode 100644
index 0000000..f573f3f
--- /dev/null
+++ b/works/life/computer-organization-experiment/adder_32.vhdl
@@ -0,0 +1,20 @@
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.STD_LOGIC_UNSIGNED.ALL;
+
+entity adder_32 is
+ port (A, B:in std_logic_vector(31 downto 0); CIN:in std_logic; S: out std_logic_vector(31 downto 0); COUT: out std_logic);
+end adder_32;
+
+architecture behavior of adder_32 is
+ signal C : std_logic_vector(2 downto 0);
+begin
+ c0: entity work.adder_8
+ port map (A=>A(7 downto 0), B=>B(7 downto 0), CIN=>CIN, S=>S(7 downto 0), COUT=>C(0));
+ c1: entity work.adder_8
+ port map (A=>A(15 downto 8), B=>B(15 downto 8), CIN=>C(0), S=>S(15 downto 8), COUT=>C(1));
+ c2: entity work.adder_8
+ port map (A=>A(23 downto 16), B=>B(23 downto 16), CIN=>C(1), S=>S(23 downto 16), COUT=>C(2));
+ c3: entity work.adder_8
+ port map (A=>A(31 downto 24), B=>B(31 downto 24), CIN=>C(2), S=>S(31 downto 24), COUT=>COUT);
+end behavior;
diff --git a/works/life/computer-organization-experiment/adder_8.vhdl b/works/life/computer-organization-experiment/adder_8.vhdl
new file mode 100644
index 0000000..840ee0d
--- /dev/null
+++ b/works/life/computer-organization-experiment/adder_8.vhdl
@@ -0,0 +1,28 @@
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.STD_LOGIC_UNSIGNED.ALL;
+
+entity adder_8 is
+ port (A, B:in std_logic_vector(7 downto 0); CIN:in std_logic; S: out std_logic_vector(7 downto 0); COUT: out std_logic);
+end adder_8;
+
+architecture behavior of adder_8 is
+ signal C : std_logic_vector(6 downto 0);
+begin
+ b0: entity work.adder_1
+ port map (A=>A(0), B=>B(0), CIN=>CIN, S=>S(0), COUT=>C(0));
+ b1: entity work.adder_1
+ port map (A=>A(1), B=>B(1), CIN=>C(0), S=>S(1), COUT=>C(1));
+ b2: entity work.adder_1
+ port map (A=>A(2), B=>B(2), CIN=>C(1), S=>S(2), COUT=>C(2));
+ b3: entity work.adder_1
+ port map (A=>A(3), B=>B(3), CIN=>C(2), S=>S(3), COUT=>C(3));
+ b4: entity work.adder_1
+ port map (A=>A(4), B=>B(4), CIN=>C(3), S=>S(4), COUT=>C(4));
+ b5: entity work.adder_1
+ port map (A=>A(5), B=>B(5), CIN=>C(4), S=>S(5), COUT=>C(5));
+ b6: entity work.adder_1
+ port map (A=>A(6), B=>B(6), CIN=>C(5), S=>S(6), COUT=>C(6));
+ b7: entity work.adder_1
+ port map (A=>A(7), B=>B(7), CIN=>C(6), S=>S(7), COUT=>COUT);
+end behavior;
diff --git a/works/life/computer-organization-experiment/test_bench.vhdl b/works/life/computer-organization-experiment/test_bench.vhdl
index 756aa8d..64daf7f 100644
--- a/works/life/computer-organization-experiment/test_bench.vhdl
+++ b/works/life/computer-organization-experiment/test_bench.vhdl
@@ -62,3 +62,25 @@ begin
end loop;
end process stimulus;
end architecture test_multiplexer_32_2;
+
+architecture test_adder_32 of test_bench is
+ signal A: std_logic_vector(31 downto 0) := B"00000000000000000000000000000000";
+ signal B: std_logic_vector(31 downto 0) := B"00000000000000000000000000000000";
+ signal CIN: std_logic;
+ signal S: std_logic_vector(31 downto 0);
+ signal COUT: std_logic;
+begin
+ adder: entity work.adder_32(behavior)
+ port map (A, B, CIN, S, COUT);
+ stimulus: process is
+ begin
+ loop
+ A <= A + 1;
+ B <= B + 2;
+ CIN <= '0';
+ wait for 5 ns;
+ CIN <= '1';
+ wait for 5 ns;
+ end loop;
+ end process stimulus;
+end architecture test_adder_32;