diff --git a/.pic/Basic Verilog structures/concatenation/fig_01.drawio.png b/.pic/Basic Verilog structures/concatenation/fig_01.drawio.png deleted file mode 100644 index c3265e4..0000000 Binary files a/.pic/Basic Verilog structures/concatenation/fig_01.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/concatenation/fig_01.drawio.svg b/.pic/Basic Verilog structures/concatenation/fig_01.drawio.svg new file mode 100644 index 0000000..2566845 --- /dev/null +++ b/.pic/Basic Verilog structures/concatenation/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + +
8
2
6
a
b
c
d
e
6
2
8
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/concatenation/fig_02.drawio.png b/.pic/Basic Verilog structures/concatenation/fig_02.drawio.png deleted file mode 100644 index d8cc32b..0000000 Binary files a/.pic/Basic Verilog structures/concatenation/fig_02.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/concatenation/fig_02.drawio.svg b/.pic/Basic Verilog structures/concatenation/fig_02.drawio.svg new file mode 100644 index 0000000..403c7f4 --- /dev/null +++ b/.pic/Basic Verilog structures/concatenation/fig_02.drawio.svg @@ -0,0 +1,4 @@ + + + +
8
2
6
a
b
c
d
e
e[5]
e[4]
e[3]
e[2]
e[1]
e[0]
c[4]
c[3]
d[1]
d[0]
6
6
6
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/concatenation/fig_03.drawio.png b/.pic/Basic Verilog structures/concatenation/fig_03.drawio.png deleted file mode 100644 index 797586f..0000000 Binary files a/.pic/Basic Verilog structures/concatenation/fig_03.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/concatenation/fig_03.drawio.svg b/.pic/Basic Verilog structures/concatenation/fig_03.drawio.svg new file mode 100644 index 0000000..c21b67b --- /dev/null +++ b/.pic/Basic Verilog structures/concatenation/fig_03.drawio.svg @@ -0,0 +1,4 @@ + + + +
8
2
6
a
b
c
d
e
e[5]
e[4]
e[3]
e[2]
e[1]
e[0]
c[4]
c[3]
d[1]
d[0]
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_01.drawio.png b/.pic/Basic Verilog structures/controllers/fig_01.drawio.png deleted file mode 100644 index 15147c9..0000000 Binary files a/.pic/Basic Verilog structures/controllers/fig_01.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/controllers/fig_01.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_01.drawio.svg new file mode 100644 index 0000000..ec25e75 --- /dev/null +++ b/.pic/Basic Verilog structures/controllers/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + +
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
led_o
read_data_o
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_02.drawio.png b/.pic/Basic Verilog structures/controllers/fig_02.drawio.png deleted file mode 100644 index 70e3035..0000000 Binary files a/.pic/Basic Verilog structures/controllers/fig_02.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/controllers/fig_02.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_02.drawio.svg new file mode 100644 index 0000000..17d1982 --- /dev/null +++ b/.pic/Basic Verilog structures/controllers/fig_02.drawio.svg @@ -0,0 +1,4 @@ + + + +
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
write_req
read_req
led_o
read_data_o
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_03.drawio.png b/.pic/Basic Verilog structures/controllers/fig_03.drawio.png deleted file mode 100644 index 34c894a..0000000 Binary files a/.pic/Basic Verilog structures/controllers/fig_03.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/controllers/fig_03.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_03.drawio.svg new file mode 100644 index 0000000..7866ceb --- /dev/null +++ b/.pic/Basic Verilog structures/controllers/fig_03.drawio.svg @@ -0,0 +1,4 @@ + + + +
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
val_valid
led_o
read_data_o
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_04.drawio.png b/.pic/Basic Verilog structures/controllers/fig_04.drawio.png deleted file mode 100644 index 387222f..0000000 Binary files a/.pic/Basic Verilog structures/controllers/fig_04.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/controllers/fig_04.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_04.drawio.svg new file mode 100644 index 0000000..ad97fc2 --- /dev/null +++ b/.pic/Basic Verilog structures/controllers/fig_04.drawio.svg @@ -0,0 +1,4 @@ + + + +
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
rst_valid
write_req
is_rst_addr
rst
val_valid
led_o
read_data_o
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_05.drawio.png b/.pic/Basic Verilog structures/controllers/fig_05.drawio.png deleted file mode 100644 index 976ea25..0000000 Binary files a/.pic/Basic Verilog structures/controllers/fig_05.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/controllers/fig_05.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_05.drawio.svg new file mode 100644 index 0000000..384b67c --- /dev/null +++ b/.pic/Basic Verilog structures/controllers/fig_05.drawio.svg @@ -0,0 +1,4 @@ + + + +
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
rst_valid
write_req
is_rst_addr
rst
val_valid
write_req
is_val_addr
val_en
val_valid
led_o
read_data_o
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_06.drawio.png b/.pic/Basic Verilog structures/controllers/fig_06.drawio.png deleted file mode 100644 index 8cc9fa9..0000000 Binary files a/.pic/Basic Verilog structures/controllers/fig_06.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/controllers/fig_06.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_06.drawio.svg new file mode 100644 index 0000000..622c866 --- /dev/null +++ b/.pic/Basic Verilog structures/controllers/fig_06.drawio.svg @@ -0,0 +1,4 @@ + + + +
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
led
val
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
rst_valid
write_req
is_rst_addr
rst
val_valid
write_req
is_val_addr
val_en
val_valid
val_en
rst
clk_i
write_data_i[15:0]
led_val
led_o
read_data_o
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_07.drawio.png b/.pic/Basic Verilog structures/controllers/fig_07.drawio.png deleted file mode 100644 index 569000b..0000000 Binary files a/.pic/Basic Verilog structures/controllers/fig_07.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/controllers/fig_07.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_07.drawio.svg new file mode 100644 index 0000000..aeb594a --- /dev/null +++ b/.pic/Basic Verilog structures/controllers/fig_07.drawio.svg @@ -0,0 +1,4 @@ + + + +
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
led
val
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
rst_valid
write_req
is_rst_addr
rst
val_valid
write_req
is_val_addr
val_en
mode_valid
write_req
is_mode_addr
mode_en
val_valid
val_en
rst
clk_i
write_data_i[15:0]
mod
mode_en
rst
clk_i
write_data_i[0]
led_val
led_o
read_data_o
led_val
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_08.drawio.png b/.pic/Basic Verilog structures/controllers/fig_08.drawio.png deleted file mode 100644 index 919cd95..0000000 Binary files a/.pic/Basic Verilog structures/controllers/fig_08.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/controllers/fig_08.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_08.drawio.svg new file mode 100644 index 0000000..9a1f581 --- /dev/null +++ b/.pic/Basic Verilog structures/controllers/fig_08.drawio.svg @@ -0,0 +1,4 @@ + + + +
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
led
val
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
rst_valid
write_req
is_rst_addr
rst
val_valid
write_req
is_val_addr
val_en
mode_valid
write_req
is_mode_addr
mode_en
val_valid
val_en
rst
clk_i
write_data_i[15:0]
mod
mode_en
rst
clk_i
write_data_i[0]
cntr
rst
clk_i
+
32'd1
32
led_val
<
107
16'd0
led_val
led_o
read_data_o
>=
2*107
cntr

1

0

\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_09.drawio.png b/.pic/Basic Verilog structures/controllers/fig_09.drawio.png deleted file mode 100644 index 2b45098..0000000 Binary files a/.pic/Basic Verilog structures/controllers/fig_09.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/controllers/fig_09.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_09.drawio.svg new file mode 100644 index 0000000..6b03acb --- /dev/null +++ b/.pic/Basic Verilog structures/controllers/fig_09.drawio.svg @@ -0,0 +1,4 @@ + + + +
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
led
val
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
rst_valid
write_req
is_rst_addr
rst
val_valid
write_req
is_val_addr
val_en
mode_valid
write_req
is_mode_addr
mode_en
val_valid
val_en
rst
clk_i
write_data_i[15:0]
mod
mode_en
rst
clk_i
write_data_i[0]
cntr
rst
clk_i
+
32'd1
32
led_val
<
107
16'd0
led_val
led_o
read_data_o
rd
rst
clk_i
read_req
>=
2*107
cntr
{16'd0, led_val}
is_val_addr

1

0

0

1

{31'd0, led_mode}
is_val_addr
is_mode_addr
en
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/modules/fig_01.drawio.png b/.pic/Basic Verilog structures/modules/fig_01.drawio.png deleted file mode 100644 index ab3deae..0000000 Binary files a/.pic/Basic Verilog structures/modules/fig_01.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/modules/fig_01.drawio.svg b/.pic/Basic Verilog structures/modules/fig_01.drawio.svg new file mode 100644 index 0000000..c9d4ecd --- /dev/null +++ b/.pic/Basic Verilog structures/modules/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.pic/Basic Verilog structures/modules/fig_02.drawio.png b/.pic/Basic Verilog structures/modules/fig_02.drawio.png deleted file mode 100644 index 82870c5..0000000 Binary files a/.pic/Basic Verilog structures/modules/fig_02.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/modules/fig_02.drawio.svg b/.pic/Basic Verilog structures/modules/fig_02.drawio.svg new file mode 100644 index 0000000..094490a --- /dev/null +++ b/.pic/Basic Verilog structures/modules/fig_02.drawio.svg @@ -0,0 +1,4 @@ + + + +
box
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/modules/fig_03.drawio.png b/.pic/Basic Verilog structures/modules/fig_03.drawio.png deleted file mode 100644 index f736598..0000000 Binary files a/.pic/Basic Verilog structures/modules/fig_03.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/modules/fig_03.drawio.svg b/.pic/Basic Verilog structures/modules/fig_03.drawio.svg new file mode 100644 index 0000000..8f92373 --- /dev/null +++ b/.pic/Basic Verilog structures/modules/fig_03.drawio.svg @@ -0,0 +1,4 @@ + + + +
box
a
b
q
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/modules/fig_04.drawio.png b/.pic/Basic Verilog structures/modules/fig_04.drawio.png deleted file mode 100644 index b7033f5..0000000 Binary files a/.pic/Basic Verilog structures/modules/fig_04.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/modules/fig_04.drawio.svg b/.pic/Basic Verilog structures/modules/fig_04.drawio.svg new file mode 100644 index 0000000..6cf1471 --- /dev/null +++ b/.pic/Basic Verilog structures/modules/fig_04.drawio.svg @@ -0,0 +1,4 @@ + + + +
box
a
b
q
c
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/modules/fig_05.drawio.png b/.pic/Basic Verilog structures/modules/fig_05.drawio.png deleted file mode 100644 index bbe563e..0000000 Binary files a/.pic/Basic Verilog structures/modules/fig_05.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/modules/fig_05.drawio.svg b/.pic/Basic Verilog structures/modules/fig_05.drawio.svg new file mode 100644 index 0000000..fcf374a --- /dev/null +++ b/.pic/Basic Verilog structures/modules/fig_05.drawio.svg @@ -0,0 +1,4 @@ + + + +
box
a
b
q
c
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/modules/fig_06.drawio.png b/.pic/Basic Verilog structures/modules/fig_06.drawio.png deleted file mode 100644 index 3423950..0000000 Binary files a/.pic/Basic Verilog structures/modules/fig_06.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/modules/fig_06.drawio.svg b/.pic/Basic Verilog structures/modules/fig_06.drawio.svg new file mode 100644 index 0000000..f38e193 --- /dev/null +++ b/.pic/Basic Verilog structures/modules/fig_06.drawio.svg @@ -0,0 +1,4 @@ + + + +
box
a
b
q
c
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/modules/fig_07.drawio.png b/.pic/Basic Verilog structures/modules/fig_07.drawio.png deleted file mode 100644 index bd89b94..0000000 Binary files a/.pic/Basic Verilog structures/modules/fig_07.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/modules/fig_07.drawio.svg b/.pic/Basic Verilog structures/modules/fig_07.drawio.svg new file mode 100644 index 0000000..cd878d3 --- /dev/null +++ b/.pic/Basic Verilog structures/modules/fig_07.drawio.svg @@ -0,0 +1,4 @@ + + + +
box
a
b
q
c
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/modules/fig_08.drawio.png b/.pic/Basic Verilog structures/modules/fig_08.drawio.png deleted file mode 100644 index 5b0bbd5..0000000 Binary files a/.pic/Basic Verilog structures/modules/fig_08.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/modules/fig_08.drawio.svg b/.pic/Basic Verilog structures/modules/fig_08.drawio.svg new file mode 100644 index 0000000..a55282c --- /dev/null +++ b/.pic/Basic Verilog structures/modules/fig_08.drawio.svg @@ -0,0 +1,4 @@ + + + +
top
a
b
q
inv
inv
a
d
c
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/modules/fig_09.drawio.png b/.pic/Basic Verilog structures/modules/fig_09.drawio.png deleted file mode 100644 index 35df915..0000000 Binary files a/.pic/Basic Verilog structures/modules/fig_09.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/modules/fig_09.drawio.svg b/.pic/Basic Verilog structures/modules/fig_09.drawio.svg new file mode 100644 index 0000000..61ecc17 --- /dev/null +++ b/.pic/Basic Verilog structures/modules/fig_09.drawio.svg @@ -0,0 +1,4 @@ + + + +
top
a
b
q
inv
inv
inv
a
d
c
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/modules/fig_10.drawio.png b/.pic/Basic Verilog structures/modules/fig_10.drawio.png deleted file mode 100644 index 362fdf9..0000000 Binary files a/.pic/Basic Verilog structures/modules/fig_10.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/modules/fig_10.drawio.svg b/.pic/Basic Verilog structures/modules/fig_10.drawio.svg new file mode 100644 index 0000000..501226b --- /dev/null +++ b/.pic/Basic Verilog structures/modules/fig_10.drawio.svg @@ -0,0 +1,4 @@ + + + +
top
a
b
q
or
a
b
or
a
d
c
b
2
[0]
[1]
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/multiplexors/fig_01.drawio.png b/.pic/Basic Verilog structures/multiplexors/fig_01.drawio.png deleted file mode 100644 index e81db96..0000000 Binary files a/.pic/Basic Verilog structures/multiplexors/fig_01.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/multiplexors/fig_01.drawio.svg b/.pic/Basic Verilog structures/multiplexors/fig_01.drawio.svg new file mode 100644 index 0000000..b229d56 --- /dev/null +++ b/.pic/Basic Verilog structures/multiplexors/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + +
out
I0
I1
sel
I0
I1
out
sel
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/multiplexors/fig_02.drawio.png b/.pic/Basic Verilog structures/multiplexors/fig_02.drawio.png deleted file mode 100644 index fcebdc1..0000000 Binary files a/.pic/Basic Verilog structures/multiplexors/fig_02.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/multiplexors/fig_02.drawio.svg b/.pic/Basic Verilog structures/multiplexors/fig_02.drawio.svg new file mode 100644 index 0000000..199f1a1 --- /dev/null +++ b/.pic/Basic Verilog structures/multiplexors/fig_02.drawio.svg @@ -0,0 +1,4 @@ + + + +
Y
D1
D0
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/multiplexors/fig_03.drawio.png b/.pic/Basic Verilog structures/multiplexors/fig_03.drawio.png deleted file mode 100644 index f8ed3da..0000000 Binary files a/.pic/Basic Verilog structures/multiplexors/fig_03.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/multiplexors/fig_03.drawio.svg b/.pic/Basic Verilog structures/multiplexors/fig_03.drawio.svg new file mode 100644 index 0000000..e345093 --- /dev/null +++ b/.pic/Basic Verilog structures/multiplexors/fig_03.drawio.svg @@ -0,0 +1,4 @@ + + + +
D0
D1
0


1
S
Y
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/multiplexors/fig_04.drawio.png b/.pic/Basic Verilog structures/multiplexors/fig_04.drawio.png deleted file mode 100644 index 6154d6c..0000000 Binary files a/.pic/Basic Verilog structures/multiplexors/fig_04.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/multiplexors/fig_04.drawio.svg b/.pic/Basic Verilog structures/multiplexors/fig_04.drawio.svg new file mode 100644 index 0000000..b7da9d8 --- /dev/null +++ b/.pic/Basic Verilog structures/multiplexors/fig_04.drawio.svg @@ -0,0 +1,4 @@ + + + +
B
C
S[2:0]
D
Y
3..7
0
1
2
A
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/multiplexors/fig_05.drawio.png b/.pic/Basic Verilog structures/multiplexors/fig_05.drawio.png deleted file mode 100644 index 176697f..0000000 Binary files a/.pic/Basic Verilog structures/multiplexors/fig_05.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/multiplexors/fig_05.drawio.svg b/.pic/Basic Verilog structures/multiplexors/fig_05.drawio.svg new file mode 100644 index 0000000..688aa58 --- /dev/null +++ b/.pic/Basic Verilog structures/multiplexors/fig_05.drawio.svg @@ -0,0 +1,4 @@ + + + +
3..7
B
C
S[2:0]
D
A
Y
0
1
2
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/registers/fig_01.drawio.png b/.pic/Basic Verilog structures/registers/fig_01.drawio.png deleted file mode 100644 index bf1e368..0000000 Binary files a/.pic/Basic Verilog structures/registers/fig_01.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/registers/fig_01.drawio.svg b/.pic/Basic Verilog structures/registers/fig_01.drawio.svg new file mode 100644 index 0000000..76cda86 --- /dev/null +++ b/.pic/Basic Verilog structures/registers/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + +
reg_name
reg
D
Q
clk
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/registers/fig_02.drawio.png b/.pic/Basic Verilog structures/registers/fig_02.drawio.png deleted file mode 100644 index a65e24d..0000000 Binary files a/.pic/Basic Verilog structures/registers/fig_02.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/registers/fig_02.drawio.svg b/.pic/Basic Verilog structures/registers/fig_02.drawio.svg new file mode 100644 index 0000000..69e384f --- /dev/null +++ b/.pic/Basic Verilog structures/registers/fig_02.drawio.svg @@ -0,0 +1,4 @@ + + + +
reg_name
reg
D
Q
clk
reg_name
en
rst
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/registers/fig_03.drawio.png b/.pic/Basic Verilog structures/registers/fig_03.drawio.png deleted file mode 100644 index 4a3aad3..0000000 Binary files a/.pic/Basic Verilog structures/registers/fig_03.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/registers/fig_03.drawio.svg b/.pic/Basic Verilog structures/registers/fig_03.drawio.svg new file mode 100644 index 0000000..484049e --- /dev/null +++ b/.pic/Basic Verilog structures/registers/fig_03.drawio.svg @@ -0,0 +1,4 @@ + + + +
reg_name
reg
D
Q
clk
reg_name
data
clk
reg_data
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/registers/fig_04.drawio.png b/.pic/Basic Verilog structures/registers/fig_04.drawio.png deleted file mode 100644 index eef8ade..0000000 Binary files a/.pic/Basic Verilog structures/registers/fig_04.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/registers/fig_04.drawio.svg b/.pic/Basic Verilog structures/registers/fig_04.drawio.svg new file mode 100644 index 0000000..5785ae0 --- /dev/null +++ b/.pic/Basic Verilog structures/registers/fig_04.drawio.svg @@ -0,0 +1,4 @@ + + + +
reg_name
reg
Q
reg_name
data
clk
reg_data
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/registers/fig_05.drawio.png b/.pic/Basic Verilog structures/registers/fig_05.drawio.png deleted file mode 100644 index 324b2bf..0000000 Binary files a/.pic/Basic Verilog structures/registers/fig_05.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/registers/fig_05.drawio.svg b/.pic/Basic Verilog structures/registers/fig_05.drawio.svg new file mode 100644 index 0000000..6e68c28 --- /dev/null +++ b/.pic/Basic Verilog structures/registers/fig_05.drawio.svg @@ -0,0 +1,4 @@ + + + +
reg_name
reg
Q
reg_name
data
clk
reg_data
en
rst
enable
reset
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/registers/fig_06.drawio.png b/.pic/Basic Verilog structures/registers/fig_06.drawio.png deleted file mode 100644 index c3eedf9..0000000 Binary files a/.pic/Basic Verilog structures/registers/fig_06.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/registers/fig_06.drawio.svg b/.pic/Basic Verilog structures/registers/fig_06.drawio.svg new file mode 100644 index 0000000..db77663 --- /dev/null +++ b/.pic/Basic Verilog structures/registers/fig_06.drawio.svg @@ -0,0 +1,4 @@ + + + +
reg_name
reg
Q
reg_name
A
clk
reg_data
rst
reset
B
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/registers/fig_07.drawio.png b/.pic/Basic Verilog structures/registers/fig_07.drawio.png deleted file mode 100644 index 7e8cd5b..0000000 Binary files a/.pic/Basic Verilog structures/registers/fig_07.drawio.png and /dev/null differ diff --git a/.pic/Basic Verilog structures/registers/fig_07.drawio.svg b/.pic/Basic Verilog structures/registers/fig_07.drawio.svg new file mode 100644 index 0000000..ce64e12 --- /dev/null +++ b/.pic/Basic Verilog structures/registers/fig_07.drawio.svg @@ -0,0 +1,4 @@ + + + +
reg_name
reg
Q
reg_name
A
clk
reg_data
rst
reset_n
B
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/FPGA_and_gate_transistor.drawio.png b/.pic/Introduction/How FPGA works/FPGA_and_gate_transistor.drawio.png deleted file mode 100644 index 8839a8e..0000000 Binary files a/.pic/Introduction/How FPGA works/FPGA_and_gate_transistor.drawio.png and /dev/null differ diff --git a/.pic/Introduction/How FPGA works/FPGA_ang_gate.png b/.pic/Introduction/How FPGA works/FPGA_ang_gate.png deleted file mode 100644 index e7a738d..0000000 Binary files a/.pic/Introduction/How FPGA works/FPGA_ang_gate.png and /dev/null differ diff --git a/.pic/Introduction/How FPGA works/FPGA_d_flip_flop.png b/.pic/Introduction/How FPGA works/FPGA_d_flip_flop.png deleted file mode 100644 index 22e250b..0000000 Binary files a/.pic/Introduction/How FPGA works/FPGA_d_flip_flop.png and /dev/null differ diff --git a/.pic/Introduction/How FPGA works/FPGA_lut_scheme.drawio.png b/.pic/Introduction/How FPGA works/FPGA_lut_scheme.drawio.png deleted file mode 100644 index 673a790..0000000 Binary files a/.pic/Introduction/How FPGA works/FPGA_lut_scheme.drawio.png and /dev/null differ diff --git a/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_initial.drawio.png b/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_initial.drawio.png deleted file mode 100644 index 9ac6159..0000000 Binary files a/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_initial.drawio.png and /dev/null differ diff --git a/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_output.drawio.png b/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_output.drawio.png deleted file mode 100644 index faeee8e..0000000 Binary files a/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_output.drawio.png and /dev/null differ diff --git a/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_path.drawio.png b/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_path.drawio.png deleted file mode 100644 index b84466b..0000000 Binary files a/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_path.drawio.png and /dev/null differ diff --git a/.pic/Introduction/How FPGA works/FPGA_mux_symbol.png b/.pic/Introduction/How FPGA works/FPGA_mux_symbol.png deleted file mode 100644 index 768f5c7..0000000 Binary files a/.pic/Introduction/How FPGA works/FPGA_mux_symbol.png and /dev/null differ diff --git a/.pic/Introduction/How FPGA works/FPGA_not_gate.png b/.pic/Introduction/How FPGA works/FPGA_not_gate.png deleted file mode 100644 index 74d9371..0000000 Binary files a/.pic/Introduction/How FPGA works/FPGA_not_gate.png and /dev/null differ diff --git a/.pic/Introduction/How FPGA works/FPGA_or_gate.png b/.pic/Introduction/How FPGA works/FPGA_or_gate.png deleted file mode 100644 index 3af577b..0000000 Binary files a/.pic/Introduction/How FPGA works/FPGA_or_gate.png and /dev/null differ diff --git a/.pic/Introduction/How FPGA works/FPGA_or_gate_tree.drawio.png b/.pic/Introduction/How FPGA works/FPGA_or_gate_tree.drawio.png deleted file mode 100644 index d4c7d0e..0000000 Binary files a/.pic/Introduction/How FPGA works/FPGA_or_gate_tree.drawio.png and /dev/null differ diff --git a/.pic/Introduction/How FPGA works/FPGA_xor_gate.png b/.pic/Introduction/How FPGA works/FPGA_xor_gate.png deleted file mode 100644 index 83fe29b..0000000 Binary files a/.pic/Introduction/How FPGA works/FPGA_xor_gate.png and /dev/null differ diff --git a/.pic/Introduction/How FPGA works/fig_01.drawio.svg b/.pic/Introduction/How FPGA works/fig_01.drawio.svg new file mode 100644 index 0000000..9f7bd12 --- /dev/null +++ b/.pic/Introduction/How FPGA works/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + +
a
b
c
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_02.drawio.svg b/.pic/Introduction/How FPGA works/fig_02.drawio.svg new file mode 100644 index 0000000..289f5f7 --- /dev/null +++ b/.pic/Introduction/How FPGA works/fig_02.drawio.svg @@ -0,0 +1,4 @@ + + + +
a
b
c
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_03.drawio.svg b/.pic/Introduction/How FPGA works/fig_03.drawio.svg new file mode 100644 index 0000000..45df624 --- /dev/null +++ b/.pic/Introduction/How FPGA works/fig_03.drawio.svg @@ -0,0 +1,4 @@ + + + +
a
b
c
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_04.drawio.svg b/.pic/Introduction/How FPGA works/fig_04.drawio.svg new file mode 100644 index 0000000..2c1d8e4 --- /dev/null +++ b/.pic/Introduction/How FPGA works/fig_04.drawio.svg @@ -0,0 +1,4 @@ + + + +
a
b
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_05.drawio.svg b/.pic/Introduction/How FPGA works/fig_05.drawio.svg new file mode 100644 index 0000000..3d4408f --- /dev/null +++ b/.pic/Introduction/How FPGA works/fig_05.drawio.svg @@ -0,0 +1,4 @@ + + + +

v

A
B
S=A&B
A
B
S
0
0
0
0
1
0
1
0
0
1
1
1
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_06.drawio.svg b/.pic/Introduction/How FPGA works/fig_06.drawio.svg new file mode 100644 index 0000000..e76db74 --- /dev/null +++ b/.pic/Introduction/How FPGA works/fig_06.drawio.svg @@ -0,0 +1,4 @@ + + + +
6
a
b
c
d
e
f
sel
g
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_07.drawio.svg b/.pic/Introduction/How FPGA works/fig_07.drawio.svg new file mode 100644 index 0000000..b101b85 --- /dev/null +++ b/.pic/Introduction/How FPGA works/fig_07.drawio.svg @@ -0,0 +1,4 @@ + + + +
a
b
c
d
e
f
sel
6
sel[5]
sel[4]
sel[3]
sel[2]
sel[1]
sel[0]
g
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_08.drawio.svg b/.pic/Introduction/How FPGA works/fig_08.drawio.svg new file mode 100644 index 0000000..7f3756b --- /dev/null +++ b/.pic/Introduction/How FPGA works/fig_08.drawio.svg @@ -0,0 +1,4 @@ + + + +
a
b
c
d
e
f
sel
sel[5]=0
sel[4]=0
sel[3]=0
sel[2]=0
sel[1]=1
sel[0]=0
g
всегда 0
всегда 0
всегда 0
всегда 0
всегда 0
выход равен b
6
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_09.drawio.svg b/.pic/Introduction/How FPGA works/fig_09.drawio.svg new file mode 100644 index 0000000..48fa843 --- /dev/null +++ b/.pic/Introduction/How FPGA works/fig_09.drawio.svg @@ -0,0 +1,4 @@ + + + +
a
b
c
d
e
f
g
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_10.drawio.svg b/.pic/Introduction/How FPGA works/fig_10.drawio.svg new file mode 100644 index 0000000..3e2524b --- /dev/null +++ b/.pic/Introduction/How FPGA works/fig_10.drawio.svg @@ -0,0 +1,4 @@ + + + +
a
b
c
d
e
f
sel
sel[5]=0
sel[4]=0
sel[3]=0
sel[2]=0
sel[1]=1
sel[0]=0
g
всегда 0
всегда 0
всегда 0
всегда 0
всегда 0
выход равен b
6
выход равен b
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_11.drawio.svg b/.pic/Introduction/How FPGA works/fig_11.drawio.svg new file mode 100644 index 0000000..000b08a --- /dev/null +++ b/.pic/Introduction/How FPGA works/fig_11.drawio.svg @@ -0,0 +1,4 @@ + + + +
x
y
f
0
0
f00
0
1
f01
1
0
f10
1
1
f11
y
x
f
LUT
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_12.drawio.svg b/.pic/Introduction/How FPGA works/fig_12.drawio.svg new file mode 100644 index 0000000..97e07ac --- /dev/null +++ b/.pic/Introduction/How FPGA works/fig_12.drawio.svg @@ -0,0 +1,4 @@ + + + +
D-триггер
Ведомая D-защелка
RS-триггер
Ведущая D-защелка
RS-триггер
D
Q
Clk
E
E
S
R
S
R
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/FPGA_logic_cell.png b/.pic/Introduction/How FPGA works/fig_15.png similarity index 100% rename from .pic/Introduction/How FPGA works/FPGA_logic_cell.png rename to .pic/Introduction/How FPGA works/fig_15.png diff --git a/.pic/Labs/lab_01_adder/column_add_bin.drawio.png b/.pic/Labs/lab_01_adder/column_add_bin.drawio.png deleted file mode 100644 index a96bb2d..0000000 Binary files a/.pic/Labs/lab_01_adder/column_add_bin.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_01_adder/column_add_bin.drawio.svg b/.pic/Labs/lab_01_adder/column_add_bin.drawio.svg new file mode 100644 index 0000000..f8f2e28 --- /dev/null +++ b/.pic/Labs/lab_01_adder/column_add_bin.drawio.svg @@ -0,0 +1,4 @@ + + + +
 011
 101
1000
.. 
+
\ No newline at end of file diff --git a/.pic/Labs/lab_01_adder/column_add_bin_transparent.drawio.png b/.pic/Labs/lab_01_adder/column_add_bin_transparent.drawio.png deleted file mode 100644 index 8b13979..0000000 Binary files a/.pic/Labs/lab_01_adder/column_add_bin_transparent.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_01_adder/column_add_dec.drawio.png b/.pic/Labs/lab_01_adder/column_add_dec.drawio.png deleted file mode 100644 index 26ca608..0000000 Binary files a/.pic/Labs/lab_01_adder/column_add_dec.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_01_adder/column_add_dec.drawio.svg b/.pic/Labs/lab_01_adder/column_add_dec.drawio.svg new file mode 100644 index 0000000..f7abc00 --- /dev/null +++ b/.pic/Labs/lab_01_adder/column_add_dec.drawio.svg @@ -0,0 +1,4 @@ + + + +
042
079
121
.. 
+
\ No newline at end of file diff --git a/.pic/Labs/lab_01_adder/column_add_dec_transparent.drawio.png b/.pic/Labs/lab_01_adder/column_add_dec_transparent.drawio.png deleted file mode 100644 index 070eac6..0000000 Binary files a/.pic/Labs/lab_01_adder/column_add_dec_transparent.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_01_adder/fig_01.drawio.png b/.pic/Labs/lab_01_adder/fig_01.drawio.png deleted file mode 100644 index b91e3f9..0000000 Binary files a/.pic/Labs/lab_01_adder/fig_01.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_01_adder/fig_01.drawio.svg b/.pic/Labs/lab_01_adder/fig_01.drawio.svg new file mode 100644 index 0000000..6d6898c --- /dev/null +++ b/.pic/Labs/lab_01_adder/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + +
a_i
b_i
sum_o
carry_o
and
xor
\ No newline at end of file diff --git a/.pic/Labs/lab_01_adder/fig_01_transparent.drawio.png b/.pic/Labs/lab_01_adder/fig_01_transparent.drawio.png deleted file mode 100644 index 59d3a8f..0000000 Binary files a/.pic/Labs/lab_01_adder/fig_01_transparent.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_01_adder/fig_02.drawio.png b/.pic/Labs/lab_01_adder/fig_02.drawio.png deleted file mode 100644 index 4f29471..0000000 Binary files a/.pic/Labs/lab_01_adder/fig_02.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_01_adder/fig_02.drawio.svg b/.pic/Labs/lab_01_adder/fig_02.drawio.svg new file mode 100644 index 0000000..74aa0c2 --- /dev/null +++ b/.pic/Labs/lab_01_adder/fig_02.drawio.svg @@ -0,0 +1,4 @@ + + + +
a_i
carry_i
and
xor
sum_o
carry_o
b_i
xor
and
and
or
a&Cin
a&b
or
b&Cin
(a&b)|(a&Cin)
a^b
\ No newline at end of file diff --git a/.pic/Labs/lab_01_adder/fig_02_transparent.drawio.png b/.pic/Labs/lab_01_adder/fig_02_transparent.drawio.png deleted file mode 100644 index 1b5d874..0000000 Binary files a/.pic/Labs/lab_01_adder/fig_02_transparent.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_01_adder/fig_05.drawio.png b/.pic/Labs/lab_01_adder/fig_05.drawio.png deleted file mode 100644 index c8ea7f6..0000000 Binary files a/.pic/Labs/lab_01_adder/fig_05.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_01_adder/fig_05.drawio.svg b/.pic/Labs/lab_01_adder/fig_05.drawio.svg new file mode 100644 index 0000000..ba9c229 --- /dev/null +++ b/.pic/Labs/lab_01_adder/fig_05.drawio.svg @@ -0,0 +1,4 @@ + + + +
fulladder0
fulladder1
fulladder2
fulladder3
carry_i
b_i
a_i
s_o
carry_o
1
0
1
1
0
1
0
1
0
0
0
0
1
1
1
1
0
1011
0101
0000
+
1
. . .
s_o[0]
s_o[1]
s_o[2]
s_o[3]
b_i[0]
b_i[1]
b_i[2]
b_i[3]
a_i[1]
a_i[0]
a_i[2]
a_i[3]
\ No newline at end of file diff --git a/.pic/Labs/lab_01_adder/fig_05_transparent.drawio.png b/.pic/Labs/lab_01_adder/fig_05_transparent.drawio.png deleted file mode 100644 index 92d6dcc..0000000 Binary files a/.pic/Labs/lab_01_adder/fig_05_transparent.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_01_adder/fig_06_transparent.drawio.png b/.pic/Labs/lab_01_adder/fig_06_transparent.drawio.png deleted file mode 100644 index a16908d..0000000 Binary files a/.pic/Labs/lab_01_adder/fig_06_transparent.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_02_alu/fig_01.drawio.png b/.pic/Labs/lab_02_alu/fig_01.drawio.png deleted file mode 100644 index 7bc8a0d..0000000 Binary files a/.pic/Labs/lab_02_alu/fig_01.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_02_alu/fig_01.drawio.svg b/.pic/Labs/lab_02_alu/fig_01.drawio.svg new file mode 100644 index 0000000..5de4675 --- /dev/null +++ b/.pic/Labs/lab_02_alu/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + +
АЛУ
A
F
B
N
N
N
Y
3
\ No newline at end of file diff --git a/.pic/Labs/lab_02_alu/fig_02.drawio.png b/.pic/Labs/lab_02_alu/fig_02.drawio.png deleted file mode 100644 index 8e4e59a..0000000 Binary files a/.pic/Labs/lab_02_alu/fig_02.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_02_alu/fig_02.drawio.svg b/.pic/Labs/lab_02_alu/fig_02.drawio.svg new file mode 100644 index 0000000..fdaff3a --- /dev/null +++ b/.pic/Labs/lab_02_alu/fig_02.drawio.svg @@ -0,0 +1,4 @@ + + + +
        3                2                 1               0       
SN-1
Zero
extend
+
     1           0
S
A
F2
F1:0
B
N
N
N
N
N
N
N
N
2
N
Y
Carryout
Assets
F2:0
Функция
000
A И B
001
A ИЛИ B
010
A + B
011
не используется
100
A И B̅
101
A ИЛИ B̅
110
A - B
111
SLT
(A < B)
1
1
1
\ No newline at end of file diff --git a/.pic/Labs/lab_02_alu/fig_03.drawio.png b/.pic/Labs/lab_02_alu/fig_03.drawio.png deleted file mode 100644 index 5010a23..0000000 Binary files a/.pic/Labs/lab_02_alu/fig_03.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_02_alu/fig_03.drawio.svg b/.pic/Labs/lab_02_alu/fig_03.drawio.svg new file mode 100644 index 0000000..6a0dcbf --- /dev/null +++ b/.pic/Labs/lab_02_alu/fig_03.drawio.svg @@ -0,0 +1,4 @@ + + + +
        3                2                 1               0       
SN-1
Zero
extend
+
     1           0
S
A
F2
F1:0
B
N
N
N
N
N
N
N
N
2
N
Y
Carryout
Assets
F2:0
Функция
000
A И B
001
A ИЛИ B
010
A + B
011
не используется
100
A И B̅
101
A ИЛИ B̅
110
A - B
111
SLT
(A < B)
1
1
1
\ No newline at end of file diff --git a/.pic/Labs/lab_03_memory/fig_01.drawio.png b/.pic/Labs/lab_03_memory/fig_01.drawio.png deleted file mode 100644 index b900d6b..0000000 Binary files a/.pic/Labs/lab_03_memory/fig_01.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_03_memory/fig_01.drawio.svg b/.pic/Labs/lab_03_memory/fig_01.drawio.svg new file mode 100644 index 0000000..ec715f4 --- /dev/null +++ b/.pic/Labs/lab_03_memory/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + +
addr
read_data
M
N
ПЗУ
addr
read_data
M
N
ОЗУ
write_enable
write_data
clk
N
\ No newline at end of file diff --git a/.pic/Labs/lab_03_memory/fig_03.drawio.png b/.pic/Labs/lab_03_memory/fig_03.drawio.png deleted file mode 100644 index 7090b81..0000000 Binary files a/.pic/Labs/lab_03_memory/fig_03.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_03_memory/fig_03.drawio.svg b/.pic/Labs/lab_03_memory/fig_03.drawio.svg new file mode 100644 index 0000000..2bf54c5 --- /dev/null +++ b/.pic/Labs/lab_03_memory/fig_03.drawio.svg @@ -0,0 +1,4 @@ + + + +
mem
32'hdead_beaf
RD
ADDR
WE
WD

0
1
2

RD

clk_i

32
32
REQ
EN
32'hfa11_1eaf
32
32

clk_i

mem_req_i
write_data_i
write_enable_i
addr_i
read_data_o
тут будет логика управления мультиплексором
\ No newline at end of file diff --git a/.pic/Labs/lab_06_dp/fig_01.drawio.png b/.pic/Labs/lab_06_dp/fig_01.drawio.png deleted file mode 100644 index 2c31ae2..0000000 Binary files a/.pic/Labs/lab_06_dp/fig_01.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_06_dp/fig_01.drawio.svg b/.pic/Labs/lab_06_dp/fig_01.drawio.svg new file mode 100644 index 0000000..d3e2e97 --- /dev/null +++ b/.pic/Labs/lab_06_dp/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + +

Main
Decoder

flag

Register
File
imm_S
imm_U
4
0
RD1
RD2
gpr_we
WE

clk_i

wb_sel
 mem_size
mem_we
alu_op
b_sel
a_sel
jal
b
instr
RA1
RA2
WA
WD
[19:15]
[24:20]
[11:07]
[31:20]
[31:12], 12'h000
[31:25][11:7]
[31][19:12][20][30:21],1'b0
[31][7][30:25][11:8],1'b0
imm_J
imm_B
4
PC

clk_i

rst_i

imm_I

+
ALU
SE
SE
+
mem_wd_o
instr_i
mem_addr_o
instr_addr_o
mem_rd_i
mem_we_o
mem_size_o
instr_addr_o

instr_i

mem_addr_o

mem_we_o

mem_size_o

rst_i

clk_i

SE

0

1

0

1

0

1

1

0

flag

RD1

32
/

32
/

32
/

32
/

32
/

12
/

12
/

21
/

13
/

32
/

не подключен
SE
mem_req 

mem_req_o

imm_I

— входные сигналы
выходные сигналы
mem_req_o

imm_I

RD1

flag

провода, разорванные        для удобства                    отображения схемы
PC
PC

0
1
2
3
4

0
1
2

32
stall_i
stall_i

32
/

2
3
3
5
mem_wd_o
mem_rd_i
wb_data
wb_data
wb_data
32
PC
stall_i
{[31:1],1'b0}
не подключен
не подключен
не подключен
 mret
 illegal_instr
 csr_we
 csr_op
jalr
2
\ No newline at end of file diff --git a/.pic/Labs/lab_06_dp/fig_02.drawio.png b/.pic/Labs/lab_06_dp/fig_02.drawio.png deleted file mode 100644 index 872b971..0000000 Binary files a/.pic/Labs/lab_06_dp/fig_02.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_06_dp/fig_02.drawio.svg b/.pic/Labs/lab_06_dp/fig_02.drawio.svg new file mode 100644 index 0000000..2810694 --- /dev/null +++ b/.pic/Labs/lab_06_dp/fig_02.drawio.svg @@ -0,0 +1,4 @@ + + + +
Core

rst_i
mem_rd_i
clk_i
Instruction
Memory
A
RD

32
/

instr_i
mem_size_o

/

32

rst_i

instr_addr
instr
clk_i

rst_i

- входные сигналы
mem_we_o
mem_req_o
mem_wd_o
mem_addr_o
instr_addr_o
не подключен
3
stall_i
stall
clk_i
Data
Memory
A
WE
RD

32
/

clk_i
req
WD
32
32

rst_i

\ No newline at end of file diff --git a/.pic/Labs/lab_08_lsu/fig_01.drawio.png b/.pic/Labs/lab_08_lsu/fig_01.drawio.png deleted file mode 100644 index 8da5b42..0000000 Binary files a/.pic/Labs/lab_08_lsu/fig_01.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_08_lsu/fig_01.drawio.svg b/.pic/Labs/lab_08_lsu/fig_01.drawio.svg new file mode 100644 index 0000000..2af4e1b --- /dev/null +++ b/.pic/Labs/lab_08_lsu/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + +
LOAD/
STORE
UNIT
Core

rst_i
mem_rd_i
clk_i
Instruction
Memory
A
RD

32
/

instr_i
mem_size_o

/

32

instr_addr
instr
clk_i

rst_i

- входные сигналы
mem_we_o
mem_req_o
mem_wd_o
mem_addr_o
instr_addr_o
3
stall_i
32
32
Data
Memory
A
WE
RD
clk_i
req
WD
core_req_i
core_we_i
core_size_i
core_wd_i
core_addr_i
core_stall_o
core_rd_o
BE
mem_wd_o
32
mem_be_o
mem_we_o
mem_req_o
mem_ready_i
clk_i
mem_addr_o
mem_rd_i
READY

rst_i

4
32
32
32
rst_i

rst_i

\ No newline at end of file diff --git a/.pic/Labs/lab_08_lsu/fig_03.drawio.png b/.pic/Labs/lab_08_lsu/fig_03.drawio.png deleted file mode 100644 index 4931d74..0000000 Binary files a/.pic/Labs/lab_08_lsu/fig_03.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_08_lsu/fig_03.drawio.svg b/.pic/Labs/lab_08_lsu/fig_03.drawio.svg new file mode 100644 index 0000000..c5e2545 --- /dev/null +++ b/.pic/Labs/lab_08_lsu/fig_03.drawio.svg @@ -0,0 +1,4 @@ + + + +
core_req_i
core_we_i
core_size_i
core_wd_i
core_addr_i
core_rd_o
mem_rd_i
mem_rd_i[7:0]
mem_rd_i[15:8]
mem_rd_i[23:16]
mem_rd_i[31:24]
SE
SE
SE
SE
ZE
ZE
ZE
ZE
SE
SE
ZE
ZE
mem_rd_i[15:0]
mem_rd_i[31:16]
half_offset
half_offset
2'b00
2'b01
2'b10
2'b11
2'b00
2'b01
2'b10
2'b11
1'b0
1'b1
1'b0
1'b1
LDST_W
LDST_B
LDST_BU
LDST_H
LDST_HU
LDST_H
LDST_W
LDST_B
<<
4'b0001
4'b1111
4'b0011
4'b1100
byte_offet
0
1
byte_offset
LDST_W
LDST_H
LDST_B
{{2{core_wd_i[15:0]}}}
{{4{core_wd_i[7:0]}}}
core_wd_i
stall

clk_i

rst_i

mem_ready_i
mem_we_o
mem_req_o
core_stall_o
mem_wd_o
mem_addr_o
mem_be_o
byte_offet = core_addr_i[1:0]
half_offet = core_addr_i[1]
SE
— знаковое расширение
ZE
— расширение нулями
\ No newline at end of file diff --git a/.pic/Labs/lab_10_irq/fig_03.drawio.png b/.pic/Labs/lab_10_irq/fig_03.drawio.png deleted file mode 100644 index 781d995..0000000 Binary files a/.pic/Labs/lab_10_irq/fig_03.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_10_irq/fig_03.drawio.svg b/.pic/Labs/lab_10_irq/fig_03.drawio.svg new file mode 100644 index 0000000..0116964 --- /dev/null +++ b/.pic/Labs/lab_10_irq/fig_03.drawio.svg @@ -0,0 +1,4 @@ + + + +

Main
Decoder

flag

Register
File
imm_S
imm_U
4
0
RD1
RD2
gpr_we
WE

clk_i

wb_sel
 mem_size
mem_we
alu_op
b_sel
a_sel
jal
b
instr
RA1
RA2
WA
WD
[19:15]
[24:20]
[11:07]
[31:20]
[31:12], 12'h000
[31:25][11:7]
[31][19:12][20][30:21],1'b0
[31][7][30:25][11:8],1'b0
imm_J
imm_B
4
PC

clk_i

rst_i

jalr
ALU
SE
SE
+
mem_wd_o
instr_i
mem_addr_o
instr_addr_o
mem_rd_i
mem_we_o
mem_size_o
instr_addr_o

instr_i

mem_addr_o

mem_we_o

mem_size_o

rst_i

clk_i

SE

0

1

0

1

flag

32
/

32
/

32
/

32
/

32
/

12
/

12
/

21
/

13
/

32
/

mret
SE
mem_req 

mem_req_o

imm_I

— входные сигналы
выходные сигналы
mem_req_o

imm_I

RD1

flag

провода, разорванные        для удобства                    отображения схемы
PC

0
1
2
3
4

0
1
2

32
stall_i
stall_i

32
/

2
3
3
5
mem_wd_o
mem_rd_i
wb_data
wb_data
wb_data
32
PC
2
0
2
1
csr_wd
 illegal_instr
CONTROL
STATUS
REGISTERS
WE

clk_i

addr
pc
mcause
rs1_data
rst
imm_data
trap
opcode
read_data
mie
mepc
mtvec
csr_we
csr_op
3
irq
trap
rst_i
csr_wd
mie
RD1
PC
[19:15]
ZE

5
/

32
/

imm_Z

imm_Z

instr_i[31:20]

mret
IRQ
CONTROLLER
exception_i

clk_i

irq_req_i
mie_i
rst_i
irq_cause_o
irq_ret_o
rst_i
trap
mret
irq
irq_ret_o
irq_req_i
mie[0]

imm_Z

csr_wd
irq
trap
mret
mie
irq_req_i
irq_ret_o
jalr
PC
jalr
32
32
32
32
12
32
32
32
32

1

0

stall_i
trap
trap
trap
ill_instr

0

1

ill_instr
32
32
irq
ill_instr
ill_instr
mret_i
irq_o
32'h0000_0002

imm_I

+
RD1
jalr
{[31:1],1'b0}

1

0

1

0

trap
trap
en
rst
\ No newline at end of file diff --git a/.pic/Labs/lab_10_irq/fig_04.drawio.png b/.pic/Labs/lab_10_irq/fig_04.drawio.png deleted file mode 100644 index c837bca..0000000 Binary files a/.pic/Labs/lab_10_irq/fig_04.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_10_irq/fig_04.drawio.svg b/.pic/Labs/lab_10_irq/fig_04.drawio.svg new file mode 100644 index 0000000..0c19a48 --- /dev/null +++ b/.pic/Labs/lab_10_irq/fig_04.drawio.svg @@ -0,0 +1,4 @@ + + + +
001
010
011
101
110
0x304
rs1_data_i
opcode_i
addr_i
write_enable_i
111

clk_i

rst_i
en

clk_i

rst_i
en

clk_i

rst_i
en

clk_i

rst_i
en

clk_i

rst_i
en
0x305
0x340
0x341
0x342
1
0

pc_i

mcause_i
1
0
imm_data_i
0x304
0x305
0x340
0x341
0x342
trap_i
mepc_o
mtvec_o
mie_o
read_data_o
\ No newline at end of file diff --git a/.pic/Labs/lab_10_irq/fig_05.drawio.png b/.pic/Labs/lab_10_irq/fig_05.drawio.png deleted file mode 100644 index 40b67f0..0000000 Binary files a/.pic/Labs/lab_10_irq/fig_05.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_10_irq/fig_05.drawio.svg b/.pic/Labs/lab_10_irq/fig_05.drawio.svg new file mode 100644 index 0000000..fd13990 --- /dev/null +++ b/.pic/Labs/lab_10_irq/fig_05.drawio.svg @@ -0,0 +1,4 @@ + + + +
irq_h
D
Q
RST
exc_h
D
Q
RST
reset
set
reset
set
mret_i
irq_req_i
mie_i
exception_i
irq_o
irq_ret_o
irq_cause_o
32'h1000_0010
clk_i
rst_i
clk_i
rst_i
\ No newline at end of file diff --git a/.pic/Labs/lab_11_irq_integration/fig_01.drawio.png b/.pic/Labs/lab_11_irq_integration/fig_01.drawio.png deleted file mode 100644 index 7ce3ba2..0000000 Binary files a/.pic/Labs/lab_11_irq_integration/fig_01.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_11_irq_integration/fig_01.drawio.svg b/.pic/Labs/lab_11_irq_integration/fig_01.drawio.svg new file mode 100644 index 0000000..f8b9483 --- /dev/null +++ b/.pic/Labs/lab_11_irq_integration/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + +

Main
Decoder

flag

Register
File
imm_S
imm_U
4
0
RD1
RD2
gpr_we
WE

clk_i

wb_sel
 mem_size
mem_we
alu_op
b_sel
a_sel
jal
b
instr
RA1
RA2
WA
WD
[19:15]
[24:20]
[11:07]
[31:20]
[31:12], 12'h000
[31:25][11:7]
[31][19:12][20][30:21],1'b0
[31][7][30:25][11:8],1'b0
imm_J
imm_B
4
PC

clk_i

rst_i

jalr
ALU
SE
SE
+
mem_wd_o
instr_i
mem_addr_o
instr_addr_o
mem_rd_i
mem_we_o
mem_size_o
instr_addr_o

instr_i

mem_addr_o

mem_we_o

mem_size_o

rst_i

clk_i

SE

0

1

0

1

flag

32
/

32
/

32
/

32
/

32
/

12
/

12
/

21
/

13
/

32
/

mret
SE
mem_req 

mem_req_o

imm_I

— входные сигналы
выходные сигналы
mem_req_o

imm_I

RD1

flag

провода, разорванные        для удобства                    отображения схемы
PC

0
1
2
3
4

0
1
2

32
stall_i
stall_i

32
/

2
3
3
5
mem_wd_o
mem_rd_i
wb_data
wb_data
wb_data
32
PC
2
0
2
1
csr_wd
 illegal_instr
CONTROL
STATUS
REGISTERS
WE

clk_i

addr
pc
mcause
rs1_data
rst
imm_data
trap
opcode
read_data
mie
mepc
mtvec
csr_we
csr_op
3
irq
trap
rst_i
csr_wd
mie
RD1
PC
[19:15]
ZE

5
/

32
/

imm_Z

imm_Z

instr_i[31:20]

mret
IRQ
CONTROLLER
exception_i

clk_i

irq_req_i
mie_i
rst_i
irq_cause_o
irq_ret_o
rst_i
trap
mret
irq
irq_ret_o
irq_req_i
mie[0]

imm_Z

csr_wd
irq
trap
mret
mie
irq_req_i
irq_ret_o
jalr
PC
jalr
32
32
32
32
12
32
32
32
32

1

0

stall_i
trap
trap
trap
ill_instr

0

1

ill_instr
32
32
irq
ill_instr
ill_instr
mret_i
irq_o
32'h0000_0002

imm_I

+
RD1
jalr
{[31:1],1'b0}

1

0

1

0

trap
trap
en
rst
\ No newline at end of file diff --git a/.pic/Labs/lab_12_periph/fig_01.drawio.png b/.pic/Labs/lab_12_periph/fig_01.drawio.png deleted file mode 100644 index 01fc77f..0000000 Binary files a/.pic/Labs/lab_12_periph/fig_01.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_12_periph/fig_01.drawio.svg b/.pic/Labs/lab_12_periph/fig_01.drawio.svg new file mode 100644 index 0000000..85dde01 --- /dev/null +++ b/.pic/Labs/lab_12_periph/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + +
clk_i

rst_i

входные сигналы
255
req
внутренний сигнал, оборванный для улучшения читаемости схемы
LOAD/
STORE
UNIT
Core

rst_i
mem_rd_i
clk_i
Instruction
Memory
A
RD

32
/

instr_i
mem_size_o

/

32

instr_addr
instr
mem_we_o
mem_req_o
mem_wd_o
mem_addr_o
instr_addr_o
3
stall_i
32
32
core_req_i
core_we_i
core_size_i
core_wd_i
core_addr_i
core_stall_o
core_rd_o
mem_wd_o
32
mem_be_o
mem_we_o
mem_req_o
mem_ready_i
clk_i
mem_addr_o
mem_rd_i

rst_i

4
32
32
32
Data
Memory
A
WE
RD
clk_i
req
WD
BE

8
/

out [0]
req
[31:24]
{8'd0,[23:0]}
Periph
Device
1
A
WE
RD
clk_i
req
WD
out [1]
req
Periph
Device
255
A
WE
RD
clk_i
req
WD
out [255]
req
req
OneHot Encoder
in
out

256
/

0
1
32
32
32
32
1'b1
rst_i

rst_i

rst_i

rst_i

rst_i

rst_i

\ No newline at end of file diff --git a/.pic/Introduction/About FPGA/EP2.jpg b/.pic/Other/About FPGA/EP2.jpg similarity index 100% rename from .pic/Introduction/About FPGA/EP2.jpg rename to .pic/Other/About FPGA/EP2.jpg diff --git a/.pic/Introduction/About FPGA/TinyFPGA.jpg b/.pic/Other/About FPGA/TinyFPGA.jpg similarity index 100% rename from .pic/Introduction/About FPGA/TinyFPGA.jpg rename to .pic/Other/About FPGA/TinyFPGA.jpg diff --git a/.pic/Introduction/About FPGA/beatles.jpg b/.pic/Other/About FPGA/beatles.jpg similarity index 100% rename from .pic/Introduction/About FPGA/beatles.jpg rename to .pic/Other/About FPGA/beatles.jpg diff --git a/.pic/Introduction/About FPGA/cyclone4.jpg b/.pic/Other/About FPGA/cyclone4.jpg similarity index 100% rename from .pic/Introduction/About FPGA/cyclone4.jpg rename to .pic/Other/About FPGA/cyclone4.jpg diff --git a/.pic/Introduction/About FPGA/ice.jpg b/.pic/Other/About FPGA/ice.jpg similarity index 100% rename from .pic/Introduction/About FPGA/ice.jpg rename to .pic/Other/About FPGA/ice.jpg diff --git a/Basic Verilog structures/Concatenation.md b/Basic Verilog structures/Concatenation.md index 20003e9..8e67025 100644 --- a/Basic Verilog structures/Concatenation.md +++ b/Basic Verilog structures/Concatenation.md @@ -6,7 +6,7 @@ Предположим, у нас есть следующий набор сигналов: -![../.pic/Basic%20Verilog%20structures/concatenation/fig_01.drawio.png](../.pic/Basic%20Verilog%20structures/concatenation/fig_01.drawio.png) +![../.pic/Basic%20Verilog%20structures/concatenation/fig_01.drawio.svg](../.pic/Basic%20Verilog%20structures/concatenation/fig_01.drawio.svg) ```SystemVerilog @@ -25,7 +25,7 @@ logic [5:0] e; - на его следующие 2 бита подавались биты `[4:3]` сигнала `c` - на младшие 2 бита подавался сигнал `d` -![../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.png](../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.png) +![../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.svg](../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.svg) Это можно сделать путем 4 непрерывных присваиваний: @@ -58,7 +58,7 @@ assign e = {a, b, c[4:3], d}; Кроме того, возможна и обратная ситуация. Предположим, мы хотим подать отдельные биты сигнала `e` на различные провода: -![../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.png](../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.png) +![../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.svg](../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.svg) ```SystemVerilog logic a; @@ -105,4 +105,3 @@ logic [7:0] e; assign e = { {3{c[4:3]}}, a, b}; ``` - diff --git a/Basic Verilog structures/Controllers.md b/Basic Verilog structures/Controllers.md index ea2d299..77d1b47 100644 --- a/Basic Verilog structures/Controllers.md +++ b/Basic Verilog structures/Controllers.md @@ -86,19 +86,19 @@ endmodule Для начала, добавим на структурную схему входы и выходы модуля: -![../.pic/Basic%20Verilog%20structures/controllers/fig_01.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_01.drawio.png) +![../.pic/Basic%20Verilog%20structures/controllers/fig_01.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_01.drawio.svg) В первую очередь, спецификация вводит понятия **запрос на чтение** и **запрос на запись**. Создадим вспомогательные провода, которые будут сигнализировать о том, что произошел **запрос на чтение** или **запрос на запись**: -![../.pic/Basic%20Verilog%20structures/controllers/fig_02.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_02.drawio.png) +![../.pic/Basic%20Verilog%20structures/controllers/fig_02.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_02.drawio.svg) Далее, спецификация накладывает ограничение на допустимые адреса и значения. Поэтому создадим вспомогательные сигналы, сигнализирующие о том, что текущий адрес соответствует одному из регистров контроллера, а данные для записи соответствуют диапазону допустимых значений этих регистров: -![../.pic/Basic%20Verilog%20structures/controllers/fig_03.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_03.drawio.png) +![../.pic/Basic%20Verilog%20structures/controllers/fig_03.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_03.drawio.svg) Теперь, когда подготовительные работы выполнены, начнем с реализации сброса этого контроллера. Сброс может произойти в двух случаях: когда `rst_i == 1` либо же в случае **запроса на запись** единицы по адресу `0x24`. Создадим вспомогательный провод `rst`, который будет равен единице в случае, если произойдет любое из этих событий. Этот сигнал будет сбрасывать все созданные в данном модуле регистры. -![../.pic/Basic%20Verilog%20structures/controllers/fig_04.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_04.drawio.png) +![../.pic/Basic%20Verilog%20structures/controllers/fig_04.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_04.drawio.svg) Продолжим описание контроллера, создав первый из **архитектурных регистров** — `led_val`. Запись в этот регистр возможна только в случае выполнения трех условий: @@ -108,7 +108,7 @@ endmodule Создадим вспомогательный сигнал `val_en`, который будет равен единице только в случае выполнения этих трех условий: -![../.pic/Basic%20Verilog%20structures/controllers/fig_05.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_05.drawio.png) +![../.pic/Basic%20Verilog%20structures/controllers/fig_05.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_05.drawio.svg) Теперь реализация регистра `lev_val` становится совершенно тривиальной задачей, ведь у нас есть: @@ -116,11 +116,11 @@ endmodule * сигнал разрешения записи в регистр `val_en`; * сигнал данных для записи в регистр `write_data_i`(из которого мы будем брать только младшие 16 бит данных). -![../.pic/Basic%20Verilog%20structures/controllers/fig_06.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_06.drawio.png) +![../.pic/Basic%20Verilog%20structures/controllers/fig_06.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_06.drawio.svg) Аналогичным образом реализуем еще один **архитектурный регистр** `led_mode`: -![../.pic/Basic%20Verilog%20structures/controllers/fig_07.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_07.drawio.png) +![../.pic/Basic%20Verilog%20structures/controllers/fig_07.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_07.drawio.svg) Два этих регистра должны управлять поведением выходного сигнала `led_o` следующим образом: @@ -140,7 +140,7 @@ endmodule * счетчик досчитал до 20 миллионов (`cntr >= 32'd20_000_000`); * в остальных ситуациях, счетчик инкрементирует свое значение. -![../.pic/Basic%20Verilog%20structures/controllers/fig_08.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_08.drawio.png) +![../.pic/Basic%20Verilog%20structures/controllers/fig_08.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_08.drawio.svg) Последним этапом описания контроллера будет добавление логики управления выходным сигналом `read_data_o`. @@ -154,4 +154,4 @@ endmodule Таким образом, итоговая схема примет вид: -![../.pic/Basic%20Verilog%20structures/controllers/fig_09.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_09.drawio.png) +![../.pic/Basic%20Verilog%20structures/controllers/fig_09.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_09.drawio.svg) diff --git a/Basic Verilog structures/Modules.md b/Basic Verilog structures/Modules.md index 1e5b0aa..38314b2 100644 --- a/Basic Verilog structures/Modules.md +++ b/Basic Verilog structures/Modules.md @@ -10,7 +10,7 @@ Определим наш модуль: -![../.pic/Basic%20Verilog%20structures/modules/fig_01.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_01.drawio.png) +![../.pic/Basic%20Verilog%20structures/modules/fig_01.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_01.drawio.svg) ```SystemVerilog module @@ -21,7 +21,7 @@ endmodule У всякого модуля должно быть название. Назовём его `box`. В круглых скобках пишутся имена портов, их направление и типы. Если модуль не имеет ни входов, ни выходов, внутри скобок ничего не пишется. После них всегда ставится точка с запятой. -![../.pic/Basic%20Verilog%20structures/modules/fig_02.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_02.drawio.png) +![../.pic/Basic%20Verilog%20structures/modules/fig_02.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_02.drawio.svg) ```SystemVerilog module box(); @@ -32,7 +32,7 @@ endmodule Модуль без входов и выходов (портов) — это просто коробка, которая никак не взаимодействует с внешним миром. Подключим к нему два входных сигнала `a, b` и один выходной `q`. Для объявления портов, необходимо указать направление порта (вход это или выход), и тип используемого сигнала. В рамках данного курса лабораторных работ в качестве типа и входов и выходов будет использоваться тип `logic`, о котором будет рассказано чуть позже. -![../.pic/Basic%20Verilog%20structures/modules/fig_03.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_03.drawio.png) +![../.pic/Basic%20Verilog%20structures/modules/fig_03.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_03.drawio.svg) ```SystemVerilog module box( @@ -47,7 +47,7 @@ endmodule Внутри модуля могут быть объявления сигналов, параметров, констант и т.п., о которых другой модуль не узнает. Объявим внутри модуля `box` провод `c`. -![../.pic/Basic%20Verilog%20structures/modules/fig_04.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_04.drawio.png) +![../.pic/Basic%20Verilog%20structures/modules/fig_04.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_04.drawio.svg) ```SystemVerilog module box( @@ -66,7 +66,7 @@ endmodule Подключим провод `c` ко входу `a`. Для этого используется конструкция `assign c = a;`. Такая конструкция называется **непрерывным присваиванием**. Если очень сильно упростить, то непрерывное присваивание схоже со спайкой двух проводов. После подобного присваивания, провод `c` всегда будет иметь то же значение, что и `a` — как только входной сигнал `a` изменит свое значение, внутренний провод `c` также изменит свое значение (проводу `c` будет **непрерывно присваиваться** значение входа `a`). -![../.pic/Basic%20Verilog%20structures/modules/fig_05.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_05.drawio.png) +![../.pic/Basic%20Verilog%20structures/modules/fig_05.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_05.drawio.svg) ```SystemVerilog module box( @@ -91,7 +91,7 @@ endmodule К примеру, мы можем присвоить проводу `с` значение выхода логического вентиля. Пусть нам нужно, чтобы к сигналу `c` был подключен результат операции `a ИЛИ b`. -![../.pic/Basic%20Verilog%20structures/modules/fig_06.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_06.drawio.png) +![../.pic/Basic%20Verilog%20structures/modules/fig_06.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_06.drawio.svg) Такую схему можно реализовать следующим описанием: @@ -112,7 +112,7 @@ endmodule Пусть в схеме имеется ещё один логический вентиль - Исключающее ИЛИ. На него подаётся результат операции `a ИЛИ b`, то есть `c`, а также входной сигнал `b`. Результат операции `c ИСКЛЮЧАЮЩЕЕ ИЛИ b` подаётся на выход `q` нашего модуля. -![../.pic/Basic%20Verilog%20structures/modules/fig_07.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_07.drawio.png) +![../.pic/Basic%20Verilog%20structures/modules/fig_07.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_07.drawio.svg) ```SystemVerilog module box( @@ -182,7 +182,7 @@ endmodule Допустим, у нас есть модуль `inv`, который подает на выход инверсию входа, и мы хотим реализовать модуль `top`, который хочет использовать функционал модуля `inv` следующим образом: -![../.pic/Basic%20Verilog%20structures/modules/fig_08.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_08.drawio.png) +![../.pic/Basic%20Verilog%20structures/modules/fig_08.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_08.drawio.svg) Опишем `inv`: @@ -223,7 +223,7 @@ endmodule Мы можем подключить сколько угодно экземпляров одного модуля, поэтому у каждого из экземпляра должно быть свое уникальное имя. Пусть `c` подаётся на логический вентиль И вместе со входом `b`. Результат операции И тоже пойдет на инвертор, а затем на выход `q` модуля top. -![../.pic/Basic%20Verilog%20structures/modules/fig_09.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_09.drawio.png) +![../.pic/Basic%20Verilog%20structures/modules/fig_09.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_09.drawio.svg) Тогда в нашем описании добавится подключение второго модуля `inv` и провод `c`. @@ -293,4 +293,4 @@ ___ Обратите внимание, что вход `a` модуля `top` является двухразрядным: нулевой его бит идет на вход `a` модуля `or`, первый бит идет на вход `b` модуля `or`. -![../.pic/Basic%20Verilog%20structures/modules/fig_10.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_10.drawio.png) +![../.pic/Basic%20Verilog%20structures/modules/fig_10.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_10.drawio.svg) diff --git a/Basic Verilog structures/Multiplexors.md b/Basic Verilog structures/Multiplexors.md index 0975bfa..7da124f 100644 --- a/Basic Verilog structures/Multiplexors.md +++ b/Basic Verilog structures/Multiplexors.md @@ -4,11 +4,11 @@ Иными словами, мультиплексор — это переключатель (коммутатор), соединяющий выход с одним из множества входов. -![../.pic/Basic%20Verilog%20structures/multiplexor/fig_01.drawio.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_01.drawio.png) +![../.pic/Basic%20Verilog%20structures/multiplexor/fig_01.drawio.svg](../.pic/Basic%20Verilog%20structures/multiplexors/fig_01.drawio.svg) Для начала создадим простой двухвходовой мультиплексор. Предположим, на `Y` нам необходимо передать один из сигналов — `D0` или `D1` в зависимости от значения управляющего сигнала `S`: когда `S==0`, на `Y` подается сигнал `D0`, в противном случае — `D1`. -![../.pic/Basic%20Verilog%20structures/multiplexors/fig_02.drawio.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_02.drawio.png) +![../.pic/Basic%20Verilog%20structures/multiplexors/fig_02.drawio.svg](../.pic/Basic%20Verilog%20structures/multiplexors/fig_02.drawio.svg) На языке SystemVerilog это можно описать несколькими способами. Первый — с помощью **[тернарного условного оператора](https://ru.wikipedia.org/wiki/Тернарная_условная_операция)**: @@ -49,7 +49,7 @@ assign Y = S==1 ? D1 : D0; Данное выражение говорит нам, что если `S==1`, то `Y` присваивается значение `D1`, в противном случае — значение `D0`. -![../.pic/Basic%20Verilog%20structures/multiplexors/fig_03.drawio.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_03.drawio.png) +![../.pic/Basic%20Verilog%20structures/multiplexors/fig_03.drawio.svg](../.pic/Basic%20Verilog%20structures/multiplexors/fig_03.drawio.svg) Также мультиплексор можно описать через конструкцию `if-else` в блоке `always`. @@ -137,7 +137,7 @@ end // (так же как каждый begin должен ок Рассмотрим вариант посложнее и опишем следующую схему: -![../.pic/Basic%20Verilog%20structures/multiplexors/fig_04.drawio.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_04.drawio.png) +![../.pic/Basic%20Verilog%20structures/multiplexors/fig_04.drawio.svg](../.pic/Basic%20Verilog%20structures/multiplexors/fig_04.drawio.svg) Здесь уже используется мультиплексор 4в1. Управляющий сигнал `S` в данном случае двухбитный. В блоке `case` мы перечисляем всевозможные варианты значений `S` и описываем выход мультиплексора. @@ -269,4 +269,4 @@ endmodule Как, по-вашему, описать на языке SystemVerilog схему, приведённую ниже? -![../.pic/Basic%20Verilog%20structures/multiplexors/fig_04.drawio.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_04.drawio.png) +![../.pic/Basic%20Verilog%20structures/multiplexors/fig_04.drawio.svg](../.pic/Basic%20Verilog%20structures/multiplexors/fig_04.drawio.svg) diff --git a/Basic Verilog structures/Registers.md b/Basic Verilog structures/Registers.md index 04340ba..9d45f86 100644 --- a/Basic Verilog structures/Registers.md +++ b/Basic Verilog structures/Registers.md @@ -6,7 +6,7 @@ logic reg_name; ``` -![../.pic/Basic%20Verilog%20structures/registers/fig_01.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_01.drawio.png) +![../.pic/Basic%20Verilog%20structures/registers/fig_01.drawio.svg](../.pic/Basic%20Verilog%20structures/registers/fig_01.drawio.svg) У регистра может быть несколько входов и один выход. Основных входов, без которых не может существовать регистр два: вход данных и вход тактирующего синхроимпульса. На рисунке они обозначены как `D` и `clk`. Опциональный вход сигнала сброса (`rst`) позволяет обнулять содержимое регистра вне зависимости от входных данных и может работать как с тактовым синхроимпульсом (синхронный сброс), так и без него (асинхронный сброс). @@ -18,11 +18,11 @@ logic reg_name; Поскольку все сигналы в цифровой схеме передаются по цепям, удобно представлять, что к выходу регистра всегда неявно подключен провод, с именем, совпадающим с именем регистра, поэтому вы можете использовать имя регистра в дальнейшей цифровой логике: -![../.pic/Basic%20Verilog%20structures/registers/fig_02.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_02.drawio.png) +![../.pic/Basic%20Verilog%20structures/registers/fig_02.drawio.svg](../.pic/Basic%20Verilog%20structures/registers/fig_02.drawio.svg) Итак, мы добавили регистр на холст схемы, но как соединить его с какой-то логикой? Предположим, у нас есть сигнал тактового синхроимпульса и данные, которые мы хотим записать: -![../.pic/Basic%20Verilog%20structures/registers/fig_03.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_03.drawio.png) +![../.pic/Basic%20Verilog%20structures/registers/fig_03.drawio.svg](../.pic/Basic%20Verilog%20structures/registers/fig_03.drawio.svg) Данной схеме соответствует код: @@ -40,7 +40,7 @@ modulе rеg_ехаmрlе( Очевидно, мы хотим подключить сигнал `clk` ко входу тактирующего сигнала регистра, вход `data` ко входу данных, а выход регистра к выходу `reg_data`: -![../.pic/Basic%20Verilog%20structures/registers/fig_04.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_04.drawio.png) +![../.pic/Basic%20Verilog%20structures/registers/fig_04.drawio.svg](../.pic/Basic%20Verilog%20structures/registers/fig_04.drawio.svg) Запись в регистр возможна только по фронту тактирующего синхроимпульса. **Фронт** — это переход сигнала из нуля в единицу (**положительный фронт**), либо из единицы в ноль (**отрицательный фронт**). @@ -116,7 +116,7 @@ modulе rеg_ехаmрlе( Итоговая схема регистра со сбросом и сигналом разрешения записи: -![../.pic/Basic%20Verilog%20structures/registers/fig_05.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_05.drawio.png) +![../.pic/Basic%20Verilog%20structures/registers/fig_05.drawio.svg](../.pic/Basic%20Verilog%20structures/registers/fig_05.drawio.svg) Помимо прочего есть еще одно важное правило, которое необходимо знать при описании регистра: @@ -126,7 +126,7 @@ modulе rеg_ехаmрlе( В блоке присваивания регистру можно описывать и комбинационную логику, стоящую перед ним, например схему: -![../.pic/Basic%20Verilog%20structures/registers/fig_06.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_06.drawio.png) +![../.pic/Basic%20Verilog%20structures/registers/fig_06.drawio.svg](../.pic/Basic%20Verilog%20structures/registers/fig_06.drawio.svg) можно описать как @@ -214,4 +214,4 @@ modulе rеg_ехаmрlе( Как, по-вашему, описать на языке SystemVerilog схему, приведённую ниже? -![../.pic/Basic%20Verilog%20structures/registers/fig_07.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_07.drawio.png) +![../.pic/Basic%20Verilog%20structures/registers/fig_07.drawio.svg](../.pic/Basic%20Verilog%20structures/registers/fig_07.drawio.svg) diff --git a/Introduction/How FPGA works.md b/Introduction/How FPGA works.md index a0e516c..284a623 100644 --- a/Introduction/How FPGA works.md +++ b/Introduction/How FPGA works.md @@ -43,25 +43,25 @@ Логический вентиль **И** принимает два входа и выдает на выход значение `1` только в том случае, если оба входа равны `1`. Если хотя бы один из входов `0`, то на выходе будет `0`. На схемах, логический вентиль **И** отображается следующим образом: -../.pic/Introduction/How%20FPGA%20works/FPGA_ang_gate.png +![../.pic/Introduction/How%20FPGA%20works/fig_01.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_01.drawio.svg) _Рисунок 1. Обозначение логического вентиля **И**._ Логический вентиль **ИЛИ** принимает два входа и выдает на выход значение `1` в случае, если хотя бы один из входов равен `1`. Если оба входа равны `0`, то на выходе будет `0`. На схемах, логический вентиль **ИЛИ** отображается следующим образом: -../.pic/Introduction/How%20FPGA%20works/FPGA_or_gate.png +![../.pic/Introduction/How%20FPGA%20works/fig_02.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_02.drawio.svg) _Рисунок 2. Обозначение логического вентиля **ИЛИ**._ Логический вентиль **Исключающее ИЛИ** принимает два входа и выдает на выход значение `1` в случае, если значения входов не равны между собой (один из них равен `1`, а другой `0`). Если значения входов равны между собой (оба равны `0` или оба равны `1`), то на выходе будет `0`. На схемах, логический вентиль **Исключающее ИЛИ** отображается следующим образом: -../.pic/Introduction/How%20FPGA%20works/FPGA_xor_gate.png +![../.pic/Introduction/How%20FPGA%20works/fig_03.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_03.drawio.svg) _Рисунок 3. Обозначение логического вентиля **Исключающее ИЛИ**._ Логический вентиль **НЕ** — самый простой. Он принимает один вход и подает на выход его инверсию. Если на вход пришло значение `0`, то на выходе будет `1`, если на вход пришло значение `1`, то на выходе будет `0`. Он обозначается на схемах следующим образом: -../.pic/Introduction/How%20FPGA%20works/FPGA_not_gate.png +![../.pic/Introduction/How%20FPGA%20works/fig_04.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_04.drawio.svg) _Рисунок 4. Обозначение логического вентиля **НЕ**._ @@ -71,7 +71,7 @@ _Рисунок 4. Обозначение логического вентиля На приведенном ниже рисунке показан способ построения логического вентиля **И** на базе двух транзисторов. Подача значения `1` на вход **А** или **B** "открывает" соответствующий транзистор. Если оба транзистора открыты, на выход идет **напряжение питания** (`1` в контексте **цифровых значений**). В случае, если хотя бы на одном входе **А** или **B** будет значение `0`, соответствующий транзистор будет закрыт (можно считать, что он превратится в разрыв цепи). В этом случае выход будет подключен к **земле** (`0` в контексте цифровых значений). Как вы видите, напряжение на выход подается от **источников постоянного питания** или **земли**, а не от входов вентиля, именно этим и обеспечивается постоянное обновление напряжения и устойчивость **цифровых схем** к помехам. -../.pic/Introduction/How%20FPGA%20works/FPGA_and_gate_transistor.drawio.png +![../.pic/Introduction/How%20FPGA%20works/fig_05.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_05.drawio.svg) _Рисунок 5. Обозначение логического вентиля **Схема логического вентиля И, построенного на транзисторах**._ @@ -85,7 +85,7 @@ _Рисунок 5. Обозначение логического вентиля Схематически, мультиплексор обозначается следующим образом: -../.pic/Introduction/How%20FPGA%20works/FPGA_mux_symbol.png +![../.pic/Introduction/How%20FPGA%20works/fig_06.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_06.drawio.svg) _Рисунок 6. Обозначение Мультиплексора._ @@ -97,19 +97,19 @@ _Рисунок 6. Обозначение Мультиплексора._ Посмотрим, как можно реализовать мультиплексор с управляющим сигналом, использующим `one-hot`-кодирование, используя только логические вентили **И**, **ИЛИ**: -../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_initial.drawio.png +![../.pic/Introduction/How%20FPGA%20works/fig_07.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_07.drawio.svg) _Рисунок 7. Реализация мультиплексора, использующего one-hot кодирование._ Если мы выставим значение управляющего сигнала, равное `000010`, означающее что только **первый** бит этого сигнала (**счет ведется с нуля**) будет равен **единице** (`sel[1] = 1`), то увидим, что на один из входов каждого логического вентиля **И** будет подано значение `0`. Исключением будет логический вентиль **И** для входа `b`, на вход которого будет подано значение `1`. Это означает, что все логические вентили **И** (кроме первого, на который подается вход `b`) будут выдавать на выход `0` (см. [Логические вентили](#логические-вентили)) вне зависимости от того, что было подано на входы a,c,d,e и f. Единственным входом, который будет на что-то влиять окажется вход `b`. Когда он равен `1`, на выходе соответствующего логического вентиля **И** окажется значение `1`. Когда он равен `0` на выходе **И** окажется значение `0`. Иными словами, выход **И** будет повторять значение `b`. -../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_path.drawio.png +![../.pic/Introduction/How%20FPGA%20works/fig_08.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_08.drawio.svg) _Рисунок 8. Реализация мультиплексора, использующего one-hot кодирование._ Логический вентиль **ИЛИ** на данной схеме имеет больше двух входов. Подобный вентиль может быть создан в виде каскада логических вентилей **ИЛИ**: -![../.pic/Introduction/How%20FPGA%20works/FPGA_or_gate_tree.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_or_gate_tree.drawio.png) +![../.pic/Introduction/How%20FPGA%20works/fig_09.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_09.drawio.svg) _Рисунок 9. Реализация многоходового логического **ИЛИ**._ @@ -117,7 +117,7 @@ _Рисунок 9. Реализация многоходового логиче Но для нашей схемы мультиплексора гарантируется, что каждый вход **ИЛИ** кроме одного будет равняться `0` (поскольку выход каждого **И** кроме одного будет равен `0`). Это означает, что выход **многовходового ИЛИ** будет зависеть только от **одного** входа (в случае, когда `sel = 000010` — от входа `b`). -../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_output.drawio.png +![../.pic/Introduction/How%20FPGA%20works/fig_10.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_10.drawio.svg) _Рисунок 10. Реализация мультиплексора, использующего one-hot кодирование._ @@ -133,7 +133,7 @@ _Рисунок 10. Реализация мультиплексора, испо Представьте мультиплексор с четырьмя входными сигналами, и двухбитным управляющим сигналом (обратите внимание, что в теперь это сигнал не использует `one-hot`-кодирование). Но теперь, вместо того чтобы выставлять входные сигналы во внешний мир, давайте подключим их к программируемой памяти. Это означает, что мы можем "запрограммировать" каждый из входов на какое-то константное значение. Поместим то, что у нас получилось в отдельный блок и вот, мы получили двухвходовую **Таблицу подстановки** (далее **LUT**). -![../.pic/Introduction/How%20FPGA%20works/FPGA_lut_scheme.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_lut_scheme.drawio.png) +![../.pic/Introduction/How%20FPGA%20works/fig_11.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_11.drawio.svg) _Рисунок 11. Реализация таблицы подстановки (Look-Up Table, LUT)._ @@ -157,9 +157,9 @@ _Рисунок 11. Реализация таблицы подстановки ( **D-триггер** — это цифровой элемент, способный хранить один бит информации. В базовом варианте у этого элемента есть два входа и один выход. Один из входов подает значение, которое будет записано в **D-триггер**, второй вход управляет записью (обычно он называется `clk` или `clock` и подключается к тактирующему синхроимпульсу схемы). Когда управляющий сигнал меняет свое значение с `0` на `1` (либо с `1` на `0`, зависит от схемы), в **D-триггер** записывается значение сигнала данных. Обычно, описывая **D-триггер**, говорится, что он строится из двух защелок, которые в свою очередь строятся из **RS-триггеров**, однако в конечном итоге, все эти элементы строятся на базе логических вентилей **И**/**ИЛИ**, **НЕ**: -![../.pic/Introduction/How%20FPGA%20works/FPGA_d_flip_flop.png](../.pic/Introduction/How%20FPGA%20works/FPGA_d_flip_flop.png) +![../.pic/Introduction/How%20FPGA%20works/fig_12.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_12.drawio.svg) -_Рисунок 12. Реализация D-триггера[[2]](https://www.build-electronic-circuits.com/d-flip-flop/)._ +_Рисунок 12. Реализация D-триггера._ ## Арифметика @@ -167,7 +167,7 @@ _Рисунок 12. Реализация D-триггера[[2]](https://www.bui Все эти блоки могут быть реализованы через логические вентили, например так можно реализовать сумматор: -![../.pic/Labs/lab_01_adder/fig_02.drawio.png](../.pic/Labs/lab_01_adder/fig_02.drawio.png) +![../.pic/Labs/lab_01_adder/fig_02.drawio.svg](../.pic/Labs/lab_01_adder/fig_02.drawio.svg) _Рисунок 13. Реализация полного однобитного сумматора._ @@ -181,7 +181,7 @@ _Рисунок 13. Реализация полного однобитного ![../.pic/Labs/lab_03_memory/fig_02.png](../.pic/Labs/lab_03_memory/fig_02.png) -_Рисунок 14. Схема логической ячейки[[3]](https://en.wikipedia.org/wiki/Field-programmable_gate_array)._ +_Рисунок 14. Схема логической ячейки[[2]](https://en.wikipedia.org/wiki/Field-programmable_gate_array)._ Может показаться запутанным, но все достаточно просто. Логический блок представляет собой цепочку операций: `логическая функция, реализованная через LUT -> арифметическая операция -> Запись в D-триггер`. Каждый из мультиплексоров определяет то, будет ли пропущен какой-либо из этих этапов. Таким образом, конфигурируя каждый логический блок, можно получить следующие вариации кусочка цифровой схемы: @@ -196,7 +196,7 @@ _Рисунок 14. Схема логической ячейки[[3]](https://en А вот реальный пример использования логического блока в ПЛИС `xc7a100tcsg324-1` при реализации Арифметико-логического устройства (АЛУ), подключенного к периферии отладочной платы `Nexys-7`: -![../.pic/Introduction/How%20FPGA%20works/FPGA_logic_cell.png](../.pic/Introduction/How%20FPGA%20works/FPGA_logic_cell.png) +![../.pic/Introduction/How%20FPGA%20works/fig_15.png](../.pic/Introduction/How%20FPGA%20works/fig_15.png) _Рисунок 15. Пример использования логической ячейки._ @@ -223,5 +223,4 @@ _Рисунок 15. Пример использования логической ## Источники 1. Alchitry, Ell C / [How Does an FPGA Work?](https://learn.sparkfun.com/tutorials/how-does-an-fpga-work/all) -2. Omar Muñoz Urias / [The D Flip-Flop (Quickstart Tutorial)](https://www.build-electronic-circuits.com/d-flip-flop/) -3. [Field-programmable gate array](https://en.wikipedia.org/wiki/Field-programmable_gate_array) +2. [Field-programmable gate array](https://en.wikipedia.org/wiki/Field-programmable_gate_array) diff --git a/Labs/01. Adder/README.md b/Labs/01. Adder/README.md index 32c4eee..11f399f 100644 --- a/Labs/01. Adder/README.md +++ b/Labs/01. Adder/README.md @@ -22,7 +22,7 @@ Давайте начнем с примера и сложим в столбик какую-нибудь пару чисел, например 42 и 79: -![../../.pic/Labs/lab_01_adder/column_add_dec.drawio.png](../../.pic/Labs/lab_01_adder/column_add_dec.drawio.png) +![../../.pic/Labs/lab_01_adder/column_add_dec.drawio.svg](../../.pic/Labs/lab_01_adder/column_add_dec.drawio.svg) ```text 2 + 9 = 11 ➨ 1 пишем, 1 "в уме" @@ -36,7 +36,7 @@ Теперь попробуем сделать то же самое, только в двоичной системе исчисления. К примеру, над числами 3 и 5. Три в двоичной системе записывается как 011. Пять записывается как 101. -![../../.pic/Labs/lab_01_adder/column_add_bin.drawio.png](../../.pic/Labs/lab_01_adder/column_add_bin.drawio.png) +![../../.pic/Labs/lab_01_adder/column_add_bin.drawio.svg](../../.pic/Labs/lab_01_adder/column_add_bin.drawio.svg) Поскольку в двоичной системе всего две цифры: 0 и 1, один разряд не может превысить 1. Складывая числа 1 и 1, вы получаете 2, что не умещается в один разряд, поэтому мы пишем 0 и держим 1 "в уме". Это снова перенос разряда. Поскольку в двоичной арифметике разряд называют битом, перенос разряда называют переносом бита, а сам разряд, который перенесли — битом переноса. @@ -58,25 +58,25 @@ ![../../.pic/Labs/lab_01_adder/tt1.png](../../.pic/Labs/lab_01_adder/tt1.png) -*Таблица истинности одноразрядного сложения* +_Таблица истинности одноразрядного сложения._ -`S` — это цифра, записываемая в столбце сложения под числами `a` и `b`. `C` (*carry*, перенос) — это цифра, записываемая левее, если произошел перенос разряда. Как мы видим, перенос разряда происходит только в случае, когда оба числа одновременно равны единице. При этом в этот момент значение `S` обращается в `0`, и результат записывается как `10`, что в двоичной системе означает `2`. Кроме того, `S = 0` и в случае, когда оба операнда одновременно равны нулю. Вы можете заметить, что `S` равно нулю в тех случаях, когда `а` и `b` равны, и не равно нулю в противоположном случае. Подобным свойством обладает логическая операция **Исключающее ИЛИ** (**eXclusive OR**, **XOR**): +`S` — это цифра, записываемая в столбце сложения под числами `a` и `b`. `C` (_carry_, перенос) — это цифра, записываемая левее, если произошел перенос разряда. Как мы видим, перенос разряда происходит только в случае, когда оба числа одновременно равны единице. При этом в этот момент значение `S` обращается в `0`, и результат записывается как `10`, что в двоичной системе означает `2`. Кроме того, `S = 0` и в случае, когда оба операнда одновременно равны нулю. Вы можете заметить, что `S` равно нулю в тех случаях, когда `а` и `b` равны, и не равно нулю в противоположном случае. Подобным свойством обладает логическая операция **Исключающее ИЛИ** (**eXclusive OR**, **XOR**): ![../../.pic/Labs/lab_01_adder/tt2.png](../../.pic/Labs/lab_01_adder/tt2.png) -*Таблица истинности операции Исключающее ИЛИ (XOR)* +_Таблица истинности операции Исключающее ИЛИ (XOR)._ Для бита переноса всё ещё проще — он описывается операцией логическое И: ![../../.pic/Labs/lab_01_adder/tt3.png](../../.pic/Labs/lab_01_adder/tt3.png) -*Таблица истинности операции И* +_Таблица истинности операции И._ Давайте нарисуем цифровую схему, связывающую входные и выходные сигналы с помощью логических элементов, соответствующих ожидаемому поведению: -![../../.pic/Labs/lab_01_adder/fig_01.drawio.png](../../.pic/Labs/lab_01_adder/fig_01.drawio.png) +![../../.pic/Labs/lab_01_adder/fig_01.drawio.svg](../../.pic/Labs/lab_01_adder/fig_01.drawio.svg) -*Рисунок 1. Цифровая схема устройства, складывающего два операнда с сохранением переноса (полусумматора)* +_Рисунок 1. Цифровая схема устройства, складывающего два операнда с сохранением переноса (полусумматора)._ Вроде все замечательно, но есть проблема. В описании полного однобитного сумматора сказано, что у него есть три входа, а в наших таблицах истинности и на схеме выше их только два. На самом деле, на каждом этапе сложения в столбик мы всегда складывали три числа: цифру верхнего числа, цифру нижнего числа, и единицу в случае переноса разряда из предыдущего столбца (если с предыдущего разряда не было переноса, прибавление нуля неявно опускалось). @@ -84,7 +84,7 @@ ![../../.pic/Labs/lab_01_adder/tt4.png](../../.pic/Labs/lab_01_adder/tt4.png) -*Таблица истинности сигналов полного однобитного сумматора* +_Таблица истинности сигналов полного однобитного сумматора._ Поскольку теперь у нас есть и входной и выходной биты переноса, для их различия добавлены индексы “in” и “out”. @@ -98,9 +98,9 @@ Цифровая схема устройства с описанным поведением выглядит следующим образом: -![../../.pic/Labs/lab_01_adder/fig_02.drawio.png](../../.pic/Labs/lab_01_adder/fig_02.drawio.png) +![../../.pic/Labs/lab_01_adder/fig_02.drawio.svg](../../.pic/Labs/lab_01_adder/fig_02.drawio.svg) -*Рисунок 2. Цифровая схема полного однобитного сумматора* +_Рисунок 2. Цифровая схема полного однобитного сумматора._ ## Практика @@ -150,15 +150,15 @@ module half_adder( endmodule ``` -*Листинг 1. SystemVerilog-код модуля half_adder* +_Листинг 1. SystemVerilog-код модуля half_adder._ По данному коду, САПР может реализовать следующую схему: ![../../.pic/Labs/lab_01_adder/fig_03.png](../../.pic/Labs/lab_01_adder/fig_03.png) -*Рисунок 3. Цифровая схема модуля half_adder, сгенерированная САПР Vivado* +_Рисунок 3. Цифровая схема модуля half_adder, сгенерированная САПР Vivado._ -Схема похожа на рис. 1, но как проверить, что эта схема не содержит ошибок и делает именно то, что от нее ожидается? +Схема похожа на _рис. 1_, но как проверить, что эта схема не содержит ошибок и делает именно то, что от нее ожидается? Для этого необходимо провести моделирование этой схемы. Во время моделирования на вход схемы подаются входные воздействия. Каждое изменение входных сигналов схемы приводит к каскадному изменению состояния внутренних цепей, которые в итоге меняют выходные сигналы. @@ -191,13 +191,13 @@ module testbench(); // <- Не имеет ни входов, ни endmodule ``` -*Листинг 2. SystemVerilog-код тестбенча для модуля example* +_Листинг 2. SystemVerilog-код тестбенча для модуля example._ ![../../.pic/Labs/lab_01_adder/fig_04.png](../../.pic/Labs/lab_01_adder/fig_04.png) -*Рисунок 4. Временная диаграмма, моделирующая работу схемы с рис.3* +_Рисунок 4. Временная диаграмма, моделирующая работу схемы с рис. 3._ -В данной лабораторной работе вам предстоит реализовать схему полного однобитного сумматора (*рис. 2*). +В данной лабораторной работе вам предстоит реализовать схему полного однобитного сумматора (_рис. 2_). ### Полный четырехбитный сумматор @@ -207,18 +207,19 @@ endmodule Давайте посмотрим, как это будет выглядеть на схеме (для простоты, внутренняя логика однобитного сумматора скрыта, но вы должны помнить, что каждый прямоугольник — это та же самая схема с рис. 2). -![../../.pic/Labs/lab_01_adder/fig_05.drawio.png](../../.pic/Labs/lab_01_adder/fig_05.drawio.png) -*Рисунок 5. Схема четырехбитного сумматора* +![../../.pic/Labs/lab_01_adder/fig_05.drawio.svg](../../.pic/Labs/lab_01_adder/fig_05.drawio.svg) + +_Рисунок 5. Схема четырехбитного сумматора._ Фиолетовой линией на схеме показаны провода, соединяющие выходной бит переноса сумматора предыдущего разряда, с входным битом переноса сумматора следующего разряда. -Как же реализовать модуль, состоящий из цепочки других модулей? Половину этой задачи мы уже сделали, когда писали тестбенч к однобитному полусумматору в *Листинге 2* — мы создавали модуль внутри другого модуля и подключали к нему провода. Теперь надо сделать то же самое, только с чуть большим числом модулей. +Как же реализовать модуль, состоящий из цепочки других модулей? Половину этой задачи мы уже сделали, когда писали тестбенч к однобитному полусумматору в _Листинге 2_ — мы создавали модуль внутри другого модуля и подключали к нему провода. Теперь надо сделать то же самое, только с чуть большим числом модулей. Для того, чтобы описать четырехбитный сумматор, необходимо подключить четыре однобитных подобно тому, как было описано в [`документе`](../../Basic%20Verilog%20structures/Modules.md#иерархия-модулей), который вы изучали перед лабораторной работой. ![../../.pic/Labs/lab_01_adder/fig_06.drawio.png](../../.pic/Labs/lab_01_adder/fig_06.drawio.png) -*Рисунок 6. Схема четырехбитного сумматора, сгенерированная САПР Vivado* +_Рисунок 6. Схема четырехбитного сумматора, сгенерированная САПР Vivado._ Схема может показаться запутанной, но (если присмотреться) вы увидите, как от шин A, B и S отходят линии к каждому из сумматоров, а бит переноса передается от предыдущего сумматора к следующему. @@ -242,7 +243,7 @@ module fulladder4( ![../../.pic/Labs/lab_01_adder/fig_07.png](../../.pic/Labs/lab_01_adder/fig_07.png) -*Рисунок 7. Пример использования конструкции generate for* +_Рисунок 7. Пример использования конструкции generate for._ Как вы можете догадаться, в этом примере создано 3 модуля, имена которых оканчиваются на значение итератора, по которому шел цикл, а к самим модулям подключены соответствующие итератору провода из шин. Разумеется, для своих целей вы можете использовать и **i+1** и двойные циклы. @@ -275,13 +276,13 @@ module fulladder32( 1. Согласно [руководству по созданию проекта в Vivado](../../Vivado%20Basics/Vivado%20trainer.md): 1. Создайте проект; 2. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder`. -2. Опишите в файле модуль `fulladder`, схема которого представлена на *[Рис. 2](../../.pic/Labs/lab_01_adder/fig_02.drawio.png)*. +2. Опишите в файле модуль `fulladder`, схема которого представлена на _[Рис. 2](../../.pic/Labs/lab_01_adder/fig_02.drawio.svg)_. 3. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder`. 4. Вставьте содержимое файла [`tb_fulladder.sv`](tb_fulladder.sv), расположенного рядом с данным документом. 5. Запустите моделирование. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). 6. Убедитесь по сигналам временной диаграммы, что модуль работает корректно. 7. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder4`. -8. Опишите модуль `fulladder4`, схема которого представлена на *Рис. 5 и 6*, используя [`иерархию модулей`](../../Basic%20Verilog%20structures/Modules.md#%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%8F-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5%D0%B9), чтобы в нем выполнялось поразрядное сложение двух 4-разрядных чисел и входного бита переноса. Некоторые входы и выходы модуля будет необходимо описать в виде `векторов`. +8. Опишите модуль `fulladder4`, схема которого представлена на _Рис. 5 и 6_, используя [`иерархию модулей`](../../Basic%20Verilog%20structures/Modules.md#%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%8F-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5%D0%B9), чтобы в нем выполнялось поразрядное сложение двух 4-разрядных чисел и входного бита переноса. Некоторые входы и выходы модуля будет необходимо описать в виде `векторов`. 9. Обратите внимание, что входной бит переноса должен подаваться на сумматор, выполняющий сложение нулевого разряда, выходной бит переноса соединяется с выходным битом переноса сумматора, выполняющего сложение 4-го разряда. 10. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder4`. 11. Вставьте содержимое файла [`tb_fulladder4.sv`](tb_fulladder4.sv). Нажмите по нему в окне `Sources` ПКМ и выберите `Set as Top`. diff --git a/Labs/02. Arithmetic-logic unit/README.md b/Labs/02. Arithmetic-logic unit/README.md index c4a7215..345b2ab 100644 --- a/Labs/02. Arithmetic-logic unit/README.md +++ b/Labs/02. Arithmetic-logic unit/README.md @@ -26,27 +26,27 @@ Обычно АЛУ представляет собой комбинационную схему (то есть без элементов памяти), на входы которой поступают информационные (операнды) и управляющие (код операции) сигналы, в ответ на что на выходе появляется результат заданной операции. АЛУ бывает не комбинационной схемой, но это скорее исключение. -![../../.pic/Labs/lab_02_alu/fig_01.drawio.png](../../.pic/Labs/lab_02_alu/fig_01.drawio.png) +![../../.pic/Labs/lab_02_alu/fig_01.drawio.svg](../../.pic/Labs/lab_02_alu/fig_01.drawio.svg) -*Рисунок 1. Структурное обозначение элемента АЛУ[1, стр. 305].* +_Рисунок 1. Структурное обозначение элемента АЛУ[1, стр. 305]._ -На рис. 1 изображен пример АЛУ, используемый в книге "Цифровая схемотехника и архитектура компьютера" Харрис и Харрис. На входы `A` и `B` поступают операнды с разрядностью *N*. На трехбитный вход `F` подается код операции. Например, если туда подать `000`, то на выходе `Y` появится результат операции *логическое И* между битами операндов `A` и `B`. Если на `F` подать `010`, то на выходе появится результат сложения. Это лишь пример, разрядность и коды могут отличаться в зависимости от количества выполняемых операций и архитектуры. +На рис. 1 изображен пример АЛУ, используемый в книге "Цифровая схемотехника и архитектура компьютера" Харрис и Харрис. На входы `A` и `B` поступают операнды с разрядностью _N_. На трехбитный вход `F` подается код операции. Например, если туда подать `000`, то на выходе `Y` появится результат операции _логическое И_ между битами операндов `A` и `B`. Если на `F` подать `010`, то на выходе появится результат сложения. Это лишь пример, разрядность и коды могут отличаться в зависимости от количества выполняемых операций и архитектуры. Существует несколько подходов к реализации АЛУ, отличающиеся внутренней организацией. В лабораторных работах применяется повсеместно используемый подход мультиплексирования операций, то есть подключения нескольких операционных устройств (которые выполняют какие-то операции, например сложения, логическое И и т.п.) к мультиплексору, который будет передавать результат нужного операционного устройства на выходы АЛУ. -Рассмотрим на примере все того же АЛУ MIPS из книги Харрисов. На рис. 2, в левой его части, изображена внутренняя организация этого АЛУ, справа – таблица соответствия кодов операциям. На выходе схемы (внизу) стоит четырехвходовый мультиплексор, управляемый двумя из трех битов `F`. К его входам подключены *N* логических И (побитовое И *N*-разрядных операндов), *N* логических ИЛИ, *N*-разрядный сумматор и Zero Extend – устройство делающее из однобитного числа *N*-битное число, дополняя нулями слева. +Рассмотрим на примере все того же АЛУ MIPS из книги Харрисов. На рис. 2, в левой его части, изображена внутренняя организация этого АЛУ, справа – таблица соответствия кодов операциям. На выходе схемы (внизу) стоит четырехвходовый мультиплексор, управляемый двумя из трех битов `F`. К его входам подключены _N_ логических И (побитовое И _N_-разрядных операндов), _N_ логических ИЛИ, _N_-разрядный сумматор и Zero Extend – устройство делающее из однобитного числа _N_-битное число, дополняя нулями слева. -К одному из входов этих операционных устройств подключен `A` без изменений, а ко второму подключен выход двухвходового мультиплексора, управляемого оставшимся битом *F*. То есть `F[2]` определяет, что будет вторым операндом: `B` или `~B`. Вдобавок `F[2]` подается на входной перенос сумматора, то есть, когда `F[2] == 1` на выходе сумматора появляется результат операции `A + ~B + 1`, что (с учетом [дополнительного кода](https://ru.wikipedia.org/wiki/Дополнительный_код)) эквивалентно `A – B`. +К одному из входов этих операционных устройств подключен `A` без изменений, а ко второму подключен выход двухвходового мультиплексора, управляемого оставшимся битом _F_. То есть `F[2]` определяет, что будет вторым операндом: `B` или `~B`. Вдобавок `F[2]` подается на входной перенос сумматора, то есть, когда `F[2] == 1` на выходе сумматора появляется результат операции `A + ~B + 1`, что (с учетом [дополнительного кода](https://ru.wikipedia.org/wiki/Дополнительный_код)) эквивалентно `A – B`. -![../../.pic/Labs/lab_02_alu/fig_02.drawio.png](../../.pic/Labs/lab_02_alu/fig_02.drawio.png) +![../../.pic/Labs/lab_02_alu/fig_02.drawio.svg](../../.pic/Labs/lab_02_alu/fig_02.drawio.svg) -*Рисунок 2. Структурная схема АЛУ MIPS[1, стр. 305].* +_Рисунок 2. Структурная схема АЛУ MIPS[1, стр. 305]._ Посмотрим, что произойдет, если на вход `F` такого АЛУ подать `111`. Будет выполняться операция `SLT`(сокращение от `Set Less Then`) – выдать `1`, если `A` меньше `B`, в противном случае — выдать `0`. Биты `F[1:0]` переключат мультиплексор на выход блока Zero Extend. На вход Zero Extend поступает старший бит выхода сумматора, этот бит отвечает за знак результата. Так как `F[2] == 1`, сумматор вычисляет `A + ~B + 1`, то есть `A – B`, значит, если `A < B`, то результат вычитания будет отрицательный, а старший бит `Y[N-1] == 1`. Если `A` не меньше `B`, то разность будет неотрицательна, а `Y[N-1] == 0`, как и требуется от этой операции. -![../../.pic/Labs/lab_02_alu/fig_03.drawio.png](../../.pic/Labs/lab_02_alu/fig_03.drawio.png) +![../../.pic/Labs/lab_02_alu/fig_03.drawio.svg](../../.pic/Labs/lab_02_alu/fig_03.drawio.svg) -*Рисунок 3. Пример исполнения операции АЛУ.* +_Рисунок 3. Пример исполнения операции АЛУ._ Преимущество такой организации АЛУ в его простой модификации, настройке под нужные коды операций, читаемости кода и масштабируемости. Можно легко добавить или убрать требуемые операции. Подумайте, как бы вы обновили данную схему, если бы от вас потребовалось расширить её функционал операциями XOR (Исключающее ИЛИ) и (SGE операция "больше либо равно")? @@ -224,7 +224,7 @@ endmodule | OR | 0 0 110 |result_o = a_i \| b_i | Побитовое логическое **ИЛИ** | | AND | 0 0 111 |result_o = a_i & b_i | Побитовое логическое **И** | -*Таблица 1. Список вычислительных операций.* +_Таблица 1. Список вычислительных операций._ В первой таблице перечислены операции, вычисляющие значение сигнала `flag_o`. **При любом коде операции `alu_op_i` не входящим в эту таблицу, сигнал `flag_o` должен быть равен нулю**. @@ -237,11 +237,11 @@ endmodule | LTU | 1 1 110 | flag_o = a_i < b_i | Беззнаковое сравнение **<** | | GEU | 1 1 111 | flag_o = a_i ≥ b_i | Беззнаковое сравнение **≥** | -*Таблица 2. Список операций сравнения.* +_Таблица 2. Список операций сравнения._ **Выражения в этих двух таблицах приведены для примера. Не все из них можно просто переписать — часть этих выражений надо дополнить. Чтобы вы не копировали выражения, в них вставлены неподдерживаемые символы.** -Несмотря на разделение на вычислительные операции, и операции сравнения, в *Таблице 1* (вычислительных операция) оказалось две операции `SLTS` и `SLTU`, которые выполняют сравнения. В итоге у нас есть две похожие пары инструкций: +Несмотря на разделение на вычислительные операции, и операции сравнения, в _Таблице 1_ (вычислительных операция) оказалось две операции `SLTS` и `SLTU`, которые выполняют сравнения. В итоге у нас есть две похожие пары инструкций: - `LTS` - `LTU` diff --git a/Labs/03. Register file and memory/README.md b/Labs/03. Register file and memory/README.md index e7673ef..ca0c7a9 100644 --- a/Labs/03. Register file and memory/README.md +++ b/Labs/03. Register file and memory/README.md @@ -50,9 +50,9 @@ Так же возможна реализация, в которой вход `write_data` и выход `read_data` объединены в единый вход/выход `data`. В этом случае операции чтения и записи разделены во времени и используют для этого один единый порт ввода-вывода (`inout`, двунаправленный порт) `data`. -![../../.pic/Labs/lab_03_memory/fig_01.drawio.png](../../.pic/Labs/lab_03_memory/fig_01.drawio.png) +![../../.pic/Labs/lab_03_memory/fig_01.drawio.png](../../.pic/Labs/lab_03_memory/fig_01.drawio.svg) -*Рисунок 1. Примеры блоков ПЗУ и ОЗУ.* +_Рисунок 1. Примеры блоков ПЗУ и ОЗУ._ Кроме того, различают память с **синхронным** и **асинхронным** чтением. В первом случае, перед выходным сигналом шины данных ставится дополнительный регистр, в который по тактовому синхроимпульсу записываются запрашиваемые данные. Такой способ может очень сильно сократить **критический путь** цифровой схемы, но требует дополнительный такт на доступ в память. В свою очередь, асинхронное чтение позволяет получить данные, не дожидаясь очередного синхроимпульса, но такой способ увеличивает критический путь. @@ -64,15 +64,15 @@ ![../../.pic/Labs/lab_03_memory/fig_02.png](../../.pic/Labs/lab_03_memory/fig_02.png) -*Рисунок 2. Структурная схема логического блока в ПЛИС[[1]](https://en.wikipedia.org/wiki/Field-programmable_gate_array).* +_Рисунок 2. Структурная схема логического блока в ПЛИС[[1]](https://en.wikipedia.org/wiki/Field-programmable_gate_array)._ В логическом блоке есть **таблицы подстановки** (Look Up Table, LUT), которые представляют собой не что иное как память, которая переконфигурируется под нужды хранения, а не реализацию логики. Таким образом, трехвходовой LUT может выступать в роли восьмиразрядной памяти. Однако LUT будет сложно приспособить под многопортовую память: посмотрим на схему еще раз: три входа LUT формируют адрес одной из восьми ячеек. Это означает, что среди этих восьми ячеек нельзя обратиться к двум из них одновременно. -Для реализации многопортовой памяти небольшого размера лучше воспользоваться расположенным в логическом блоке D-триггером (**DFF** на *рис. 2*). Несмотря на то, что D-триггер позволяет воспроизвести только 1 разряд элемента памяти, он не ограничивает реализацию по портам. +Для реализации многопортовой памяти небольшого размера лучше воспользоваться расположенным в логическом блоке D-триггером (**DFF** на _рис. 2_). Несмотря на то, что D-триггер позволяет воспроизвести только 1 разряд элемента памяти, он не ограничивает реализацию по портам. -Таким образом, плюс распределенной памяти относительно регистровой заключается в лучшей утилизации ресурсов: одним трёхвходовым LUT можно описать до 8 бит распределенной памяти, в то время как одним D-триггером можно описать только один бит регистровой памяти. Предположим, что в ПЛИС размещены логические блоки, структура которых изображена на *рис. 2* и нам необходимо реализовать 1KiB памяти. Мы можем реализовать распределенную память, используя 64 логических блока (в каждом блоке два трёхвходовых LUT), либо регистровую память, используя 1024 логических блока. +Таким образом, плюс распределенной памяти относительно регистровой заключается в лучшей утилизации ресурсов: одним трёхвходовым LUT можно описать до 8 бит распределенной памяти, в то время как одним D-триггером можно описать только один бит регистровой памяти. Предположим, что в ПЛИС размещены логические блоки, структура которых изображена на _рис. 2_ и нам необходимо реализовать 1KiB памяти. Мы можем реализовать распределенную память, используя 64 логических блока (в каждом блоке два трёхвходовых LUT), либо регистровую память, используя 1024 логических блока. Минусом является ограниченность в реализации многопортовой памяти. diff --git a/Labs/05. Main decoder/README.md b/Labs/05. Main decoder/README.md index 2e83efe..2aab3e8 100644 --- a/Labs/05. Main decoder/README.md +++ b/Labs/05. Main decoder/README.md @@ -75,17 +75,19 @@ SYSTEM-инструкции используются для доступа к с ![../../.pic/Labs/lab_05_decoder/rv32i_summary.png](../../.pic/Labs/lab_05_decoder/rv32i_summary.png) -*Таблица 3. Инструкции набора RV32I с приведением их типов, функционального описания и примеров использования.* +_Таблица 3. Инструкции набора RV32I с приведением их типов, функционального описания и примеров использования._ Обратите внимание на операции `slli`, `srli` и `srai` (операции сдвига на константную величину). У этих инструкций немного измененный формат кодирования **I\***. Формат кодирования **I** предоставляет 12-битную константу. Сдвиг 32-битного числа более, чем на 31 не имеет смысла. Для кодирования числа 31 требуется всего 5 бит. Выходит, что из 12 бит константы используется только 5 бит для операции сдвига, а оставшиеся 7 бит – не используются. А, главное (какое совпадение!), эти 7 бит находятся ровно в том же месте, где у других инструкций находится поле `func7`. Поэтому, чтобы у инструкций `slli`, `srli` и `srai` использующих формат **I** не пропадала эта часть поля, к ней относятся как к полю `func7`. ### Предлагаемая микроархитектура процессора RISC-V -Ниже приводится микроархитектура процессора RISC-V. Регистр `PC` (Program Counter – счетчик команд) подключен к адресному входу памяти инструкций. Считываемая инструкция декодируется основным дешифратором, после чего он выставляет управляющие сигналы для всех блоков процессора (мультиплексоры, АЛУ, интерфейс взаимодействия с памятью). +На _рис. 1_ приводится микроархитектура ядра процессора RISC-V. Регистр `PC` (Program Counter – счетчик команд) подключен к адресному входу памяти инструкций. Считываемая инструкция декодируется основным дешифратором, после чего он выставляет управляющие сигналы для всех блоков процессора (мультиплексоры, АЛУ, интерфейс взаимодействия с памятью). Приведенная архитектура не является заданием для текущей лабораторной работы, лишь отражает то, как в дальнейшем будет подключаться и использоваться реализуемый в данной лабораторной основной дешифратор. -![../../.pic/Labs/lab_11_irq_integration/fig_01.drawio.png](../../.pic/Labs/lab_11_irq_integration/fig_01.drawio.png) +![../../.pic/Labs/lab_11_irq_integration/fig_01.drawio.svg](../../.pic/Labs/lab_11_irq_integration/fig_01.drawio.svg) + +_Рисунок 1. Микроархитектура будущего процессорного ядра._ Предложенная микроархитектура процессора `CYBERcobra 3000 Pro 2.0` из прошлой лабораторной имеет схожую структуру, с некоторыми изменениями. diff --git a/Labs/06. Datapath/README.md b/Labs/06. Datapath/README.md index cde6898..5c33389 100644 --- a/Labs/06. Datapath/README.md +++ b/Labs/06. Datapath/README.md @@ -40,7 +40,9 @@ module riscv_core ( endmodule ``` -![../../.pic/Labs/lab_06_dp/fig_01.drawio.png](../../.pic/Labs/lab_06_dp/fig_01.drawio.png) +![../../.pic/Labs/lab_06_dp/fig_01.drawio.svg](../../.pic/Labs/lab_06_dp/fig_01.drawio.svg) + +_Рисунок 1. Микроархитектура ядра процессора RISC-V._ В отличие от реализованного ранее процессора с архитектурой CYBERcobra, в данном модуле отсутствует память (она подключается извне, а значит у этого модуля должны быть сигналы интерфейса памяти). @@ -67,7 +69,9 @@ module riscv_unit( endmodule ``` -![../../.pic/Labs/lab_06_dp/fig_02.drawio.png](../../.pic/Labs/lab_06_dp/fig_02.drawio.png) +![../../.pic/Labs/lab_06_dp/fig_02.drawio.svg](../../.pic/Labs/lab_06_dp/fig_02.drawio.svg) + +_Рисунок 2. Микроархитектура процессора._ Обратите внимание на регистр `stall`. Этот регистр и будет управлять разрешением на запись в программный счетчик `PC`. Поскольку мы используем блочную память, расположенную прямо в ПЛИС, доступ к ней осуществляется за 1 такт, а значит, что при обращении в память, нам необходимо "отключить" программный счетчик ровно на 1 такт. Если бы использовалась действительно "внешняя" память (например чип DDR3), то вместо этого регистра появилась бы другая логика, выставляющая на вход ядра `stall_i` единицу пока идет обращение в память. diff --git a/Labs/08. Load-store unit/README.md b/Labs/08. Load-store unit/README.md index 2cbd60d..2ee8fcf 100644 --- a/Labs/08. Load-store unit/README.md +++ b/Labs/08. Load-store unit/README.md @@ -31,9 +31,9 @@ Модуль загрузки и сохранения (**Load/Store Unit** – **LSU**) служит для исполнения инструкций типа `LOAD` и `STORE`: является прослойкой между внешним устройством – памятью, и ядром процессора. **LSU** считывает содержимое из памяти данных или записывает в нее требуемые значения, преобразуя 8- и 16-битные данные в знаковые или беззнаковые 32-битные числа для регистров процессора. В процессорах с **RISC** архитектурой с помощью **LSU** осуществляется обмен данными между регистрами общего назначения и памятью данных. -![../../.pic/Labs/lab_08_lsu/fig_01.drawio.png](../../.pic/Labs/lab_08_lsu/fig_01.drawio.png) +![../../.pic/Labs/lab_08_lsu/fig_01.drawio.svg](../../.pic/Labs/lab_08_lsu/fig_01.drawio.svg) -_Рисунок 1. Место LSU в микроархитектуре RISC-процессора_ +_Рисунок 1. Место LSU в микроархитектуре RISC-процессора._ ### Интерфейс процессора и блока загрузки/сохранения @@ -177,11 +177,11 @@ _Рисунок 1. Место LSU в микроархитектуре RISC-пр - стать равным единице в тот же такт, когда пришел сигнал `core_req_i` - удерживать это значение до тех пор, пока не придет сигнал `mem_ready_i`, но не менее 1 такта (т.е. даже если сигнал `mem_ready_i` будет равен единице, `core_req_i` должен подняться хотя бы на 1 такт). -Для реализации подобного функционала вам потребуется вспомогательный регистр `stall_reg`, каждый такт записывающий значение выхода `core_stall_o` и следующая таблица истинности для этого выхода: +Для реализации подобного функционала вам потребуется вспомогательный регистр `stall_reg`, каждый такт записывающий значение выхода `core_stall_o` и таблица истинности для этого выхода, представленная на _рис. 2_. ![../../.pic/Labs/lab_08_lsu/fig_02.png](../../.pic/Labs/lab_08_lsu/fig_02.png) -_Рисунок 2. Таблица истинности выхода `core_stall_o`_ +_Рисунок 2. Таблица истинности выхода `core_stall_o`._ --- @@ -215,9 +215,9 @@ module riscv_lsu( ``` -![../../.pic/Labs/lab_08_lsu/fig_03.drawio.png](../../.pic/Labs/lab_08_lsu/fig_03.drawio.png) +![../../.pic/Labs/lab_08_lsu/fig_03.drawio.svg](../../.pic/Labs/lab_08_lsu/fig_03.drawio.svg) -_Рисунок 3. Структурная схема модуля `riscv_lsu`_ +_Рисунок 3. Структурная схема модуля `riscv_lsu`._ --- @@ -234,4 +234,3 @@ _Рисунок 3. Структурная схема модуля `riscv_lsu`_ 2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). 3. Перед запуском симуляции убедитесь, что в качестве top-level модуля выбран корректный (`tb_lsu`). 4. Во время симуляции, вы должны прожать "Run All" и убедиться, что в логе есть сообщение о завершении теста! - diff --git a/Labs/09. LSU Integration/README.md b/Labs/09. LSU Integration/README.md index c949907..f467553 100644 --- a/Labs/09. LSU Integration/README.md +++ b/Labs/09. LSU Integration/README.md @@ -1,8 +1,10 @@ # Лабораторная работа 9 "Интеграция блока загрузки и сохранения" -После реализации блока загрузки и сохранения, его необходимо интегрировать в процессорную систему. Ниже представлена схема, иллюстрирующая интеграцию компонентов: +После реализации блока загрузки и сохранения, его необходимо интегрировать в процессорную систему. На _рис. 1_ представлена схема, иллюстрирующая интеграцию компонентов: -![../../.pic/Labs/lab_08_lsu/fig_01.drawio.png](../../.pic/Labs/lab_08_lsu/fig_01.drawio.png) +![../../.pic/Labs/lab_08_lsu/fig_01.drawio.svg](../../.pic/Labs/lab_08_lsu/fig_01.drawio.svg) + +_Рисунок 1. Подключение LSU в процессорную систему._ ## Задание diff --git a/Labs/10. Interrupt subsystem/README.md b/Labs/10. Interrupt subsystem/README.md index e1b7385..28f6552 100644 --- a/Labs/10. Interrupt subsystem/README.md +++ b/Labs/10. Interrupt subsystem/README.md @@ -96,7 +96,7 @@ _Таблица 1. Регистры контроля и состояния ма |1110011 | 110 | I | csrrsi rd, csr, rs1 | Чтение и Установка бит CSR| rd = csr, csr = csr \| imm | |1110011 | 111 | I | csrrci rd, csr, rs1 | Чтение и Очистка бит CSR | rd = csr, csr = csr & ~imm | -_Таблица 2. Список инструкций для работы с регистрами контроля и статуса_ +_Таблица 2. Список инструкций для работы с регистрами контроля и статуса._ Для удобства программирования на языке ассемблера RISC-V существуют псевдоинструкции для работы с CS-регистрами. @@ -105,7 +105,7 @@ _Таблица 2. Список инструкций для работы с ре | csrr rd, csr | csrrs rd, csr, x0 | Чтение CSR | rd = csr | | csrw csr, rs1 | csrrw x0, csr, rs1 | Запись CSR | csr = rs1 | -_Таблица 3. Псевдоинструкции для работы с регистрами контроля и статуса_ +_Таблица 3. Псевдоинструкции для работы с регистрами контроля и статуса._ Операция логического ИЛИ нулевого регистра с содержимым CS-регистра не меняет его содержимого, поэтому при использовании инструкции `csrr` происходит только операция чтения. Подобным образом реализована псевдоинструкция `csrw`. @@ -120,7 +120,7 @@ _Таблица 3. Псевдоинструкции для работы с ре |0x341 | MRW | mepc | Регистр, хранящий адрес перехваченной инструкции. | |0x342 | MRW | mcause | Причина перехвата | -_Таблица 4. Список регистров, подлежащих реализации в рамках лабораторной работы_ +_Таблица 4. Список регистров, подлежащих реализации в рамках лабораторной работы._ По адресу `0x304` должен располагаться регистр, позволяющий маскировать прерывания. Например, если на 5-ом входе системы прерывания генерируется прерывание, то процессор отреагирует на него только в том случае, если 5-ый бит регистра `mie` будет равен 1. @@ -143,7 +143,7 @@ _Таблица 4. Список регистров, подлежащих реа ![../../.pic/Labs/lab_10_irq/tab_05.png](../../.pic/Labs/lab_10_irq/tab_05.png) -_Таблица 5. Кодирование причины перехвата в регистре `mcause`_ +_Таблица 5. Кодирование причины перехвата в регистре `mcause`._ Нас интересуют части, выделенные красным. В первую очередь то, как кодируется старший бит регистра `mcause`. Он зависит от типа причины перехвата (`1` в случае прерывания, `0` в случае исключения). Оставшиеся 31 бит регистра отводятся под коды различных причин. Поскольку мы создаем учебный процессор, который не будет использован в реальной жизни, он не будет поддерживать большую часть прерываний/исключений (таких как невыровненный доступ к памяти, таймеры и т.п.). В рамках данного курса мы должны поддерживать исключение по нелегальной инструкции (код 0x02) и должны уметь поддерживать прерывания периферийных устройств (под которые зарезервированы коды начиная с 16-го). В рамках данной лабораторной работы процессор будет поддерживать только один источник прерывания, поэтому для кодирования причины прерывания нам потребуется только первый код из диапазона _"Designated for platform use"_. @@ -187,7 +187,7 @@ _Таблица 5. Кодирование причины перехвата в Контроллер прерываний позволит обрабатывать входящие запросы на прерывания: маски́ровать их, выбирать один запрос из нескольких, а также игнорировать запросы во время обработки текущего прерывания. -![../../.pic/Labs/lab_10_irq/fig_03.drawio.png](../../.pic/Labs/lab_10_irq/fig_03.drawio.png) +![../../.pic/Labs/lab_10_irq/fig_03.drawio.svg](../../.pic/Labs/lab_10_irq/fig_03.drawio.svg) _Рисунок 3. Место разрабатываемых блоков в структуре процессора._ @@ -197,9 +197,9 @@ _Рисунок 3. Место разрабатываемых блоков в с Рассмотрим один из возможных вариантов организации блока **Control and Status Registers**. Основная работа по описанию схемы блока состоит в описании мультиплексора и демультиплексора. Мультиплексор подает на выход **read_data_o** значение регистра, который соответствует пришедшему адресу. В свою же очередь, демультиплексор маршрутизирует сигнал разрешения на запись **write_enable_i** (en) на тот же регистр. -![../../.pic/Labs/lab_10_irq/fig_04.drawio.png](../../.pic/Labs/lab_10_irq/fig_04.drawio.png) +![../../.pic/Labs/lab_10_irq/fig_04.drawio.svg](../../.pic/Labs/lab_10_irq/fig_04.drawio.svg) -_Рисунок 4. Структурная схема контроллера CS-регистров_ +_Рисунок 4. Структурная схема контроллера CS-регистров._ 3-битный вход **opcode_i** определяет операцию, которая будет производиться над содержимым CSR по адресу **addr_i**. @@ -211,9 +211,9 @@ _Рисунок 4. Структурная схема контроллера CS- Рассмотрим один из возможных способов реализации простейшего контроллера прерываний, представленного на _рис. 5_. -![../../.pic/Labs/lab_10_irq/fig_05.drawio.png](../../.pic/Labs/lab_10_irq/fig_05.drawio.png) +![../../.pic/Labs/lab_10_irq/fig_05.drawio.svg](../../.pic/Labs/lab_10_irq/fig_05.drawio.svg) -_Рисунок 5. Структурная схема контроллера прерываний_ +_Рисунок 5. Структурная схема контроллера прерываний._ Контроллер состоит из логики: diff --git a/Labs/11. Interrupt integration/README.md b/Labs/11. Interrupt integration/README.md index f96c401..32026ac 100644 --- a/Labs/11. Interrupt integration/README.md +++ b/Labs/11. Interrupt integration/README.md @@ -1,13 +1,16 @@ # Лабораторная работа 11 "Интеграция подсистемы прерываний" -После реализации подсистемы прерываний, её необходимо интегрировать в процессорную систему. Для этого необходимо обновить модуль `riscv_core` по приведенной ниже схеме: +После реализации подсистемы прерываний, её необходимо интегрировать в процессорную систему. Для этого необходимо обновить модуль `riscv_core` по схеме, приведенной на _рис. 1_: -![../../.pic/Labs/lab_10_irq/fig_03.drawio.png](../../.pic/Labs/lab_10_irq/fig_03.drawio.png) +![../../.pic/Labs/lab_10_irq/fig_03.drawio.svg](../../.pic/Labs/lab_10_irq/fig_03.drawio.svg) + +_Рисунок 1. Интеграция подсистемы прерываний в ядро процессора._
Схема без выделения новых частей относительно старой версии модуля -![../../.pic/Labs/lab_11_irq_integration/fig_01.drawio.png](../../.pic/Labs/lab_11_irq_integration/fig_01.drawio.png) +![../../.pic/Labs/lab_11_irq_integration/fig_01.drawio.svg](../../.pic/Labs/lab_11_irq_integration/fig_01.drawio.svg) +_Рисунок 1. Схема без выделения новых частей относительно старой версии модуля._
diff --git a/Labs/12. Peripheral units/README.md b/Labs/12. Peripheral units/README.md index 693c0ef..de56541 100644 --- a/Labs/12. Peripheral units/README.md +++ b/Labs/12. Peripheral units/README.md @@ -50,7 +50,7 @@ На рисунке ниже представлен способ подключения процессора к памяти инструкций и данных, а также 255 периферийным устройствам. -![../../.pic/Labs/lab_12_periph/fig_01.drawio.png](../../.pic/Labs/lab_12_periph/fig_01.drawio.png) +![../../.pic/Labs/lab_12_periph/fig_01.drawio.svg](../../.pic/Labs/lab_12_periph/fig_01.drawio.svg) _Рисунок 1. Итоговая структура процессорной системы._ diff --git a/Other/FPGA Listing.md b/Other/FPGA Listing.md index 2c2768f..a626750 100644 --- a/Other/FPGA Listing.md +++ b/Other/FPGA Listing.md @@ -4,7 +4,7 @@ Ну, раз хочешь под [ПЛИС](https://marsohod.org/index.php/ourblog/11-blog/265-fpga) проектировать, то мы просто не могли пройти мимо. Не очень дорогая, но невероятно универсальная для цифровой электроники вещь. Можно назвать не иначе, как конструктором Lego для взрослых, только детальки имеют нанометровые размеры, и ты можешь сделать все что угодно. Ну, пока «пластилин» не закончится, она ведь не резиновая, хотя современные дешевые ПЛИС позволяют разворачивать на себе относительно большие проекты. -![../.pic/Introduction/About%20FPGA/beatles.jpg](../.pic/Introduction/About%20FPGA/beatles.jpg) +![../.pic/Other/About%20FPGA/beatles.jpg](../.pic/Other/About%20FPGA/beatles.jpg) Гибкость! Гибкость помогает реализовать просто гигантский полет фантазии. Хочешь, [нейроночку](https://habr.com/ru/post/349750/) [запусти](https://cyberleninka.ru/article/n/ustroystvo-na-osnove-plis-dlya-raspoznavaniya-rukopisnyh-tsifr-na-izobrazheniyah). Хочешь, [книжку небольшую](https://www.amazon.com/Designing-Video-Game-Hardware-Verilog/dp/1728619440) прочитай за недельку, да видео-игру запили. Или крутую обработку каких-нибудь данных для студенческого проекта или курсовой. Или процессор разверни, да не один, а сразу несколько, и все они зачем-то будут общаться друг с другом, [вон сколько](https://opencores.org/projects?expanded=Processor&language=Verilog) бесплатных доступно для скачивания. Да-да, для скачивания. [Процессор можно описать](https://ru.wikipedia.org/wiki/Soft-микропроцессор), например, на verilog (что ты и делаешь на лабах по АПС вообще-то) и просто скачать его код и развернуть у себя на отладке. Или [клеточный автомат](https://marsohod.org/projects/marsohod2/276-2014-09-04-09-57-27) реализуй, просто так, по-приколу. Или [измеритель дивергенции](http://www.mindspring.com/~tomtitor/index.html), почему нет. Или вот, в [интернетах ваших](https://marsohod.org), не менее 60 проектов различного уровня сложности, все в одном месте, и многое прям сделать хочется. ПЛИС — это настолько шикарная вещь, что легендарные the Beatles даже песню написали о желании приобрести ее. Так что не тормози, скорее заимей себе такую. Во-первых, это весело, а во-вторых это тебе точно пригодится в будущем. @@ -22,7 +22,7 @@ ### Altera Cyclone IV EP4CE6 FPGA Development Board -![../.pic/Introduction/About%20FPGA/cyclone4.jpg](../.pic/Introduction/About%20FPGA/cyclone4.jpg) +![../.pic/Other/About%20FPGA/cyclone4.jpg](../.pic/Other/About%20FPGA/cyclone4.jpg) **~3040 рублей** @@ -36,7 +36,7 @@ ### Отладочная плата с ПЛИС Altera EP2C5T144 -![../.pic/Introduction/About%20FPGA/EP2.jpg](../.pic/Introduction/About%20FPGA/EP2.jpg) +![../.pic/Other/About%20FPGA/EP2.jpg](../.pic/Other/About%20FPGA/EP2.jpg) **~ 1100 рублей** @@ -46,7 +46,7 @@ ### TinyFPGA BX -![../.pic/Introduction/About%20FPGA/TinyFPGA.jpg](../.pic/Introduction/About%20FPGA/TinyFPGA.jpg) +![../.pic/Other/About%20FPGA/TinyFPGA.jpg](../.pic/Other/About%20FPGA/TinyFPGA.jpg) **~ 2900 рублей** @@ -56,7 +56,7 @@ ### iCEBreaker FPGA -![../.pic/Introduction/About%20FPGA/ice.jpg](../.pic/Introduction/About%20FPGA/ice.jpg) +![../.pic/Other/About%20FPGA/ice.jpg](../.pic/Other/About%20FPGA/ice.jpg) **~ 5500 рублей**