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

📄 bms_eras_dsc_full.tdf

📁 CodeVisionAVR C Library Functions Reference CodeVisionAVR C 库函数介绍 译自CodeVisionAVR C Compiler Help
💻 TDF
字号:
-------------------------------------------------------------------------
-------------------------------------------------------------------------
--
-- Revision Control Information
--
-- $Workfile:   bms_eras_dsc_full.tdf  $
-- $Archive:   P:/RS_eras/units/Dec_dsc/ahdl/bms_eras_dsc_full.tdv  $
--
-- $Revision:   1.2  $
-- $Date:   20 Aug 1999 11:56:56  $
-- $Author			:  Alejandro Diaz-Manero
--
-- Project      :  RS_eras
--
-- Description	: 
--
-- Copyright 1999 (c) Altera Corporation
-- All rights reserved
--
-------------------------------------------------------------------------
-------------------------------------------------------------------------

FUNCTION lpm_add_sub (cin, dataa[LPM_WIDTH-1..0], datab[LPM_WIDTH-1..0], 
					  add_sub, clock, aclr)
 RETURNS (result[LPM_WIDTH-1..0], cout, overflow);

FUNCTION lpm_counter (data[LPM_WIDTH-1..0], clock, clk_en, cnt_en, updown, aclr, 
					  aset, aconst, aload, sclr, sset, sconst, sload)
 RETURNS (q[LPM_WIDTH-1..0], eq[15..0]);

FUNCTION lpm_compare (dataa[LPM_WIDTH-1..0], datab[LPM_WIDTH-1..0], clock, aclr)
 RETURNS (alb, aeb, agb, ageb, aneb, aleb);

FUNCTION gfmul (a[m..1], b[m..1]) 
 RETURNS (c[m..1]);

FUNCTION gfdiv (a[m..1], d[m..1]) 
 RETURNS (c[m..1]);


