gupl 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +2 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +10 -0
- data/LICENSE +201 -0
- data/README.md +39 -0
- data/Rakefile +12 -0
- data/example/command_parser.gupl +177 -0
- data/example/command_parser_tb.vhd +172 -0
- data/example/sendrecv.gupl +15 -0
- data/example/sendrecv_tb.vhd +114 -0
- data/example/udpled.gupl +30 -0
- data/exe/gupl +22 -0
- data/gupl.gemspec +38 -0
- data/lib/gupl/version.rb +5 -0
- data/lib/gupl.rb +794 -0
- data/sig/gupl.rbs +4 -0
- data/vhdl_lib/simple_dualportram.vhd +57 -0
- metadata +64 -0
@@ -0,0 +1,172 @@
|
|
1
|
+
library ieee;
|
2
|
+
use ieee.std_logic_1164.all;
|
3
|
+
use ieee.numeric_std.all;
|
4
|
+
|
5
|
+
entity command_parser_tb is
|
6
|
+
end entity command_parser_tb;
|
7
|
+
|
8
|
+
architecture BEHAV of command_parser_tb is
|
9
|
+
|
10
|
+
component command_parser
|
11
|
+
port(
|
12
|
+
-- input
|
13
|
+
UPL_input_data : in std_logic_vector(128-1 downto 0);
|
14
|
+
UPL_input_en : in std_logic;
|
15
|
+
UPL_input_req : in std_logic;
|
16
|
+
UPL_input_ack : out std_logic;
|
17
|
+
|
18
|
+
-- forward_input
|
19
|
+
UPL_forward_input_data : in std_logic_vector(128-1 downto 0);
|
20
|
+
UPL_forward_input_en : in std_logic;
|
21
|
+
UPL_forward_input_req : in std_logic;
|
22
|
+
UPL_forward_input_ack : out std_logic;
|
23
|
+
|
24
|
+
-- output
|
25
|
+
UPL_output_data : out std_logic_vector(128-1 downto 0);
|
26
|
+
UPL_output_en : out std_logic;
|
27
|
+
UPL_output_req : out std_logic;
|
28
|
+
UPL_output_ack : in std_logic;
|
29
|
+
|
30
|
+
-- forward_output
|
31
|
+
UPL_forward_output_data : out std_logic_vector(128-1 downto 0);
|
32
|
+
UPL_forward_output_en : out std_logic;
|
33
|
+
UPL_forward_output_req : out std_logic;
|
34
|
+
UPL_forward_output_ack : in std_logic;
|
35
|
+
|
36
|
+
-- user-defiend ports
|
37
|
+
synch_sender_kick : out std_logic;
|
38
|
+
synch_sender_busy : in std_logic;
|
39
|
+
synch_target_addr : out std_logic_vector(32-1 downto 0);
|
40
|
+
global_clock : in std_logic_vector(64-1 downto 0);
|
41
|
+
global_clock_clear : out std_logic;
|
42
|
+
|
43
|
+
-- system clock and reset
|
44
|
+
clk : in std_logic;
|
45
|
+
reset : in std_logic
|
46
|
+
);
|
47
|
+
end component command_parser;
|
48
|
+
|
49
|
+
signal UPL_input_data : std_logic_vector(128-1 downto 0) := (others => '0');
|
50
|
+
signal UPL_input_en : std_logic := '0';
|
51
|
+
signal UPL_input_req : std_logic := '0';
|
52
|
+
signal UPL_input_ack : std_logic := '0';
|
53
|
+
signal UPL_forward_input_data : std_logic_vector(128-1 downto 0) := (others => '0');
|
54
|
+
signal UPL_forward_input_en : std_logic := '0';
|
55
|
+
signal UPL_forward_input_req : std_logic := '0';
|
56
|
+
signal UPL_forward_input_ack : std_logic := '0';
|
57
|
+
signal UPL_output_data : std_logic_vector(128-1 downto 0) := (others => '0');
|
58
|
+
signal UPL_output_en : std_logic := '0';
|
59
|
+
signal UPL_output_req : std_logic := '0';
|
60
|
+
signal UPL_output_ack : std_logic := '0';
|
61
|
+
signal UPL_forward_output_data : std_logic_vector(128-1 downto 0) := (others => '0');
|
62
|
+
signal UPL_forward_output_en : std_logic := '0';
|
63
|
+
signal UPL_forward_output_req : std_logic := '0';
|
64
|
+
signal UPL_forward_output_ack : std_logic := '0';
|
65
|
+
signal synch_sender_kick : std_logic;
|
66
|
+
signal synch_sender_busy : std_logic := '0';
|
67
|
+
signal synch_target_addr : std_logic_vector(32-1 downto 0) := (others => '0');
|
68
|
+
signal global_clock : std_logic_vector(64-1 downto 0) := (others => '0');
|
69
|
+
signal global_clock_clear : std_logic;
|
70
|
+
signal clk : std_logic := '0';
|
71
|
+
signal reset : std_logic := '0';
|
72
|
+
|
73
|
+
signal counter : unsigned(31 downto 0) := (others => '0');
|
74
|
+
|
75
|
+
begin
|
76
|
+
|
77
|
+
process
|
78
|
+
begin
|
79
|
+
clk <= not clk;
|
80
|
+
wait for 5ns;
|
81
|
+
end process;
|
82
|
+
|
83
|
+
process(clk)
|
84
|
+
begin
|
85
|
+
if rising_edge(clk) then
|
86
|
+
counter <= counter + 1;
|
87
|
+
|
88
|
+
if global_clock_clear = '1' then
|
89
|
+
global_clock <= (others => '0');
|
90
|
+
else
|
91
|
+
global_clock <= std_logic_vector(unsigned(global_clock) + 1);
|
92
|
+
end if;
|
93
|
+
|
94
|
+
case to_integer(counter) is
|
95
|
+
when 1 =>
|
96
|
+
reset <= '1';
|
97
|
+
when 10 =>
|
98
|
+
reset <= '0';
|
99
|
+
UPL_output_ack <= '1';
|
100
|
+
UPL_forward_output_ack <= '1';
|
101
|
+
|
102
|
+
when 100 =>
|
103
|
+
UPL_input_en <= '1';
|
104
|
+
UPL_input_data <= X"0a000001" & X"0a000003" & X"40004001" & X"00000008";
|
105
|
+
when 101 =>
|
106
|
+
UPL_input_en <= '1';
|
107
|
+
UPL_input_data <= X"34000000" & X"00000000" & X"00000000" & X"00000000";
|
108
|
+
when 102 =>
|
109
|
+
UPL_input_en <= '0';
|
110
|
+
|
111
|
+
when 200 =>
|
112
|
+
UPL_input_en <= '1';
|
113
|
+
UPL_input_data <= X"0a000001" & X"0a000003" & X"40004001" & std_logic_vector(to_unsigned(64, 32));
|
114
|
+
when 201 =>
|
115
|
+
UPL_input_en <= '1';
|
116
|
+
UPL_input_data <= X"32000000" & X"00000000" & X"0a020001" & X"00004000";
|
117
|
+
when 202 =>
|
118
|
+
UPL_input_en <= '1';
|
119
|
+
UPL_input_data <= X"0a020002" & X"00004001" & X"0a020003" & X"00004002";
|
120
|
+
when 203 =>
|
121
|
+
UPL_input_en <= '1';
|
122
|
+
UPL_input_data <= X"0a020004" & X"00004003" & X"0a020005" & X"00004004";
|
123
|
+
when 204 =>
|
124
|
+
UPL_input_en <= '1';
|
125
|
+
UPL_input_data <= X"0a020006" & X"00004005" & X"0a020007" & X"00004006";
|
126
|
+
when 205 =>
|
127
|
+
UPL_input_en <= '0';
|
128
|
+
|
129
|
+
when others => null;
|
130
|
+
end case;
|
131
|
+
end if;
|
132
|
+
end process;
|
133
|
+
|
134
|
+
DUT : command_parser
|
135
|
+
port map(
|
136
|
+
-- input
|
137
|
+
UPL_input_data => UPL_input_data,
|
138
|
+
UPL_input_en => UPL_input_en,
|
139
|
+
UPL_input_req => UPL_input_req,
|
140
|
+
UPL_input_ack => UPL_input_ack,
|
141
|
+
|
142
|
+
-- forward_input
|
143
|
+
UPL_forward_input_data => UPL_forward_input_data,
|
144
|
+
UPL_forward_input_en => UPL_forward_input_en,
|
145
|
+
UPL_forward_input_req => UPL_forward_input_req,
|
146
|
+
UPL_forward_input_ack => UPL_forward_input_ack,
|
147
|
+
|
148
|
+
-- output
|
149
|
+
UPL_output_data => UPL_output_data,
|
150
|
+
UPL_output_en => UPL_output_en,
|
151
|
+
UPL_output_req => UPL_output_req,
|
152
|
+
UPL_output_ack => UPL_output_ack,
|
153
|
+
|
154
|
+
-- forward_output
|
155
|
+
UPL_forward_output_data => UPL_forward_output_data,
|
156
|
+
UPL_forward_output_en => UPL_forward_output_en,
|
157
|
+
UPL_forward_output_req => UPL_forward_output_req,
|
158
|
+
UPL_forward_output_ack => UPL_forward_output_ack,
|
159
|
+
|
160
|
+
-- user-defiend ports
|
161
|
+
synch_sender_kick => synch_sender_kick,
|
162
|
+
synch_sender_busy => synch_sender_busy,
|
163
|
+
synch_target_addr => synch_target_addr,
|
164
|
+
global_clock => global_clock,
|
165
|
+
global_clock_clear => global_clock_clear,
|
166
|
+
|
167
|
+
-- system clock and reset
|
168
|
+
clk => clk,
|
169
|
+
reset => reset
|
170
|
+
);
|
171
|
+
|
172
|
+
end BEHAV;
|
@@ -0,0 +1,114 @@
|
|
1
|
+
library ieee;
|
2
|
+
use ieee.std_logic_1164.all;
|
3
|
+
use ieee.numeric_std.all;
|
4
|
+
|
5
|
+
entity sendrecv_tb is
|
6
|
+
end entity sendrecv_tb;
|
7
|
+
|
8
|
+
architecture BEHAV of sendrecv_tb is
|
9
|
+
|
10
|
+
component sendrecv
|
11
|
+
port(
|
12
|
+
-- input
|
13
|
+
UPL_input_data : in std_logic_vector(128-1 downto 0);
|
14
|
+
UPL_input_en : in std_logic;
|
15
|
+
UPL_input_req : in std_logic;
|
16
|
+
UPL_input_ack : out std_logic;
|
17
|
+
|
18
|
+
-- output
|
19
|
+
UPL_output_data : out std_logic_vector(128-1 downto 0);
|
20
|
+
UPL_output_en : out std_logic;
|
21
|
+
UPL_output_req : out std_logic;
|
22
|
+
UPL_output_ack : in std_logic;
|
23
|
+
|
24
|
+
-- system clock and reset
|
25
|
+
clk : in std_logic;
|
26
|
+
reset : in std_logic
|
27
|
+
);
|
28
|
+
end component sendrecv;
|
29
|
+
|
30
|
+
signal UPL_input_data : std_logic_vector(128-1 downto 0) := (others => '0');
|
31
|
+
signal UPL_input_en : std_logic := '0';
|
32
|
+
signal UPL_input_req : std_logic := '0';
|
33
|
+
signal UPL_input_ack : std_logic := '0';
|
34
|
+
signal UPL_output_data : std_logic_vector(128-1 downto 0) := (others => '0');
|
35
|
+
signal UPL_output_en : std_logic := '0';
|
36
|
+
signal UPL_output_req : std_logic := '0';
|
37
|
+
signal UPL_output_ack : std_logic := '0';
|
38
|
+
signal clk : std_logic := '0';
|
39
|
+
signal reset : std_logic := '0';
|
40
|
+
|
41
|
+
signal counter : unsigned(31 downto 0) := (others => '0');
|
42
|
+
|
43
|
+
begin
|
44
|
+
|
45
|
+
process
|
46
|
+
begin
|
47
|
+
clk <= not clk;
|
48
|
+
wait for 5ns;
|
49
|
+
end process;
|
50
|
+
|
51
|
+
process(clk)
|
52
|
+
begin
|
53
|
+
if rising_edge(clk) then
|
54
|
+
counter <= counter + 1;
|
55
|
+
|
56
|
+
case to_integer(counter) is
|
57
|
+
when 1 =>
|
58
|
+
reset <= '1';
|
59
|
+
when 10 =>
|
60
|
+
reset <= '0';
|
61
|
+
UPL_output_ack <= '1';
|
62
|
+
|
63
|
+
when 100 =>
|
64
|
+
UPL_input_en <= '1';
|
65
|
+
UPL_input_data <= X"0a000001" & X"0a000003" & X"40004001" & X"00000008";
|
66
|
+
when 101 =>
|
67
|
+
UPL_input_en <= '1';
|
68
|
+
UPL_input_data <= X"34000000" & X"00000000" & X"00000000" & X"00000000";
|
69
|
+
when 102 =>
|
70
|
+
UPL_input_en <= '0';
|
71
|
+
|
72
|
+
when 200 =>
|
73
|
+
UPL_input_en <= '1';
|
74
|
+
UPL_input_data <= X"0a000001" & X"0a000003" & X"40004001" & std_logic_vector(to_unsigned(64, 32));
|
75
|
+
when 201 =>
|
76
|
+
UPL_input_en <= '1';
|
77
|
+
UPL_input_data <= X"32000000" & X"00000000" & X"0a020001" & X"00004000";
|
78
|
+
when 202 =>
|
79
|
+
UPL_input_en <= '1';
|
80
|
+
UPL_input_data <= X"0a020002" & X"00004001" & X"0a020003" & X"00004002";
|
81
|
+
when 203 =>
|
82
|
+
UPL_input_en <= '1';
|
83
|
+
UPL_input_data <= X"0a020004" & X"00004003" & X"0a020005" & X"00004004";
|
84
|
+
when 204 =>
|
85
|
+
UPL_input_en <= '1';
|
86
|
+
UPL_input_data <= X"0a020006" & X"00004005" & X"0a020007" & X"00004006";
|
87
|
+
when 205 =>
|
88
|
+
UPL_input_en <= '0';
|
89
|
+
|
90
|
+
when others => null;
|
91
|
+
end case;
|
92
|
+
end if;
|
93
|
+
end process;
|
94
|
+
|
95
|
+
DUT : sendrecv
|
96
|
+
port map(
|
97
|
+
-- input
|
98
|
+
UPL_input_data => UPL_input_data,
|
99
|
+
UPL_input_en => UPL_input_en,
|
100
|
+
UPL_input_req => UPL_input_req,
|
101
|
+
UPL_input_ack => UPL_input_ack,
|
102
|
+
|
103
|
+
-- output
|
104
|
+
UPL_output_data => UPL_output_data,
|
105
|
+
UPL_output_en => UPL_output_en,
|
106
|
+
UPL_output_req => UPL_output_req,
|
107
|
+
UPL_output_ack => UPL_output_ack,
|
108
|
+
|
109
|
+
-- system clock and reset
|
110
|
+
clk => clk,
|
111
|
+
reset => reset
|
112
|
+
);
|
113
|
+
|
114
|
+
end BEHAV;
|
data/example/udpled.gupl
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
@GUPL_VERSION 0.0.1
|
2
|
+
|
3
|
+
@ENTITY udpled
|
4
|
+
|
5
|
+
@RECV 0 input 32
|
6
|
+
myIpAddr , 32
|
7
|
+
dstIpAddr , 32
|
8
|
+
myPort , 16
|
9
|
+
dstPort , 16
|
10
|
+
payloadBytes, 32
|
11
|
+
led_value , 32
|
12
|
+
@END
|
13
|
+
|
14
|
+
@SEND 0 output 32
|
15
|
+
myIpAddr , 32
|
16
|
+
dstIpAddr , 32
|
17
|
+
myPort , 16
|
18
|
+
dstPort , 16
|
19
|
+
payloadBytes, 32
|
20
|
+
led_value , 32
|
21
|
+
@END
|
22
|
+
|
23
|
+
@PORT
|
24
|
+
led, 8, out
|
25
|
+
@END
|
26
|
+
|
27
|
+
@STAGE udpled
|
28
|
+
led <= led_value(7 downto 0);
|
29
|
+
@SEND output
|
30
|
+
@END
|
data/exe/gupl
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'gupl'
|
4
|
+
|
5
|
+
# main
|
6
|
+
ARGV.each{|argv|
|
7
|
+
entity = nil
|
8
|
+
version = nil
|
9
|
+
open(argv){|f|
|
10
|
+
str = f.read()
|
11
|
+
version, entity = Gupl.main(str)
|
12
|
+
}
|
13
|
+
exit(0) if entity == nil
|
14
|
+
exit(0) if version == nil
|
15
|
+
|
16
|
+
dirname = File.dirname(argv)
|
17
|
+
open("#{dirname}/#{entity.name}.vhd", "w"){|dst|
|
18
|
+
buf = StringIO.new("", "w")
|
19
|
+
entity.generate(buf)
|
20
|
+
dst.puts(buf.string())
|
21
|
+
}
|
22
|
+
}
|
data/gupl.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/gupl/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "gupl"
|
7
|
+
spec.version = Gupl::VERSION
|
8
|
+
spec.authors = ["Takefumi MIYOSHI"]
|
9
|
+
spec.email = ["miyo@wasamon.net"]
|
10
|
+
|
11
|
+
spec.summary = "gupl makes UPL module."
|
12
|
+
spec.description = "gupl makes UPL modules, which is a VHDL generator."
|
13
|
+
spec.homepage = "https://github.com/e-trees/gupl"
|
14
|
+
spec.required_ruby_version = ">= 2.6.0"
|
15
|
+
|
16
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
17
|
+
|
18
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
19
|
+
spec.metadata["source_code_uri"] = "https://github.com/e-trees/gupl"
|
20
|
+
spec.metadata["changelog_uri"] = "https://github.com/e-trees/gupl/CHANGELOG.md"
|
21
|
+
|
22
|
+
# Specify which files should be added to the gem when it is released.
|
23
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
24
|
+
spec.files = Dir.chdir(__dir__) do
|
25
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
26
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
|
27
|
+
end
|
28
|
+
end
|
29
|
+
spec.bindir = "exe"
|
30
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
31
|
+
spec.require_paths = ["lib"]
|
32
|
+
|
33
|
+
# Uncomment to register a new dependency of your gem
|
34
|
+
# spec.add_dependency "example-gem", "~> 1.0"
|
35
|
+
|
36
|
+
# For more information and examples about making a new gem, check out our
|
37
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
38
|
+
end
|