vhdl_help 0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3a2aec5ff639c532645351dad1ff4f2bf3a57592
4
+ data.tar.gz: 60ebd00aae9fe2cddc24d5a5fc11616a8537ecc9
5
+ SHA512:
6
+ metadata.gz: 7d2e48c0f2b426f501bef330853c9dbee9a9a54bb214ab08fbd702898c8e47a7e90932e09f048db56f2747420c5d808605ec93ea308de4fc17445e92889efa09
7
+ data.tar.gz: a7c3480e1043ade625e875f017f516bfa7e5cd13288862986755d278753df48b47057770e59c0139d639832755c8cece5b4ddb76eca40519a72678f6952ae153
data/bin/vhdl_help ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/vhdl_helper'
4
+ helper=VhdlHelper.new
5
+ helper.analyze_options(ARGV)
6
+ helper.help
@@ -0,0 +1,20 @@
1
+ library ieee;
2
+ use ieee.std_logic_1164.all;
3
+ use ieee.numeric_std.all;
4
+
5
+ entity tb is
6
+ end tb;
7
+
8
+ architecture bhv of tb is
9
+
10
+ constant HALF_PERIOD : time := 5 ns; --100Mhz
11
+ signal running : boolean := true;
12
+ signal clk : std_logic := '0';
13
+
14
+ begin
15
+
16
+ -- clock generator
17
+ clk <= not clk a after HALF_PERIOD when running else clk;
18
+
19
+
20
+ end bhv;
@@ -0,0 +1,25 @@
1
+ library ieee;
2
+ use ieee.std_logic_1164.all;
3
+ use ieee.numeric_std.all;
4
+
5
+ entity tb is
6
+ end tb;
7
+
8
+ architecture bhv of tb is
9
+
10
+ signal stdlv : std_logic_vector(31 downto 0);
11
+ signal u32 : unsigned(11 downto 0);
12
+ signal u16 : unsigned(11 downto 0);
13
+ signal u12 : unsigned(11 downto 0);
14
+ signal s12 : signed(11 downto 0);
15
+
16
+ begin
17
+ stdlv <= x"deedbeef";
18
+ u32 <= unsigned(stdlv);
19
+ u12 <= resize(u32,12);
20
+
21
+ s12 <= resize(signed(stdlv),12);
22
+
23
+ u16 <= resize(to_unsigned(42,12),16);
24
+
25
+ end bhv;
@@ -0,0 +1,31 @@
1
+ library ieee;
2
+ use ieee.std_logic_1164.all;
3
+ use ieee.numeric_std.all;
4
+
5
+ entity counter is
6
+ generic(N : natural := 8)
7
+ port(
8
+ reset_n : in std_logic;
9
+ clk : in std_logic;
10
+ enable : in std_logic;
11
+ value : out unsigned(N-1 downto 0)
12
+ );
13
+ end counter;
14
+
15
+ architecture rtl of counter is
16
+ signal count : unsigned(N-1 downto 0);
17
+ begin
18
+
19
+ counting: process(reset_n,clk)
20
+ begin
21
+ if reset_n='0' then
22
+ count <= to_unsigned(0,N);
23
+ elsif rising_edge(clk) then
24
+ if enable='1' then
25
+ count <= count + 1;
26
+ end if
27
+ end if;
28
+ end process;
29
+
30
+ value <= count;
31
+ end rtl;
@@ -0,0 +1,13 @@
1
+ library ieee;
2
+ use ieee.std_logic_1164.all;
3
+ use ieee.numeric_std.all;
4
+
5
+ entity counter is
6
+ generic(N : natural := 8)
7
+ port(
8
+ reset_n : in std_logic;
9
+ clk : in std_logic;
10
+ enable : in std_logic;
11
+ value : out unsigned(N-1 downto 0)
12
+ );
13
+ end counter;
@@ -0,0 +1,60 @@
1
+ library ieee;
2
+ use ieee.std_logic_1164.all;
3
+ use ieee.numeric_std.all;
4
+
5
+ entity fsm is
6
+ port(
7
+ reset_n : in std_logic;
8
+ clk : in std_logic;
9
+ go : in std_logic;
10
+ f : out unsigned(7 downto 0)
11
+ );
12
+ end fsm;
13
+
14
+ architecture rtl_1 of fsm is
15
+
16
+ type state_type is (IDLE,PING,PONG);
17
+ signal state_r,state_c : state_type;
18
+ signal output_f : unsigned(7 downto 0);
19
+
20
+ begin
21
+
22
+ tick : process(reset_n,clk)
23
+ begin
24
+ if reset_n='0' then
25
+ state_r <= IDLE;
26
+ elsif rising_edge(clk) then
27
+ state_r <= state_c;
28
+ end if;
29
+ end process;
30
+
31
+ comb:process(go)
32
+ begin
33
+ state_c <= state_r; --default assigment
34
+ case state_r is
35
+ when IDLE =>
36
+ if go='1' then
37
+ state_c <= PING;
38
+ end if;
39
+ when PING =>
40
+ state_c <= PONG;
41
+ when PONG =>
42
+ state_c <= PING;
43
+ when others =>
44
+ null;
45
+ end case;
46
+ end process;
47
+
48
+ output_gen :process(reset_n,clk)
49
+ begin
50
+ if reset_n='0' then
51
+ output_f <= (others=>'0');
52
+ elsif rising_edge(clk) then
53
+ if state_r=PONG then
54
+ output_f <= output_f + 1;
55
+ end if;
56
+ end if;
57
+ end process;
58
+
59
+ f <= output_f;
60
+ end rtl_1;
@@ -0,0 +1,3 @@
1
+ library ieee;
2
+ use ieee.std_logic_1164.all;
3
+ use ieee.numeric_std.all;
@@ -0,0 +1,21 @@
1
+
2
+ architecture rtl of example_memory is
3
+
4
+ type memory_type is array(0 to 255) of std_logic_vector(7 downto 0);
5
+ signal mem : memory_type;
6
+
7
+ begin
8
+
9
+ write_p:process(reset_n,clk)
10
+ if reset_n='0' then
11
+ for i in 0 to 255 loop
12
+ mem(i) <= (others=>'0');
13
+ end loop;
14
+ elsif rising_edge(clk) then
15
+ if wr='1' then
16
+ mem(to_integer(unsigned(addr)) <= datain;
17
+ end if;
18
+ end if;
19
+ end process;
20
+
21
+ end rtl;
@@ -0,0 +1,18 @@
1
+ -- procedure in a process
2
+ stim:process
3
+ procedure wait_cycles(n : natural)
4
+ begin
5
+ for i in 0 to n-1 loop
6
+ wait until rising_edge(clk);
7
+ end loop;
8
+ end procedure;
9
+ begin
10
+ report "starting simulation";
11
+ wait until reset_n='0';
12
+
13
+ wait_cycles(100);
14
+ report "100 clock cycles elapsed";
15
+ wait; --forever
16
+ end process;
17
+
18
+ end bhv;
@@ -0,0 +1,46 @@
1
+ library ieee;
2
+ use ieee.std_logic_1164.all;
3
+ use ieee.numeric_std.all;
4
+
5
+ entity example is
6
+ generic(N : natural := 8)
7
+ port(
8
+ reset_n : in std_logic;
9
+ clk : in std_logic;
10
+ enable : in std_logic;
11
+
12
+ );
13
+ end example ;
14
+
15
+ architecture rtl of example is
16
+ -- constant CST : natural := 42;
17
+ -- type regs is array(0 to 10) of ...
18
+ -- signal x : unsigned(N-1 downto 0);
19
+ begin
20
+
21
+ -- synchronous (a.k.a 'clocked') process
22
+ process(reset_n,clk)
23
+ begin
24
+ if reset_n='0' then
25
+ -- ...
26
+ elsif rising_edge(clk) then
27
+ if enable='1' then
28
+ -- ...
29
+ end if
30
+ end if;
31
+ end process;
32
+
33
+ -- conditional assignment
34
+ z <= a when c1 else
35
+ b when c2 else
36
+ d;
37
+
38
+ -- component instanciation
39
+ inst_0: use work.decoder(RTL)
40
+ generic map(param => 42)
41
+ port map(
42
+ reset_n => reset_n,
43
+ clk => clk
44
+ );
45
+
46
+ end rtl;
@@ -0,0 +1,58 @@
1
+ library ieee;
2
+ use ieee.std_logic_1164.all;
3
+ use ieee.numeric_std.all;
4
+
5
+ entity tb is
6
+ end tb;
7
+
8
+ architecture bhv of tb is
9
+
10
+ constant HALF_PERIOD : time := 5 ns; --100Mhz
11
+ signal running : boolean := true;
12
+ signal clk : std_logic := '0';
13
+
14
+ begin
15
+
16
+ -- clock generator
17
+ clk <= not clk a after HALF_PERIOD when running else clk;
18
+
19
+ -- asynchronous reset
20
+ reset_n <= '0','1' after 123 ns;
21
+
22
+ -- circuit under test
23
+ DUT: entity work.my_circuit(RTL)
24
+ port map(
25
+ reset_n => reset_n,
26
+ clk => clk,
27
+ input_a => a,
28
+ output_f => f
29
+ )
30
+
31
+ -- stimuli
32
+ stim:process
33
+ begin
34
+ report "starting simulation";
35
+ wait until reset_n='0';
36
+
37
+ report "waiting 100 clock cycles";
38
+ for i in 0 to 100 loop
39
+ wait until rising_edge(clk);
40
+ end loop;
41
+
42
+ report "starting test vector";
43
+ wait until rising_edge(clk);
44
+ a <= to_unsigned(1,8);
45
+
46
+ wait until rising_edge(clk);
47
+ a <= to_unsigned(2,8);
48
+
49
+ report "waiting 100 clock cycles";
50
+ for i in 0 to 100 loop
51
+ wait until rising_edge(clk);
52
+ end loop;
53
+
54
+ running <= false;
55
+ wait; --forever
56
+ end process;
57
+
58
+ end bhv;
@@ -0,0 +1,109 @@
1
+ require 'erb'
2
+ require 'pp'
3
+ # compiler options
4
+ require 'optparse'
5
+
6
+ class VhdlHelper
7
+
8
+ VERSION = "0.1"
9
+
10
+ def initialize
11
+ puts "-- "+"="*60
12
+ puts "-- VHDL Helper. #{VERSION}. JC Le Lann 2017"
13
+ puts "-- "+"="*60
14
+ @date = Time.now.strftime('%c')
15
+ @options={}
16
+ end
17
+
18
+ def analyze_options args
19
+ args << "-h" if args.empty?
20
+
21
+ opt_parser = OptionParser.new do |opts|
22
+ opts.banner = "Usage: vhdl_help <keyword>"
23
+
24
+ opts.on("-k", "--keywords" ,"list concepts handled for far") do |n|
25
+ show_keywords
26
+ abort
27
+ end
28
+
29
+ opts.on("-gen", "generates a VHDL file") do |n|
30
+ @options[:gen]=true
31
+ end
32
+
33
+ opts.on("--version", "Prints version") do |n|
34
+ puts VERSION
35
+ abort
36
+ end
37
+
38
+ opts.on("-h", "--help", "Prints this help") do
39
+ puts "Provides basic code examples in VHDL"
40
+ puts opts
41
+ exit
42
+ end
43
+ end
44
+
45
+ begin
46
+ opt_parser.parse!(args)
47
+ @args=args
48
+ rescue Exception => e
49
+ puts e
50
+ exit
51
+ end
52
+ end
53
+
54
+ # main method
55
+ def help
56
+ @args.each{|arg| generate(arg)}
57
+ end
58
+
59
+ def show_keywords
60
+ puts "Here are the keywords I know about :"
61
+ files=__dir__+"../templates/*.vhd"
62
+ concepts=files.collect{|filename| filename.split("/").last.match(/(.*).vhd/)[1]}
63
+ concepts.each do |concept|
64
+ puts "- #{concept}"
65
+ end
66
+ end
67
+
68
+ def header filename
69
+ code=[]
70
+ code << "-- generated : #{@date}"
71
+ code << "-- design : #{filename}"
72
+ code << "-- author : "
73
+ code << "-- "+"="*60
74
+ code.join("\n")
75
+ end
76
+
77
+ def write_file code,filename
78
+ vhdl=[]
79
+ vhdl << header(filename)
80
+ vhdl << code
81
+ vhdl=vhdl.join("\n")
82
+ puts vhdl
83
+ if @options[:gen]
84
+ File.open(filename,'w'){|f| f.puts vhdl}
85
+ puts "VHDL code written in : #{filename}"
86
+ end
87
+ end
88
+
89
+ def generate what
90
+ filename=__dir__+"/templates/#{what}.vhd"
91
+ unless File.exist? filename
92
+ puts "Sorry...I cannot help you concerning '#{what}'"
93
+ else
94
+ template=IO.read(filename)
95
+ renderer = ERB.new(template,nil,'>')
96
+ code = renderer.result(binding)
97
+ write_file code,"#{what}.vhd"
98
+ end
99
+ end
100
+
101
+ end
102
+
103
+ if $PROGRAM_NAME == __FILE__
104
+ filename=ARGV.first
105
+ raise "need an argument !" if filename.nil?
106
+ helper=VhdlHelper.new
107
+ helper.analyze_options(ARGV)
108
+ helper.help
109
+ end
metadata ADDED
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vhdl_help
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Jean-Christophe Le Lann
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-10-16 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A simple snippets generator for VHDL
14
+ email: jean-christophe.le_lann@ensta-bretagne.fr
15
+ executables:
16
+ - vhdl_help
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/vhdl_help
21
+ - lib/templates/clock.vhd
22
+ - lib/templates/conversions.vhd
23
+ - lib/templates/counter.vhd
24
+ - lib/templates/entity.vhd
25
+ - lib/templates/fsm.vhd
26
+ - lib/templates/header.vhd
27
+ - lib/templates/memory.vhd
28
+ - lib/templates/procedure.vhd
29
+ - lib/templates/skeleton.vhd
30
+ - lib/templates/testbench.vhd
31
+ - lib/vhdl_helper.rb
32
+ homepage: http://rubygems.org/gems/vhdl_help
33
+ licenses:
34
+ - MIT
35
+ metadata: {}
36
+ post_install_message:
37
+ rdoc_options: []
38
+ require_paths:
39
+ - lib
40
+ required_ruby_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ requirements: []
51
+ rubyforge_project:
52
+ rubygems_version: 2.6.12
53
+ signing_key:
54
+ specification_version: 4
55
+ summary: VHDL Snippets Generator
56
+ test_files: []