gupl 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,15 @@
1
+ @GUPL_VERSION 0.0.1
2
+
3
+ @ENTITY sendrecv
4
+
5
+ @RECV 0 input 128
6
+ data ,<12288
7
+ @END
8
+
9
+ @SEND 0 output 128
10
+ data ,<12288
11
+ @END
12
+
13
+ @STAGE sendrecv
14
+ @SEND output
15
+ @END
@@ -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;
@@ -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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gupl
4
+ VERSION = "0.0.1"
5
+ end