HDLRuby 3.1.0 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HDLRuby.gemspec +1 -0
- data/README.html +2330 -2670
- data/README.md +400 -100
- data/ext/hruby_sim/hruby_rcsim_build.c +402 -3
- data/ext/hruby_sim/hruby_sim.h +2 -1
- data/ext/hruby_sim/hruby_sim_calc.c +34 -7
- data/ext/hruby_sim/hruby_sim_core.c +15 -5
- data/ext/hruby_sim/hruby_sim_tree_calc.c +112 -23
- data/lib/HDLRuby/hdr_samples/c_program/echo.c +33 -0
- data/lib/HDLRuby/hdr_samples/comparison_bench.rb +2 -2
- data/lib/HDLRuby/hdr_samples/counter_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +8 -7
- data/lib/HDLRuby/hdr_samples/dff_properties.rb +2 -0
- data/lib/HDLRuby/hdr_samples/enum_as_param.rb +52 -0
- data/lib/HDLRuby/hdr_samples/linear_test.rb +2 -0
- data/lib/HDLRuby/hdr_samples/logic_bench.rb +6 -0
- data/lib/HDLRuby/hdr_samples/mei8.rb +6 -6
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +6 -6
- data/lib/HDLRuby/hdr_samples/memory_test.rb +2 -0
- data/lib/HDLRuby/hdr_samples/named_sub.rb +9 -5
- data/lib/HDLRuby/hdr_samples/ram.rb +7 -6
- data/lib/HDLRuby/hdr_samples/ruby_fir_hw.rb +2 -0
- data/lib/HDLRuby/hdr_samples/ruby_program/echo.rb +9 -0
- data/lib/HDLRuby/hdr_samples/ruby_program/stdrw.rb +6 -0
- data/lib/HDLRuby/hdr_samples/ruby_program/sw_cpu_terminal.rb +614 -0
- data/lib/HDLRuby/hdr_samples/ruby_program/sw_inc_mem.rb +32 -0
- data/lib/HDLRuby/hdr_samples/ruby_program/sw_log.rb +33 -0
- data/lib/HDLRuby/hdr_samples/struct.rb +15 -3
- data/lib/HDLRuby/hdr_samples/with_board.rb +63 -0
- data/lib/HDLRuby/hdr_samples/with_bram.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_bram_frame_stack.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_bram_stack.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_channel.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_channel_other.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_class.rb +3 -1
- data/lib/HDLRuby/hdr_samples/with_clocks.rb +42 -0
- data/lib/HDLRuby/hdr_samples/with_connector.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_connector_memory.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_fixpoint.rb +6 -0
- data/lib/HDLRuby/hdr_samples/with_fixpoint_adv.rb +73 -0
- data/lib/HDLRuby/hdr_samples/with_leftright.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_of.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_program_c.rb +28 -0
- data/lib/HDLRuby/hdr_samples/with_program_ruby.rb +28 -0
- data/lib/HDLRuby/hdr_samples/with_program_ruby_cpu.rb +234 -0
- data/lib/HDLRuby/hdr_samples/with_program_ruby_io.rb +23 -0
- data/lib/HDLRuby/hdr_samples/with_program_ruby_mem.rb +58 -0
- data/lib/HDLRuby/hdr_samples/with_program_ruby_threads.rb +56 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer.rb +17 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_channel.rb +58 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerable.rb +10 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerator.rb +18 -4
- data/lib/HDLRuby/hdr_samples/with_sequencer_func.rb +2 -4
- data/lib/HDLRuby/hdr_samples/with_sequencer_sync.rb +2 -1
- data/lib/HDLRuby/hdrcc.rb +72 -21
- data/lib/HDLRuby/hruby_error.rb +13 -0
- data/lib/HDLRuby/hruby_high.rb +125 -26
- data/lib/HDLRuby/hruby_low.rb +171 -3
- data/lib/HDLRuby/hruby_low2programs.rb +47 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +3 -2
- data/lib/HDLRuby/hruby_low_without_namespace.rb +133 -5
- data/lib/HDLRuby/hruby_low_without_subsignals.rb +1 -1
- data/lib/HDLRuby/hruby_rcsim.rb +113 -6
- data/lib/HDLRuby/hruby_serializer.rb +2 -1
- data/lib/HDLRuby/hruby_verilog.rb +94 -20
- data/lib/HDLRuby/hruby_verilog_name.rb +3 -17
- data/lib/HDLRuby/std/clocks.rb +118 -50
- data/lib/HDLRuby/std/fixpoint.rb +2 -2
- data/lib/HDLRuby/std/function_generator.rb +1 -1
- data/lib/HDLRuby/std/linear.rb +7 -7
- data/lib/HDLRuby/std/sequencer.rb +263 -13
- data/lib/HDLRuby/std/sequencer_channel.rb +90 -0
- data/lib/HDLRuby/std/sequencer_func.rb +28 -15
- data/lib/HDLRuby/std/std.rb +6 -0
- data/lib/HDLRuby/ui/hruby_board.rb +1079 -0
- data/lib/HDLRuby/version.rb +1 -1
- data/lib/c/Rakefile +8 -0
- data/lib/c/cHDL.h +12 -0
- data/lib/c/extconf.rb +7 -0
- data/lib/rubyHDL.rb +33 -0
- data/tuto/gui_accum.png +0 -0
- data/tuto/gui_board.png +0 -0
- data/tuto/tutorial_sw.html +2263 -1890
- data/tuto/tutorial_sw.md +957 -62
- metadata +43 -5
- data/README.pdf +0 -0
- data/tuto/tutorial_sw.pdf +0 -0
@@ -0,0 +1,63 @@
|
|
1
|
+
|
2
|
+
# A benchmark for testing the use of a board model implementing:
|
3
|
+
# * a simple adder whose input are set using slide switches, and
|
4
|
+
# whose output bits are showns on LEDs.
|
5
|
+
# * simple unsigned and signed counters whose values are shown using
|
6
|
+
# decimal or hexadecimal displays, and oscilloscopes.
|
7
|
+
system :with_board do
|
8
|
+
inner :clk, :clk2
|
9
|
+
[8].inner clk_cnt: 0
|
10
|
+
inner rst: 0
|
11
|
+
[8].inner :sw_a, :sw_b
|
12
|
+
[9].inner :led_z
|
13
|
+
[16].inner counter: 0
|
14
|
+
[8].inner :counter8
|
15
|
+
signed[8].inner :scounter8
|
16
|
+
|
17
|
+
# Description of the board.
|
18
|
+
# It is updated at each rising edge of +clk2+.
|
19
|
+
board(:some_board) do
|
20
|
+
actport clk2.posedge
|
21
|
+
bt reset: rst
|
22
|
+
row
|
23
|
+
sw sw_a: sw_a
|
24
|
+
sw sw_b: sw_b
|
25
|
+
led led_z: led_z
|
26
|
+
row
|
27
|
+
digit cnt_d: counter
|
28
|
+
hexa cnt_h: counter
|
29
|
+
digit cnt_s: scounter8
|
30
|
+
row
|
31
|
+
scope scope: counter8
|
32
|
+
scope scope_s:scounter8
|
33
|
+
end
|
34
|
+
|
35
|
+
# The adder.
|
36
|
+
led_z <= sw_a.as(bit[9]) + sw_b
|
37
|
+
|
38
|
+
# The counters and the generation of +clk2+.
|
39
|
+
counter8 <= counter[7..0]
|
40
|
+
scounter8 <= counter[7..0]
|
41
|
+
|
42
|
+
seq(clk.posedge) do
|
43
|
+
hif(rst) { counter <= 0 }
|
44
|
+
helse { counter <= counter + 1 }
|
45
|
+
clk_cnt <= clk_cnt + 1
|
46
|
+
hif(clk_cnt & 3 == 0) { clk2 <= ~clk2 }
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
timed do
|
52
|
+
clk <= 0
|
53
|
+
clk2 <= 0
|
54
|
+
!10.ns
|
55
|
+
repeat(1000) do
|
56
|
+
clk <= 1
|
57
|
+
!10.ns
|
58
|
+
clk <= 0
|
59
|
+
!10.ns
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# A class for a handshake transmission.
|
2
2
|
|
3
|
+
raise "Deprecated code."
|
4
|
+
|
3
5
|
class Handshaker
|
4
6
|
|
5
7
|
## Create a new handshaker for transmitting +type+ data.
|
@@ -179,7 +181,7 @@ end
|
|
179
181
|
|
180
182
|
# A system testing the producer/consumer.
|
181
183
|
system :hs_test do
|
182
|
-
|
184
|
+
inner :clk,:rst
|
183
185
|
|
184
186
|
# Declares the handshaker
|
185
187
|
hs = Handshaker.new([8])
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# A system for testing the clock generator.
|
2
|
+
system :with_clocks do
|
3
|
+
inner :clk, :rst
|
4
|
+
[8].inner :cnt1, :cnt2, :cnt3, :cnt4, :cnt5
|
5
|
+
[8].inner :cnta, :cntb, :cntc, :cntd
|
6
|
+
|
7
|
+
configure_clocks(rst)
|
8
|
+
|
9
|
+
(cnt1 <= cnt1 + 1).at(clk.posedge)
|
10
|
+
(cnt2 <= cnt2 + 1).at(clk.posedge*2)
|
11
|
+
(cnt3 <= cnt3 + 1).at(clk.posedge*3)
|
12
|
+
(cnt4 <= cnt4 + 1).at(clk.posedge*4)
|
13
|
+
(cnt5 <= cnt5 + 1).at(clk.posedge*5)
|
14
|
+
|
15
|
+
configure_clocks(nil)
|
16
|
+
|
17
|
+
(cnta <= cnta + 1).at(clk.posedge*2)
|
18
|
+
(cntb <= cntb + 1).at(clk.posedge*3)
|
19
|
+
(cntc <= cntc + 1).at(clk.posedge*4)
|
20
|
+
(cntd <= cntd + 1).at(clk.posedge*5)
|
21
|
+
|
22
|
+
timed do
|
23
|
+
clk <= 0
|
24
|
+
rst <= 0
|
25
|
+
!10.ns
|
26
|
+
clk <= 1
|
27
|
+
!10.ns
|
28
|
+
clk <= 0
|
29
|
+
rst <= 1
|
30
|
+
cnt1 <= 0; cnt2 <= 0; cnt3 <= 0; cnt4 <= 0; cnt5 <= 0
|
31
|
+
cnta <= 0; cntb <= 0; cntc <= 0; cntd <= 0
|
32
|
+
!10.ns
|
33
|
+
clk <= 1
|
34
|
+
!10.ns
|
35
|
+
clk <= 0
|
36
|
+
rst <= 0
|
37
|
+
repeat(100) do
|
38
|
+
!10.ns
|
39
|
+
clk <= ~clk
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -11,6 +11,12 @@ system :fix_test do
|
|
11
11
|
bit[3..0,3..0].inner :x,:y,:z
|
12
12
|
# Declare three 8-bit integer part 8-bit fractional part
|
13
13
|
signed[3..0,3..0].inner :a,:b,:c,:d
|
14
|
+
# Declare the comparison results.
|
15
|
+
bit.inner :cmpU, :cmpS
|
16
|
+
|
17
|
+
cmpU <= (x >= y)
|
18
|
+
cmpS <= (a >= b)
|
19
|
+
|
14
20
|
|
15
21
|
# Performs calculation between then
|
16
22
|
timed do
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# Sample for testing advanced expressions with fixpoint.
|
2
|
+
|
3
|
+
system :with_fixpoint_adv do
|
4
|
+
inner :clk,:rst
|
5
|
+
signed[8,8].inner :x,:y,:z,:u,:v,:w,:a,:b,:c,:d
|
6
|
+
bit.inner :cmp
|
7
|
+
|
8
|
+
cmp <= (x >= y)
|
9
|
+
u <= (x >= y)
|
10
|
+
|
11
|
+
sequencer(clk,rst) do
|
12
|
+
hif(5>4) { w <= _hFFFF }
|
13
|
+
helse { w <= _h0000 }
|
14
|
+
swhile(w<_h0000) do
|
15
|
+
hif(5>6) { w <= _hFFFF }
|
16
|
+
helse { w <= _h0000 }
|
17
|
+
end
|
18
|
+
5.stimes do
|
19
|
+
x <= _h0100
|
20
|
+
y <= _hFF34
|
21
|
+
a <= _h0100
|
22
|
+
b <= _h0100
|
23
|
+
c <= _h0100
|
24
|
+
step
|
25
|
+
x <= x*a
|
26
|
+
hif(x>=y) { z <= _hFFFF }
|
27
|
+
helse { z <= _h0000 }
|
28
|
+
v <= mux(x>=y,_h0000,_hFFFF)
|
29
|
+
hif(10>0) { w <= _hFFFF }
|
30
|
+
helse { w <= _h0000 }
|
31
|
+
d <= a*b*c
|
32
|
+
step
|
33
|
+
x <= _h0000
|
34
|
+
x <= x*a
|
35
|
+
y <= _hFE68
|
36
|
+
hif(x>=y) { z <= _hFFFF }
|
37
|
+
helse { z <= _h0000 }
|
38
|
+
v <= mux(x>=y,_h0000,_hFFFF)
|
39
|
+
hif(1>20) { w <= _hFFFF }
|
40
|
+
helse { w <= _h0000 }
|
41
|
+
a <= _h0200
|
42
|
+
d <= a*b*c
|
43
|
+
step
|
44
|
+
x <= _hFE00
|
45
|
+
x <= x*a
|
46
|
+
y <= _hFE02
|
47
|
+
hif(x>=y) { z <= _hFFFF }
|
48
|
+
helse { z <= _h0000 }
|
49
|
+
v <= mux(x>=y,_h0000,_hFFFF)
|
50
|
+
b <= _h0200
|
51
|
+
d <= a*b*c
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def cstep(n=1)
|
56
|
+
n.times do
|
57
|
+
clk <= ~clk
|
58
|
+
!10.ns
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
timed do
|
63
|
+
clk <= 0
|
64
|
+
rst <= 0
|
65
|
+
!10.ns
|
66
|
+
cstep(2)
|
67
|
+
rst <= 1
|
68
|
+
cstep(2)
|
69
|
+
rst <= 0
|
70
|
+
cstep(40)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
# A benchmark for testing the use of Ruby software code.
|
3
|
+
system :with_ruby_prog do
|
4
|
+
inner :clk
|
5
|
+
[8].inner :count, :echo
|
6
|
+
|
7
|
+
program(:c,:echo) do
|
8
|
+
actport clk.posedge
|
9
|
+
inport inP: count
|
10
|
+
outport outP: echo
|
11
|
+
code "c_program/c_program"
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
timed do
|
16
|
+
clk <= 0
|
17
|
+
count <= 0
|
18
|
+
!10.ns
|
19
|
+
repeat(10) do
|
20
|
+
clk <= 1
|
21
|
+
!10.ns
|
22
|
+
count <= count + 1
|
23
|
+
clk <= 0
|
24
|
+
!10.ns
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
# A benchmark for testing the use of Ruby software code.
|
3
|
+
system :with_ruby_prog do
|
4
|
+
inner :clk
|
5
|
+
[8].inner :count, :echo
|
6
|
+
|
7
|
+
program(:ruby,:echo) do
|
8
|
+
actport clk.posedge
|
9
|
+
inport inP: count
|
10
|
+
outport outP: echo
|
11
|
+
code "ruby_program/echo.rb"
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
timed do
|
16
|
+
clk <= 0
|
17
|
+
count <= 0
|
18
|
+
!10.ns
|
19
|
+
repeat(10) do
|
20
|
+
clk <= 1
|
21
|
+
!10.ns
|
22
|
+
count <= count + 1
|
23
|
+
clk <= 0
|
24
|
+
!10.ns
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,234 @@
|
|
1
|
+
|
2
|
+
# A benchmark for testing the use of Ruby software code.
|
3
|
+
system :with_ruby_prog_cpu do
|
4
|
+
## The processor interface signals.
|
5
|
+
|
6
|
+
inner :sim # The signal configuring the simulation.
|
7
|
+
|
8
|
+
inner :clk, :rst
|
9
|
+
inner :br, :bg, :rwb
|
10
|
+
[16].inner :addr
|
11
|
+
[8].inner :dout #, :din
|
12
|
+
inner :req, :ack
|
13
|
+
|
14
|
+
[8].inner :key_reg # Memory-mapped register containing the latest key.
|
15
|
+
|
16
|
+
## The configuration parameters.
|
17
|
+
[9].inner :hSIZE, :hSTART, :hEND # Display horizontal size and borders.
|
18
|
+
[8].inner :vSIZE, :vSTART, :vEND # Display vertical size and borders.
|
19
|
+
[8].inner :rxCYCLE # Time for transmitting one bit with the UART
|
20
|
+
[16].inner :vADDR, :kADDR # The display and keyboard start addresses
|
21
|
+
|
22
|
+
program(:ruby,:configure) do
|
23
|
+
actport sim.posedge
|
24
|
+
outport hSIZE: hSIZE, hSTART: hSTART, hEND: hEND
|
25
|
+
outport vSIZE: vSIZE, vSTART: vSTART, vEND: vEND
|
26
|
+
outport rxCYCLE: rxCYCLE
|
27
|
+
outport vADDR: vADDR, kADDR: kADDR
|
28
|
+
code "ruby_program/sw_cpu_terminal.rb"
|
29
|
+
end
|
30
|
+
|
31
|
+
## The processor model.
|
32
|
+
|
33
|
+
# This is the bus part of the CPU.
|
34
|
+
program(:ruby,:cpu_bus) do
|
35
|
+
actport clk.posedge
|
36
|
+
inport br: br # Bus request
|
37
|
+
outport bg: bg # Bus granted
|
38
|
+
inport ain: addr
|
39
|
+
inport aout: addr
|
40
|
+
inport rwb: rwb
|
41
|
+
# inport din: din
|
42
|
+
outport dout: dout
|
43
|
+
|
44
|
+
inport key_reg: key_reg
|
45
|
+
|
46
|
+
code "ruby_program/sw_cpu_terminal.rb"
|
47
|
+
end
|
48
|
+
|
49
|
+
# This is the reset part of the CPU.
|
50
|
+
program(:ruby, :cpu_rst) do
|
51
|
+
actport rst.posedge
|
52
|
+
code "ruby_program/sw_cpu_terminal.rb"
|
53
|
+
end
|
54
|
+
|
55
|
+
# This is the interrupt part of the CPU.
|
56
|
+
program(:ruby,:cpu_irq) do
|
57
|
+
actport req.posedge
|
58
|
+
outport ack: ack
|
59
|
+
code "ruby_program/sw_cpu_terminal.rb"
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
## Simplistic circuitry that generates a monochrome video signal
|
64
|
+
# For a 320x200 screen with 512-320 pixels horizontal blank and
|
65
|
+
# 256-200 lines vertical blank and centered screen.
|
66
|
+
# The memory bus is requested at the begining of a line, and if it is
|
67
|
+
# not granted on time the pixels are skipped.
|
68
|
+
|
69
|
+
[1].inner :vclk_count
|
70
|
+
inner :vclk
|
71
|
+
[9].inner :hcount
|
72
|
+
[8].inner :vcount
|
73
|
+
[16].inner :vaddr
|
74
|
+
inner :hblank, :vblank
|
75
|
+
[8].inner :pixel
|
76
|
+
|
77
|
+
# Generate the video clock: every 4 cycles (for not too long simulation).
|
78
|
+
# NOTE: requires reset to last two cycles or more.
|
79
|
+
seq(clk.posedge) do
|
80
|
+
hif(rst) { vclk_count <= 0; vclk <=0 }
|
81
|
+
helse do
|
82
|
+
vclk_count <= vclk_count + 1
|
83
|
+
hif(vclk_count == 1) { vclk <= ~vclk }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# Generates the signal.
|
88
|
+
seq(vclk.posedge,rst.posedge) do
|
89
|
+
hif(rst) do
|
90
|
+
hcount <= 0; vcount <= 0
|
91
|
+
hblank <= 0; vblank <= 0
|
92
|
+
vaddr <= vADDR
|
93
|
+
pixel <= 0
|
94
|
+
end
|
95
|
+
helse do
|
96
|
+
hif((hcount >= hSIZE + hSTART) | (hcount < hSTART)) { hblank <= 1 }
|
97
|
+
hif((vcount >= vSIZE + vSTART) | (vcount < vSTART)) { vblank <= 1 }
|
98
|
+
hif((hcount < hSIZE+hSTART) & (vcount < vSIZE+vSTART) & (vcount >= vSTART)) { br <= 1 } #; rwb <= 1 }
|
99
|
+
helse { br <= 0} #; rwb <= 0 }
|
100
|
+
hif((hcount >= hSTART) & (hcount < hSIZE+hSTART) &
|
101
|
+
(vcount >= vSTART) & (vcount < vSIZE+vSTART)) do
|
102
|
+
hblank <= 0; vblank <= 0
|
103
|
+
hif(bg) { pixel <= dout }
|
104
|
+
vaddr <= vaddr + 1
|
105
|
+
end
|
106
|
+
hcount <= hcount + 1
|
107
|
+
hif(hcount >= hSIZE+hSTART+hEND) do
|
108
|
+
hcount <= 0
|
109
|
+
vcount <= vcount + 1
|
110
|
+
hif (vcount >= vSIZE+vSTART+vEND) do
|
111
|
+
vcount <= 0
|
112
|
+
vaddr <= vADDR
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Connect to the memory as well as the keyboard register.
|
119
|
+
rwb <= mux(bg, _b0, _b1)
|
120
|
+
# addr <= mux(bg, kADDR, vaddr)
|
121
|
+
addr <= mux(bg, _hzz, vaddr)
|
122
|
+
|
123
|
+
# # Connect the key register.
|
124
|
+
# din <= mux(~bg, _hzz, key_reg)
|
125
|
+
|
126
|
+
# This is the monitor simulator.
|
127
|
+
program(:ruby,:monitor) do
|
128
|
+
actport vclk.negedge
|
129
|
+
inport vblank: vblank, hblank: hblank, pixel: pixel
|
130
|
+
code "ruby_program/sw_cpu_terminal.rb"
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
## Simplisitic circuitry that receives bytes from a UART and write them
|
135
|
+
# into a memory-map register before raising an interrupt.
|
136
|
+
# Only 8-bit values, and no parity.
|
137
|
+
|
138
|
+
# The clock signal generation of the keyboard device
|
139
|
+
[2].inner :uclk_count
|
140
|
+
inner :uclk, :urst
|
141
|
+
|
142
|
+
# Generate the UART chip clock: every 8 cycles (for not too long
|
143
|
+
# simulation).
|
144
|
+
seq(clk.posedge) do
|
145
|
+
hif(rst) { uclk_count <= 0; uclk <= 0; urst <= 1 }
|
146
|
+
helse do
|
147
|
+
uclk_count <= uclk_count + 1
|
148
|
+
hif(uclk_count == 1) { uclk <= ~uclk }
|
149
|
+
hif(uclk_count == 0) { urst <= 0 }
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# The UART signals.
|
154
|
+
inner :rx
|
155
|
+
|
156
|
+
# This is the UART keyboard simulator.
|
157
|
+
program(:ruby,:keyboard) do
|
158
|
+
actport uclk.negedge
|
159
|
+
outport rx: rx
|
160
|
+
code "ruby_program/sw_cpu_terminal.rb"
|
161
|
+
end
|
162
|
+
|
163
|
+
# The signals for getting key values from UART
|
164
|
+
[2].inner :rx_bit_count # The received bit count.
|
165
|
+
[8].inner :rx_bits # The rx bit buffer (a shift register).
|
166
|
+
|
167
|
+
# The sequencer receiving the keyboard data and writing the to a
|
168
|
+
# memory-mapped register.
|
169
|
+
sequencer(uclk.posedge,urst) do
|
170
|
+
sloop do
|
171
|
+
# At first no interrupt and nothing received yet.
|
172
|
+
req <= 0
|
173
|
+
rx_bit_count <= 0
|
174
|
+
rx_bits <= 0
|
175
|
+
key_reg <= 0
|
176
|
+
|
177
|
+
# Wait for a start bit: falling edge of rx.
|
178
|
+
swhile(rx != 0)
|
179
|
+
# Now can get the 8 bits.
|
180
|
+
8.stimes do
|
181
|
+
# Wait one Rx cycle.
|
182
|
+
rxCYCLE.stimes;
|
183
|
+
# Get one bit.
|
184
|
+
rx_bits <= [rx_bits[6..0],rx]
|
185
|
+
end
|
186
|
+
# All is done, wait end of transmission.
|
187
|
+
swhile(rx == 0)
|
188
|
+
# Save the received value.
|
189
|
+
key_reg <= rx_bits
|
190
|
+
# And wait the computer is ready to receive an interrupt
|
191
|
+
# and the BUS is not used by the video chip.
|
192
|
+
swhile((ack == 1) | (rwb == 1) )
|
193
|
+
# Now raise an interrupt.
|
194
|
+
req <= 1
|
195
|
+
# Wait for its process to start.
|
196
|
+
swhile(ack != 0)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
## The simulation part.
|
204
|
+
|
205
|
+
timed do
|
206
|
+
clk <= 0
|
207
|
+
rst <= 0
|
208
|
+
sim <= 0
|
209
|
+
!10.ns
|
210
|
+
sim <= 1
|
211
|
+
!10.ns
|
212
|
+
sim <= 0
|
213
|
+
repeat(5) do
|
214
|
+
!10.ns
|
215
|
+
clk <= 1
|
216
|
+
!10.ns
|
217
|
+
clk <= 0
|
218
|
+
end
|
219
|
+
rst <= 1
|
220
|
+
repeat(5) do
|
221
|
+
!10.ns
|
222
|
+
clk <= 1
|
223
|
+
!10.ns
|
224
|
+
clk <= 0
|
225
|
+
end
|
226
|
+
rst <= 0
|
227
|
+
repeat(10_000_000) do
|
228
|
+
!10.ns
|
229
|
+
clk <= 1
|
230
|
+
!10.ns
|
231
|
+
clk <= 0
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
system :accum do
|
2
|
+
inner :clk
|
3
|
+
[32].inner :sigI, :sigO
|
4
|
+
|
5
|
+
program(:ruby,:stdrw) do
|
6
|
+
actport clk.posedge
|
7
|
+
outport sigI: sigI
|
8
|
+
inport sigO: sigO
|
9
|
+
code "ruby_program/stdrw.rb"
|
10
|
+
end
|
11
|
+
|
12
|
+
(sigO <= sigO+sigI).at(clk.negedge)
|
13
|
+
|
14
|
+
timed do
|
15
|
+
clk <= 0
|
16
|
+
sigO <= 0
|
17
|
+
sigI <= 0
|
18
|
+
repeat(10) do
|
19
|
+
!10.ns
|
20
|
+
clk <= ~clk
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
|
2
|
+
# A benchmark for testing the use of Ruby software code.
|
3
|
+
system :with_ruby_prog_mem do
|
4
|
+
inner :clk, :req, :rwb
|
5
|
+
[8].inner :addr, :index, :count, :data
|
6
|
+
|
7
|
+
# This is actually a CPU embedded memory.
|
8
|
+
program(:ruby,:mem) do
|
9
|
+
actport clk.posedge
|
10
|
+
inport addr: addr
|
11
|
+
inport rwb: rwb
|
12
|
+
inport din: count
|
13
|
+
outport dout: data
|
14
|
+
code "ruby_program/sw_inc_mem.rb"
|
15
|
+
end
|
16
|
+
|
17
|
+
# This is real software.
|
18
|
+
program(:ruby,:inc_mem) do
|
19
|
+
actport req.posedge
|
20
|
+
inport index: index
|
21
|
+
code "ruby_program/sw_inc_mem.rb"
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
timed do
|
26
|
+
clk <= 0
|
27
|
+
addr <= 0
|
28
|
+
index <= 0
|
29
|
+
req <= 0
|
30
|
+
count <= 0
|
31
|
+
rwb <= 0
|
32
|
+
!10.ns
|
33
|
+
req <= 1
|
34
|
+
!10.ns
|
35
|
+
repeat(10) do
|
36
|
+
clk <= 1
|
37
|
+
req <= 0
|
38
|
+
!10.ns
|
39
|
+
req <= 1
|
40
|
+
clk <= 0
|
41
|
+
count <= count + 2
|
42
|
+
addr <= addr + 1
|
43
|
+
!10.ns
|
44
|
+
index <= index + 1
|
45
|
+
end
|
46
|
+
!10.ns
|
47
|
+
addr <= 0
|
48
|
+
clk <= 0
|
49
|
+
rwb <= 1
|
50
|
+
repeat(10) do
|
51
|
+
!10.ns
|
52
|
+
clk <= 1
|
53
|
+
!10.ns
|
54
|
+
clk <= 0
|
55
|
+
addr <= addr + 1
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|