PARAMETERS
(
m = 8,			-- GF size (2^m)
irrpol = 285,	-- field polynomial
check = 8,		-- number of check symbols (= # of syndromes)
inv_file = "inv_8_285.hex"
);

constant wide = ceil(log2(check+1));


subdesign bms_eras_dsc_full
(
 sysclk, reset, go, syn[check..1][m..1], num_eras[wide..1], eras_pos[check..1][m..1] : INPUT;
 bdout[check..1][m..1], omegaout[check..1][m..1], numerr[wide..1], done : OUTPUT;
)

VARIABLE

synreg[check..1][m..1], bd[check..1][m..1], bdprev[check..1][m..1], bdtemp[check..1][m..1] : dffe;
one[m..1] : node;
sh_sel[check..1] : dffe;
erasleft[check..1][m..1], erasright[check..1][m..1] : node;
onereg : dffe;
onenode[m..1] : node;


deltaleft[check..1][m..1], deltaright[check..1][m..1] : node;
bdleft[check..1][m..1], bdright[check..1][m..1] : node;
mulleft[check..1][m..1], mulright[check..1][m..1], deltamult[m..1] : dffe; 
mulout[check..1][m..1] : node;
mulsum[check..1][m..1], addvec[check..1][m..1] : node;
deltazero[m..1] : node;
delta[m..1], deltaprev[m..1] : dffe;

mcount, omegacount : lpm_counter WITH (LPM_WIDTH = wide);
llnumnode[wide..1], llnuma[wide..1], llnumb[wide..1] : node;
llnum[wide..1], num_eras_q[wide..1] : dffe;
mloop[wide..1], omegaloop[wide..1] : node;
mchk[wide..1], mcmp[wide..1], omegachk[wide..1], omegacmp[wide..1] : node;
init_syn[wide..1], eras_zero[wide..1] : node;
mloop_plus_eras_num[wide+1..1] : node;   
tlm : node;

omsel[check..1] : node;
omegaleft[check..1][m..1], omegaright[check..1][m..1] : node;

loadsyn, loadbd, loadbdprev, loadbdtemp, load_llnum : node;
shiftsynleft, shiftsynright, clearbd, shiftbdprev_lm, shiftbdprev_lm, shift_sh_sel : node; 
deltacalc, newdelta, olddelta, incm : node; 

incomega, initomega, calcomega, massdone : node; 

add_sub1 : lpm_add_sub WITH (LPM_WIDTH = wide, LPM_DIRECTION = "SUB");
add_sub2, add_sub3 : lpm_add_sub WITH (LPM_WIDTH = wide, LPM_DIRECTION = "ADD");
add_sub4 : lpm_add_sub WITH (LPM_WIDTH = wide+1, LPM_DIRECTION = "ADD");
compare1 : lpm_compare WITH (LPM_WIDTH = wide+1);


  mx : MACHINE OF BITS (mst[17..1])
	   WITH STATES
			(s0  = B"10010000010000000",	-- load syndromes

			 s1  = B"00010000010000000",  
			 s1b = B"01010010010001001",  -- shiftsynleft, incm, loadbd, shiftbdprev_ml, shift_sh_sel
			 s1c = B"00010000010000000",  -- 
			 s1d = B"00010000010000000",  -- keep selecting deltacalc calomega
			 s1e = B"00010000010000100",  -- load bdtemp
			 s2a = B"00000000000000010",  -- load bdprev
			 s2b = B"00000000111000000",  -- calc new delta = Sm + (series)B(j)*S(m-j), shiftBDprev_lm
			 s77 = B"00000000100000000",  -- 1 pipe stage to top of gfmuls
			 s3  = B"00000000000000000",  -- if new delta <> 0, calc new BD
							 
			 s4  = B"00000000000000100",  -- TD = BD, BD = BD - deltamult*(D^i)*BDprev, loadbdtemp
			 s5  = B"00000000000000001",  -- load BD, check 2L <= m?
			 s6  = B"00000001000000010",  -- L = m+1-L, i=1, BDprev = BDtemp, olddelta = delta

			 s8  = B"00000010000001000",  -- inc mloop, shift synregs left

-- calc omega
			 s10 = B"00011000000100100",  -- loadbdtemp, initialize omega, clearbd
			 s11 = B"00010000000010011",  -- loadbdprev, loadbd, shiftsynright
			
			 s12 = B"01010100000010001",  -- synshiftright, shiftbdprev_ml, incomega, loadbd

			 s99 = B"00100000000000000");

BEGIN

mcmp[] = check;
omegacmp[] = check-1; 
one[] = 1;

--*********************
--*** STATE MACHINE ***
--*********************

mx.clk = sysclk;
mx.reset = reset;

CASE mx IS

	WHEN s0 =>
	  IF (go == VCC) THEN
		mx = s1;
		else
		mx = S0;
	  END IF;

	WHEN s1 => 
	  if eras_zero[wide] == VCC then
			mx = S1b;
		else
			mx = S2a;
		end if;

	When S1b => mx = S1c;

when S1c =>
	  if init_syn[wide] == VCC then
			mx = Sw1;
		else
			mx = S1e;
		end if;

When S1d => mx = S1b;
When S1e => mx = S2a;
When S2a => mx = S2b;

WHEN s2b =>
	  IF (mchk[wide] == VCC) THEN
		mx = s77;
	  ELSE	
		mx = s10;
	  END IF;
	
	WHEN s77 =>	mx = s3;

	WHEN s3 =>
	  IF (deltazero[m] == VCC) THEN
		mx = s4;
	  ELSE
		mx = s8;
	  END IF;

	WHEN s4 => mx = s5;

	WHEN s5 =>
	  IF (tlm == VCC) THEN
		mx = s6;
	  ELSE
		mx = s8;
	  END IF;

 	WHEN s6 =>	mx = s8;

	WHEN s8 =>	mx = s2b;

	WHEN s10 =>	mx = s11;
	WHEN s11 =>	mx = s12;

	WHEN s12 =>
   	IF (omegachk[wide] == VCC) THEN
		  mx = s12;
		ELSE
		  mx = s99;
		END IF;

	WHEN s99 =>	mx = s99;
 
END CASE;

loadbd = mst[1];
loadbdprev = mst[2];
loadbdtemp = mst[3];
shiftsynleft = mst[4];
shiftsynright = mst[5];
clearbd = mst[6];
shiftbdprev_lm = mst[7];
deltacalc = mst[8];
newdelta = mst[9];
olddelta = mst[10];
incm = mst[11]; 
incomega = mst[12]; 
initomega = mst[13]; 
calcomega = mst[14];
massdone = mst[15];
shiftbdprev_ml = mst[16];
loadsyn = mst[17];
load_llnum = olddelta;

shift_sh_sel = shiftbdprev_ml;


--************************
--*** SYNDROME SECTION ***
--************************

synreg[][].clk = sysclk;

synreg[1][] = (syn[1][] & !shiftsynleft) # (synreg[2][] & shiftsynleft);
synreg[1][].ena = loadsyn # shiftsynleft;
FOR k IN 2 TO check-1 GENERATE
  synreg[k][] = (syn[k][] & !shiftsynleft & !shiftsynright) # 
				  (synreg[k+1][] & shiftsynleft) # (synreg[k-1][] & shiftsynright);
		synreg[k][].ena = loadsyn # shiftsynleft # shiftsynright;
END GENERATE;
synreg[check][] = (syn[check][] & !shiftsynleft & !shiftsynright) #
                  (synreg[1][] & shiftsynleft) #
									(synreg[check-1][] & shiftsynright);
	synreg[check][].ena = loadsyn # shiftsynleft # shiftsynright;


--******************
--*** BD-OMEGA SECTION ***
--******************

-- load onereg with zero after first shift
--onereg[] = (one[] & !shiftbdprev);
onereg = loadsyn # loadbdprev;
onereg.ena = shiftbdprev_lm # loadsyn # loadbdprev;
onereg.clk = sysclk;
onenode[1] = onereg;
onenode[m..2] = 0;
 
FOR k IN 1 TO check GENERATE
  bd[k][] = (addvec[k][] & !clearbd);
  bd[K][].ena = (!omsel[k] & loadbd) # clearbd;
END GENERATE;

bd[][].clk = sysclk;
bd[][].clrn = !reset;


omsel[][].clk = sysclk;
omsel[][].ena = incomega;
omsel[][].clrn = !reset;

omsel[1] = !reset;
FOR k IN 2 TO check GENERATE
	omsel[K] = omsel[K-1];
END GENERATE;

bdprev[1][] = ((bdtemp[1][] & !shiftbdprev_ml & !shiftbdprev_lm & !loadsyn) #
              (eras_pos[1][] & !shiftbdprev_ml & !shiftbdprev_lm & loadsyn) #
              (onenode[] & !shiftbdprev_ml & shiftbdprev_lm) #
              (bdprev[2][] & shiftbdprev_ml & !shiftbdprev_lm));
FOR k IN 2 TO check-1 GENERATE
  bdprev[k][] = ((bdtemp[K][] & !shiftbdprev_ml & !shiftbdprev_lm & !loadsyn) #
              (eras_pos[K][] & !shiftbdprev_ml & !shiftbdprev_lm & loadsyn) #
              (bdprev[K-1][] & !shiftbdprev_ml & shiftbdprev_lm) #
              (bdprev[K+1][] & shiftbdprev_ml & !shiftbdprev_lm));

END GENERATE;
bdprev[check][] = ((bdtemp[check][] & !shiftbdprev_ml & !shiftbdprev_lm & !loadsyn) #
              (eras_pos[check][] & !shiftbdprev_ml & !shiftbdprev_lm & loadsyn) #
              (bdprev[check-1][] & !shiftbdprev_ml & shiftbdprev_lm) #
              (bdprev[1][] & shiftbdprev_ml & !shiftbdprev_lm));


bdprev[][].clk = sysclk;
bdprev[][].ena = loadbdprev # shiftbdprev_lm # shiftbdprev_ml # loadsyn;
bdprev[][].clrn = !reset;


sh_sel[].clk = sysclk;
sh_sel[].ena = shift_sh_sel;
sh_sel[].clrn = !reset;
sh_sel[1] = VCC;
FOR k IN 2 TO check GENERATE
	sh_sel[K] = sh_sel[K-1];
end generate;

bdtemp[][] = (bd[][] & !loadsyn) # (eras_pos[][] & loadsyn);
bdtemp[][].ena = loadbdtemp # loadsyn;
bdtemp[][].clk = sysclk;
bdtemp[][].clrn = !reset;  

--********************
--*** CORE SECTION ***
--********************

bdleft[][] = bdprev[][];
erasright[1][] = 1;
mulsum[1][] = mulout[1][] $ synreg[1][];

FOR K IN 2 TO check GENERATE
  erasright[K][] = bd[K-1][];
  -- calculate new delta
  mulsum[k][] = mulout[k][] $ mulsum[k-1][];
END GENERATE;

-- expand check
FOR k IN 1 to check GENERATE

	erasleft[K][] = (bdprev[1][] & sh_sel[k]) # (bdtemp[k][] & !sh_sel[K]);

--*** calculate new delta ***
  deltaleft[k][] = synreg[check+1-k][];
  deltaright[k][] = bd[k][]; 

-- calculate new bd vector
	bdright[k][] = deltamult[];

  addvec[k][] = bd[k][] $ mulout[k][]; -- gfadd 

-- calculate omega
  omegaleft[k][] = synreg[k][];
  omegaright[k][] = (bd[1][] & !initomega) # (one[] & initomega);

-- multiply
  mulleft[k][] =  ((erasleft[K][] & deltacalc & calcomega) #
  								(deltaleft[k][] & deltacalc & !calcomega) # 
                  (bdleft[k][] & !deltacalc & !calcomega) #
                  (omegaleft[k][] & !deltacalc & calcomega));
  mulright[k][] = ((erasright[K][] & deltacalc & calcomega) #
  								(deltaright[k][] & deltacalc & !calcomega) #
                  (bdright[k][] & !deltacalc & !calcomega) # 
                  (omegaright[k][] & !deltacalc & calcomega));

  mulout[k][] = gfmul (mulleft[k][], mulright[k][])	WITH (m = m, irrpol = irrpol);

END GENERATE;


mulleft[][].clk = sysclk;
mulright[][].clk = sysclk;


delta[] = mulsum[check][];
delta[].clk = sysclk;
delta[].ena = newdelta;
delta[].clrn = !reset;

deltaprev[] = delta[];
deltaprev[].clk = sysclk;
deltaprev[].ena = olddelta;
deltaprev[m..2].clrn = !reset;
deltaprev[1].prn = !reset;

deltamult[] = gfdiv (delta[], deltaprev[])
               WITH (m=m, irrpol=irrpol, inv_file = inv_file);
deltamult[].clk = sysclk;

deltazero[1] = delta[1];
FOR k IN 2 TO m GENERATE
  deltazero[k] = delta[k] # deltazero[k-1];
END GENERATE;

--****************
--*** COUNTERS ***
--****************

mloop[] = mcount.q[];
mcount.clock = sysclk;
mcount.cnt_en = incm;
mcount.aclr = reset;

mchk[1] = mloop[1] $ mcmp[1];
eras_zero[1] = num_eras_q[1];
init_syn[1] = mloop[1] $ num_eras_q[1];
omegachk[1] = omegaloop[1] $ omegacmp[1];
FOR k IN 2 TO wide GENERATE
  mchk[k] = mchk[k-1] # (mloop[k] $ mcmp[k]);
	eras_zero[k] = num_eras_q[k] # eras_zero[k-1];
  init_syn[k] = init_syn[k-1] # (mloop[k] $ num_eras_q[k]);
  omegachk[k] = omegachk[k-1] # (omegaloop[k] $ omegacmp[k]);
END GENERATE;


--onewide[] = 1;
-- L = M+1-L

--(llnuma[],,) = lpm_add_sub ( VCC, mloop[], llnum[],,,)
--				  WITH (LPM_WIDTH = wide, LPM_DIRECTION = "SUB");

add_sub1.cin = VCC;
add_sub1.dataa[] = mloop[];
add_sub1.datab[] = llnum[];
llnuma[] = add_sub1.result[];

--(llnumb[],,) = lpm_add_sub ( GND, num_eras_q[], onewide[],,,)
--				  WITH (LPM_WIDTH = wide, LPM_DIRECTION = "ADD");

add_sub2.cin = GND;
add_sub2.dataa[] = num_eras_q[];
add_sub2.datab[] = 1;
llnumb[] = add_sub2.result[];

--(llnumnode[],,) = lpm_add_sub ( GND, llnuma[], llnumb[],,,)
--				  WITH (LPM_WIDTH = wide, LPM_DIRECTION = "ADD");

add_sub3.cin = GND;
add_sub3.dataa[] = llnuma[];
add_sub3.datab[] = llnumb[];
llnumnode[] = add_sub3.result[];

llnum[] = (llnumnode[] & !loadsyn) # (num_eras[] & loadsyn);
llnum[].clk = sysclk;
llnum[].ena = load_llnum # loadsyn;

num_eras_q[].clk = sysclk;
num_eras_q[] = num_eras[];

-- 2L <= m + num_eras_q?

--(mloop_plus_eras_num[],,) = lpm_add_sub ( GND, (0,mloop[]), (0,num_eras_q[]),,,)
--				  WITH (LPM_WIDTH = wide+1, LPM_DIRECTION = "ADD");

add_sub4.cin = GND;
add_sub4.dataa[] = (0,mloop[]);
add_sub4.datab[] = (0,num_eras_q[]);
mloop_plus_eras_num[] = add_sub4.result[];

--(,,,,,tlm) = lpm_compare ( (llnum[],0), mloop_plus_eras_num[],,)
--				  WITH (LPM_WIDTH = (wide+1));

compare1.dataa[] = (llnum[],0);
compare1.datab[] = mloop_plus_eras_num[];
tlm = compare1.aleb;

omegaloop[] = omegacount.q[];
omegacount.clock = sysclk;
omegacount.cnt_en = incomega;
omegacount.aclr = reset;


--***************
--*** OUTPUTS ***
--***************

bdout[][] = bdprev[][];
omegaout[][] = bd[][];
numerr[] = llnum[];
done = massdone;

END;

⌨️ 快捷键说明

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