cancel
Showing results for 
Search instead for 
Did you mean: 
Announcements
Intel Support hours are Monday-Fridays, 8am-5pm PST, except Holidays. Thanks to our community members who provide support during our down time or before we get to your questions. We appreciate you!

Need Forum Guidance? Click here
Search our FPGA Knowledge Articles here.
830 Discussions

Converting Xilinx RAM initialization coe/mif format to Intel PSG (Altera) mif

Description: This forum article is dedicated to help users convert their Xilinx design RAM initialization coe/mif files to Intel PSG (Altera) mif/hex format. This article will walk through the process of converting a Xilinx RAM initialization file into an Intel PSG (Altera) RAM initialization file. Included in the article are two scripts that can be run to convert a Xilinx mif file into Altera mif file format.

  • The Xilinx Block Memory Generator in Vivado uses an input .coe file for memory initialization. coe files for block memory usually looks as follows:
; Sample coe file for 16 bit wide and 8 deep memory
memory_initialization_radix=16;
memory_initialization_vector=FFFF ABCD F000 3333 1111 0000 0101 AAAA;

OR

; Sample coe file for 16 bit wide and 8 deep memory
memory_initialization_radix=16;
memory_initialization_vector= FFFF, ABCD, F000, 3333, 1111, 0000, 0101, AAAA;

OR

; Sample coe file for 8 bit wide and 8 deep memory
memory_initialization_radix=2;
memory_initialization_vector=
11111111,
10101011,
11110000,
00110011,
00010001,
00000000,
00000001,
10101010;
  • When Vivado creates the IP using the coe initialization file, it will spit out a mif file. For example, if creating a True Dual Port RAM called tdp1 using the Block Memory Generator for a Vivado project called test_project, the mif file may default to a location as follows:
    • /<user_dir>/test_project/test_project.srcs/sources_1/ip/tdp1/tdp1.mif
    • The Block Memory Generator created the mif file based on the coe file. 
    • The mif file for the first coe example shown above would look as follows:
1111111111111111
1010101111001101
1111000000000000
0011001100110011
0001000100010001
0000000000000000
0000000100000001
1010101010101010
-- Sample mif file for 16 bit wide 8 deep memory
DEPTH = 8;
WIDTH = 16;
ADDRESS_RADIX = DEC;
DATA_RADIX = BIN;
CONTENT
BEGIN
0: 1111111111111111;
1: 1010101111001101;
2: 1111000000000000;
3: 0011001100110011;
4: 0001000100010001;
5: 0000000000000000;
6: 0000000100000001;
7: 1010101010101010;
END;
-- Sample mif file for 8 bit wide 16 deep memory
DEPTH = 16;
WIDTH = 8;
ADDRESS_RADIX = HEX;
DATA_RADIX = HEX;
CONTENT
BEGIN
0: FF;
1: AB;
2: F0;
3: 33;
4: 11;
5: 00;
6: 01;
7: AA;
8: FF;
9: AB;
A: F0;
B: 33;
C: 11;
D:00;
E: 01;
F: A1;
END;
  • For reference, the hex file format for Intel PSG (Altera) Block RAM can be found here:
  • Two script examples are shown below to help automate the conversion from Xilinx to Intel PSG (Altera) RAM mif initialization files.
    • The two scripts use the Xilinx Block Memory Generator mif file creation as input and produce the equivalent Intel PSG (Altera) RAM mif initialization file.
    • One script is in Python while the other is Tcl based depending on preference for scripting.

 

  • Python mif conversion script (X_to_A_mif_conversion.py)
#Convert Xilinx Mif to Altera MIF
#Ex of How to run Script for a 16x8 (16 bit wide, 8 deep) Xilinx Block RAM:
#python X_altera_mif_conversion.py -d 8 -w 16 -i Xilinx_mif.mif -o intel_mif.mif
#If your Xilinx MIF (Xilinx_mif.mif) is a 8x16 (dxw) MIF generated in Vivado/ISE,
#the command above will generate a intel MIF file intel_mif.mif in the correct
#format that will pass Quartus synthesis.

import sys, getopt, struct

def convert_mif(ifile, ofile, depth, width):
               fp_out=open(ofile, "w")
               fp_out.write("DEPTH = " + str(depth) + ";" + "\n" + "\n")
               fp_out.write("WIDTH = " + str(width) + ";" + "\n" + "\n" + "\n")
               fp_out.write("ADDRESS_RADIX = DEC;\n")
               fp_out.write("DATA_RADIX = BIN;\n\n\n")
               fp_out.write("CONTENT\n")
               fp_out.write("BEGIN\n")
               fp_in=open(ifile, "r")
               lines = fp_in.readlines()
               i=0
               for line in lines:
                               fp_out.write(str(i) + " : " + line.rstrip() + ";" + "\n")
                               i = i+1
               fp_out.write("END;")
               fp_in.close()
               fp_out.close()
               print("Converted Xilinx MIF: " + ifile + " To Intel PSG MIF: " + ofile)

 
def main(argv):
               inputfile = ''
               outputfile = ''
               depth = 0
               width = 0
               try:
                               opts, args = getopt.getopt(argv,"hd:w:i:o:")
               except getopt.GetoptError:
                               print 'X_altera_mif_conversion.py -d <depth> -w <width> -i <inputfile> -o <outputfile>'
                               sys.exit(2)
               for opt, arg in opts:
                               if opt == '-h':
                                               print 'X_altera_mif_conversion.py -d <depth> -w <width> -i <inputfile> -o <outputfile>'
                                               sys.exit()
                               elif opt == '-d':
                                               depth = arg
                               elif opt == '-w':
                                               width = arg
                               elif opt == "-i":
                                               inputfile = arg
                               elif opt == "-o":
                                               outputfile = arg
               print 'Input file is ', inputfile
               print 'Output file is ', outputfile
               print 'depth is ', depth
               print 'width is ', width
               convert_mif(inputfile, outputfile, depth, width)  

if __name__ == "__main__":
  main(sys.argv[1:])
  • Tcl mif conversion script (X_to_A_mif_conversion.tcl)
# X_to_A_mif_conversion.tcl
# This script will convert a Xilinx mif file to an Intel PSG (Altera) mif file
# mif files are often used as initialization files for FPGA RAM implementations
#
# usage from a tcl console window in Quartus or from a tcl shell
# > X_to_A_mif_conversion.tcl
#  No arguments will print out all options needed for the script
#  X_to_A_mif_conversion.tcl <depth> <width> <input_file> <output_file>
#
# Example
# > X_to_A_mif_conversion.tcl 1024 16 X_1024x16.mif a_1024x16.mif
#
if {$argc == 0} {
 puts ""
 puts "Usage:"
 puts "X_to_A_mif_conversion.tcl <depth> <width> <input_file> <output_file>"
 puts ""
 exit
} elseif {$argc != 4} {
 puts ""
 puts "Incorrect number of arguments"
 puts "X_to_A_mif_conversion.tcl <depth> <width> <input_file> <output_file>"
 puts ""
 exit
}

set depth  [lindex $argv 0]
set width  [lindex $argv 1]
set filein [lindex $argv 2]
set fileout [lindex $argv 3]

if {[file exists $filein] == 0} {

 puts "input file $filein does not exist"
 exit
}

set fin [open $filein r]

set fout [open $fileout w]

set timestamp_decimal [clock format [clock seconds] -format {%Y %m %d %H %M %S}]


puts $fout "-- Created by X_to_A_mif_conversion.tcl"

puts $fout "-- MIF CREATION TIMESTAMP = $timestamp_decimal"
puts $fout "DEPTH = $depth;                  -- The size of memory in words"
puts $fout "WIDTH = $width;                   -- The size of data in bits"
puts $fout "ADDRESS_RADIX = DEC;         -- The radix for address values"
puts $fout "DATA_RADIX = BIN;            -- The radix for data values"
puts $fout "CONTENT                      -- start of (address : data pairs)"
puts $fout "BEGIN"
puts $fout ""

set i 0
while { [gets $fin data] >= 0 } {
  puts $fout "$i : $data;"
  incr i
}

puts $fout "END;" 

close $fin
close $fout

 

 

Attachments
Version history
Revision #:
5 of 5
Last update:
‎07-30-2020 08:14 AM
Updated by: