⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gfeinvertor.cpp

📁 用于生成GF(2^m)有限域元素求逆器的Verilog HDL源文件的C程序
💻 CPP
字号:
// GFEInvertor.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"

int main(int argc, char* argv[])
{
	//printf("NOTE: To use this program to generate VerilogHDL File of GF(2^m) Invertor, You have to 
	//	run GFEMultiplierTaps.exe to get files of GF(2^m) Multiplier first.\n\n");
	unsigned int primepolynom[9]={0,0x3,0x7,0xb,0x13,0x25,0x43,0x89,0x11d};
	int m=0;
	printf("GF(2^m) 's dimension m is(2~8):");
	while (true) {
		scanf("%d", &m);
		if (m>1 && m<9) break;
		else printf("m Must Be An Integer Of Range [2,8]\n");
	}
	/*
	char fname[]="GF8Invertor.v", strGFMul[]="GF8Mul";
	fname[2]='0'+m;  strGFMul[2]='0'+m;
	FILE* fp=fopen(fname, "w");
	fname[11]=0;
	fprintf(fp, "module %s(A, C);\n", fname);
	fprintf(fp, "input [%d : 0] A;\n", m-1);
	fprintf(fp, "output [%d : 0] C;\n\n", m-1);
	fprintf(fp, "wire [%d : 0] pows;\n", m*(m-1)-1);	
	if (m>2) {
		fprintf(fp, "wire [%d : 0] mulO;\n", m*(m-1)-1);
		fprintf(fp, "%s(A,A, pows[%d : 0]);\n", strGFMul,m-1);
		for (int i=1; i<m-1; i++) {
			fprintf(fp, "%s(pows[%d : %d],pows[%d : %d], pows[%d : %d]);\n", strGFMul,
					m*i-1, m*(i-1), m*i-1, m*(i-1), m*(i+1)-1, m*i);
		}
		fprintf(fp, "assign mulO[%d:0]=pows[%d:0];\n", m-1,m-1);
		for (i=1; i<m-1; i++) {
			fprintf(fp, "%s(mulO[%d : %d], pows[%d : %d], mulO[%d : %d]);\n", strGFMul,
					m*i-1,m*(i-1), m*(i+1)-1,m*i, m*(i+1)-1,m*i);
		}
		fprintf(fp, "assign C=mulO[%d : %d];\n", m*(m-1)-1,m*(m-2));
	}
	else {
		fprintf(fp, "%s(A,A, C);\n");
	}
	*/
	typedef unsigned char byte;
	int N=(1<<m)-1;
	byte *Pow2Vec=(byte*)malloc(sizeof(byte)*N);
	Pow2Vec[0]=1;
	for (int i=1; i<N; i++)
	{
		if ((Pow2Vec[i-1]>>(m-1))!=0) Pow2Vec[i]=(Pow2Vec[i-1]<<1)^primepolynom[m];
		else Pow2Vec[i]=(Pow2Vec[i-1]<<1);
	}
	
	char fname[]="GF8Invertor.v";
	fname[2]='0'+m;
	FILE* fp=fopen(fname, "w");
	fname[11]=0;
	fprintf(fp, "module %s(A, C);\n", fname);
	fprintf(fp, "input [%d : 0] A;\n", m-1);
	fprintf(fp, "output [%d : 0] C;\n\n", m-1);
	fprintf(fp, "reg [%d : 0] tc;\n", m-1);
	fprintf(fp, "assign C=tc;\n");
	fprintf(fp, "always@(A)\nbegin\n	case(A)\n	0:\n		tc<=0;\n");
	fprintf(fp, "	%d'd1:\n", m);
	fprintf(fp, "		tc<=%d'd1;\n", m);
	for (i=1; i<N; i++)
	{
		fprintf(fp, "	%d'd%d:\n", m,Pow2Vec[i]);
		fprintf(fp, "		tc<=%d'd%d;\n", m,Pow2Vec[N-i]);
	}
	fprintf(fp, "	endcase\nend\n\nendmodule\n");
	fclose(fp);

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -