除算器

富豪回路

富豪回路

  • タグ:
  • タグはありません
// div_u8.v
module div_u8 (
	n, d, q, r
);
	input [7:0] n, d;
	output [7:0] q, r;

	assign q = n / d;
	assign r = n % d;
endmodule

// div_8.sflp
declare div_u8 interface
{
	input n<8>, d<8>;
	output q<8>, r<8>;
}

circuit div_8
{
	input n<8>, d<8>;
	output q<8>, r<8>;
	instrin u(n, d), s(n, d);

	div_u8 div;

	instruct u par{ // unsigned div
		div.n = n;
		div.d = d;
		q = div.q;
		r = div.r;
	}

	instruct s par{ // signed div
		if(n<7>) div.n = -n;
		else div.n = n;
		if(d<7>) div.d = -d;
		else div.d = d;
		if(n<7>@d<7>) q = -div.q;
		else q = div.q;
		if(n<7>) r = -div.r;
		else r = div.r;
	}

}

// div_test.cpp
#include<stdio.h>
#include "Vdiv_8.h"

int main(void)
{
	Vdiv_8 *div = new Vdiv_8;

	int n, d;
	unsigned char q, r;

	for (n = 0; n < 256; n++){
		for (d = 1; d < 256; d++){

			div->n = n;
			div->d = d;

			div->u = 1;
			div->s = 0;
			div->eval();
			printf("H %02X / %02X = %02X . %02X\n", n, d, div->q, div->r);

			q = (unsigned char)n / (unsigned char)d;
			r = (unsigned char)n % (unsigned char)d;
			printf("U %02X / %02X = %02X . %02X\n", n, d, q, r);

			if (div->q != q || div->r != r){
				printf("err\n");
				getchar();
			}

			div->u = 0;
			div->s = 1;
			div->eval();
			printf("H %02X / %02X = %02X . %02X\n", n, d, div->q, div->r);

			q = (signed char)n / (signed char)d;
			r = (signed char)n % (signed char)d;
			printf("S %02X / %02X = %02X . %02X\n", n, d, q, r);

			if (div->q != q || div->r != r){
				printf("err\n");
				getchar();
			}

			printf("\n");
		}
	}

	div->final();
	delete div;

	return 0;
}