OpenCores
URL https://opencores.org/ocsvn/instruction_list_pipelined_processor_with_peripherals/instruction_list_pipelined_processor_with_peripherals/trunk

Subversion Repositories instruction_list_pipelined_processor_with_peripherals

[/] [instruction_list_pipelined_processor_with_peripherals/] [trunk/] [program_rom/] [romCreate.plx] - Blame information for rev 9

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 9 maheshpalv
# programmer for 8-bit pipelined processor
2
# Mahesh Sukhdeo Palve
3
# 09042014
4
# !/usr/bin/perl
5
use warnings;
6
# use strict;
7
 
8
my $file_asm = '> C:\asm.txt';
9
open FILE_ASM, $file_asm or die " PROBLEM READING FILE : $! \n";
10
 
11
 
12
my $file_rom = '> C:\rom.v';
13
open FILE_V, $file_rom or die "PROBLEM READING FILE : $! \n";
14
 
15
 
16
print ("\n\nLast modified by : Mahesh Sukhdeo Palve");
17
print (" \n\n8-bit Pipeline Processor");
18
print (" \n\n for Open Cores (opencores.org)");
19
print ("\n\n------------------------------------------------");
20
print ("\n\n------------------------------------------------");
21
print ("\n\n------------------------------------------------");
22
print ("\n\n\t\tPROGRAMMER . . .\n\n");
23
print ("\n\n------------------------------------------------");
24
print ("\n\n------------------------------------------------");
25
print ("\n\n------------------------------------------------");
26
 
27
print ("\nStart entering instructions-\n");
28
 
29
#       take instruction?
30
 
31
my $inst = 0;
32
my $addr = 0;
33
 
34
 
35
                        print FILE_V "`include \"defines.v\"\n`include \"timescale.v\"\n\n";
36
                        print FILE_V "\tmodule\trom (clk, addr, code);\n";
37
                        print FILE_V "\t\tinput clk;\n\t\tinput [`instAddrLen-1:0] addr; \n\t\t output [`instLen-1:0] code;\n\n";
38
                        print FILE_V "\t\treg [`instLen-1:0] code;";
39
                        print FILE_V "\n\n\n\t\t\talways @ (posedge clk)\n\t\t\tbegin\n\n";
40
                        print FILE_V "\t\t\t case (addr)";
41
 
42
 
43
while ($inst ne END)
44
{
45
        print "\nmnemonic :\t";
46
        $inst = ;
47
        chop ($inst);
48
 
49
 
50
        my $opcode = getOpcode($inst);
51
        # print "\nopcode for $inst is $opcode\n";
52
 
53
        my $field = getField($inst);
54
        # print "\nfield for $inst is $field\n";
55
 
56
        my $instruction = $opcode.$field;
57
        print "\n The instruction at address $addr is $instruction\n\n";
58
 
59
        my $zero = 0;
60
 
61
        print FILE_ASM $inst."\t\t".$field."\n";
62
 
63
        print FILE_V "\n\t\t\t\t$addr\t:\tcode = 15'b$instruction;";
64
 
65
        $addr = $addr + 1;
66
}
67
 
68
        print FILE_V "\n\n\t\t\tdefault\t:\tcode = 15'b111111111111111;";
69
        print FILE_V "\n\t\tendcase\nend\n\nendmodule\n";
70
 
71
 
72
 
73
sub bin2hex {
74
     my $bin = shift;
75
 
76
    # Make input bit string a multiple of 4
77
    #$bin = substr("0000",length($bin)%4) . $bin if length($bin)%4;
78
 
79
    my ($hex, $nybble) = ("");
80
    while (length($bin)) {
81
                ($nybble,$bin) = (substr($bin,0,4), substr($bin,4)); # (substr($bin,0,4), substr($bin,4));
82
                #substr extracts a substring . . .
83
        $nybble = eval "0b$nybble";
84
        $hex .= substr("0123456789ABCDEF", $nybble, 1);
85
    }
86
    return $hex;
87
}
88
 
89
 
90
 
91
 
92
 
93
##############
94
# getOpcode
95
 
96
sub getOpcode{
97
 
98
my $temp;
99
my $zero = 0;
100
my $opcod;
101
use Switch;
102
 
103
switch ($inst) {
104
 
105
                        case END                { $temp = 0;            $opcod = $temp.$temp.$temp.$temp.$temp;};
106
                        case JMP                { $temp = 1;            $opcod = $zero.$zero.$zero.$zero.$temp;};
107
                        case Ld                 { $temp = 10;           $opcod = $zero.$zero.$zero.$temp;};
108
                        case Ldi                { $temp = 11;           $opcod = $zero.$zero.$zero.$temp;};
109
                        case ST                 { $temp = 100;          $opcod = $zero.$zero.$temp;};
110
                        case ADD                { $temp = 101;          $opcod = $zero.$zero.$temp;};
111
                        case SUB                { $temp = 110;          $opcod = $zero.$zero.$temp;};
112
                        case MUL                { $temp = 111;          $opcod = $zero.$zero.$temp;};
113
                        case DIV                { $temp = 1000;         $opcod = $zero.$temp;};
114
                        case AND                { $temp = 1001;         $opcod = $zero.$temp;};
115
                        case OR                 { $temp = 1010;         $opcod = $zero.$temp;};
116
                        case XOR                { $temp = 1011;         $opcod = $zero.$temp;};
117
                        case GT                 { $temp = 1100;         $opcod = $zero.$temp;};
118
                        case GE                 { $temp = 1101;         $opcod = $zero.$temp;};
119
                        case EQ                 { $temp = 1110;         $opcod = $zero.$temp;};
120
                        case LE                 { $temp = 1111;         $opcod = $zero.$temp;};
121
                        case LT                 { $opcod = 10000;};
122
                        case PRE                { $opcod = 10001;};
123
                        case ETY                { $opcod = 10010;};
124
                        case RST                { $opcod = 10011;};
125
                        case LdTC               { $opcod = 10100;};
126
                        case LdACC              { $opcod = 10101;};
127
                        case UARTrd             { $opcod = 10110;};
128
                        case UARTwr             { $opcod = 10111;};
129
                        case UARTstat   { $opcod = 11000;};
130
                        case SPIxFER    { $opcod = 11001;};
131
                        case SPIstat    { $opcod = 11010;};
132
                        case SPIwBUF    { $opcod = 11011;};
133
                        case SPIrBUF    { $opcod = 11100;}
134
                        else                    {print " Inserted NOP!";        $opcod = 11111;};
135
                }
136
 
137
        return $opcod;
138
 
139
}
140
 
141
 
142
 
143
##################
144
#       getField
145
 
146
sub getField{
147
 
148
my $fld = 0;
149
use Switch;
150
my $zero = 0;
151
my $tmp;
152
my $response = 0;
153
 
154
my $negate = 0;
155
my $iomem = 0;
156
my $iomemaddr = 0;
157
 
158
        switch ($inst){
159
 
160
 
161
                case END{
162
                                        print "\nis start address 0? Y or N\t";
163
                                        $response = ;   chop($response);
164
                                        if ($response eq Y){
165
                                                $tmp = $zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero;
166
                                                }
167
                                        else{
168
                                                print "\nstart address (10 bit) :\t";
169
                                                $tmp = ;
170
                                                chop($tmp);
171
                                                }
172
                                        $fld = $tmp;
173
                                        };
174
 
175
                case JMP {
176
                                        print "\n Jump to address :\t";
177
                                        $fld = ;
178
                                        chop($fld);
179
                                        };
180
 
181
                case Ld {
182
                                $fld = sub1();
183
                                };
184
 
185
 
186
                case Ldi        {
187
                                        print "\nImmediate Data (8-bit):\t";
188
                                        $temp = ;       chop($temp);
189
                                        $fld = $zero.$zero.$temp;
190
                                        }
191
 
192
                case ST         {
193
                                $fld = sub1();
194
                                };
195
                case ADD        {
196
                                $fld = sub1();
197
                                };
198
                case SUB        {
199
                                $fld = sub1();
200
                                };
201
                case MUL        {
202
                                $fld = sub1();
203
                                };
204
                case DIV        {
205
                                $fld = sub1();
206
                                };
207
                case AND        {
208
                                $fld = sub1();
209
                                };
210
                case OR         {
211
                                $fld = sub1();
212
                                };
213
                case XOR        {
214
                                $fld = sub1();
215
                                };
216
                case GT         {
217
                                $fld = sub1();
218
                                };
219
                case GE         {
220
                                $fld = sub1();
221
                                };
222
                case EQ         {
223
                                $fld = sub1();
224
                                };
225
                case LE         {
226
                                $fld = sub1();
227
                                };
228
                case LT         {
229
                                $fld = sub1();
230
                                };
231
 
232
 
233
                case PRE        {
234
                                                my $addr = sub2(); my $zero = 0;
235
                                                $fld = $zero.$zero.$zero.$zero.$zero.$zero.$addr;
236
                                };
237
                case ETY        {
238
                                                print "\nAssert (1) or De-assert (0) enable signal?\t";
239
                                                my $resp = ;            chop($resp);
240
                                                print "\nTimer or Counter Type :\t 00 = on-delayTimer, 01 = off-delayTimer, 10 = retOn-delayTimer\n\t\t\t01 = up-counter, 10 = down-counter\n\t\t";
241
                                                my $resp2 = ;   chop($resp2);
242
                                                my $addr = sub2();              my $zero = 0;
243
 
244
                                                $fld = $zero.$zero.$zero.$resp.$resp2.$addr;
245
                                };
246
                case RST        {
247
                                                print "\nAssert (1) or De-assert (0) Reset signal?\t";
248
                                                my $resp = ;            chop($resp);
249
                                                my $zero = 0;
250
                                                my $addr = sub2();
251
                                                $fld = $zero.$zero.$zero.$zero.$zero.$resp.$addr;
252
                                };
253
                case LdTC       {
254
                                                my $addr = sub2();              my $zero = 0;
255
                                                $fld = $zero.$zero.$zero.$zero.$zero.$zero.$addr;
256
                                };
257
                case LdACC      {
258
                                                my $addr = sub2();              my $zero = 0;
259
                                                $fld = $zero.$zero.$zero.$zero.$zero.$zero.$addr;
260
                                };
261
 
262
                case UARTrd     {
263
                                                my $zero = 0;
264
                                                $fld = $zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero;
265
                                };
266
                case UARTwr     {
267
                                                my $zero = 0;
268
                                                $fld = $zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero;
269
                                };
270
                case UARTstat{
271
                                                my $zero = 0;
272
                                                $fld = $zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero;
273
                                };
274
 
275
                case SPIxFER{
276
                                                print "\nEnable (1) or disable (0)?\t";
277
                                                my $resp = ;            chop($resp);
278
                                                print "\nShift (1) or Stop shift (0)?\t";
279
                                                my $resp2 = ;           chop($resp2);
280
                                                my $zero = 0;
281
 
282
                                                $fld = $zero.$zero.$resp.$zero.$zero.$zero.$zero.$zero.$zero.$resp2;
283
                                }
284
                case SPIstat{
285
                                                my $zero = 0;
286
                                                $fld = $zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero;
287
                                };
288
                case SPIrBUF{
289
                                                my $zero = 0;
290
                                                $fld = $zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero;
291
                                };
292
                case SPIwBUF{
293
                                                my $zero = 0;
294
                                                $fld = $zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero.$zero;
295
                                }
296
 
297
                else    {
298
                                $fld = 1111111111;
299
                                };
300
 
301
                }
302
 
303
        return $fld;
304
 
305
}
306
 
307
 
308
sub     sub1{
309
                                        print "\nNegate? Y or N\t";
310
                                        $response = ;   chop($response);
311
                                        if ($response eq Y){    $negate = 1;}
312
                                        else {$negate = 0};
313
 
314
                                        print "\nInput (i) / Output (o) / bitRAM (b) / ByteRAM (B)?";
315
                                        my $select = ;  chop($select);
316
                                        if ($select eq i){
317
                                                                                my $zero = 0;   $iomem = $zero.$zero;
318
                                                                                print "\ninput address :\t";
319
                                                                                $iomemaddr = ;  chop($iomemaddr);
320
                                                                                }
321
                                        if ($select eq o){
322
                                                                                $temp = 1;      $zero = 0;
323
                                                                                $iomem = $zero.$temp;
324
                                                                                print "\noutput address :\t";
325
                                                                                $iomemaddr = ;  chop($iomemaddr);
326
                                                                                }
327
                                        if ($select eq b){
328
                                                                                $iomem = 10;
329
                                                                                print "\nbit RAM address :\t";
330
                                                                                $iomemaddr = ;  chop($iomemaddr);
331
                                                                                }
332
                                        if ($select eq B){
333
                                                                                $iomem = 11;
334
                                                                                print "\nByte RAM address :\t";
335
                                                                                $iomemaddr = ;  chop($iomemaddr);
336
                                                                                }
337
                                        $fld = $negate.$iomem.$iomemaddr;
338
                                        return $fld;
339
}
340
 
341
 
342
 
343
sub sub2 {
344
 
345
                                print "\nEnter Timer/Counter Address (4-bit):\t";
346
                                my $addrs = ;
347
                                chop ($addrs);
348
                                return $addrs;
349
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.