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

📄 bms_eras_str_half.tdf

📁 CodeVisionAVR C Library Functions Reference CodeVisionAVR C 库函数介绍 译自CodeVisionAVR C Compiler Help
💻 TDF
📖 第 1 页 / 共 2 页
字号:
-------------------------------------------------------------------------
-------------------------------------------------------------------------
--
-- Revision Control Information
--
-- $Workfile:   bms_eras_str_half.tdf  $
-- $Archive:   P:/RS_eras/units/Dec_str/ahdl/bms_eras_str_half.tdv  $
--
-- $Revision:   1.6  $
-- $Date:   12 Aug 1999 13:08:22  $
-- $Author			:  Alejandro Diaz-Manero
--
-- Project      :  RS_eras
--
-- Description	:  Berlekamp-Massey algorithm for streaming RS decoder supporting
--                 erasures and for half speed.
--
-- 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 = 4,			-- GF size (2^m)
irrpol = 19,	-- field polynomial
check = 4, 		-- number of check symbols (= # of syndromes)
inv_file = "inv_4_19.hex"
);

constant wide = ceil(log2(check+1));
constant nummult = ceil(check DIV 2);
constant odd = nummult > floor(check DIV 2) ? 1:0;


subdesign bms_eras_str_half
(
 sysclk, reset, latchsyn, 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], omsel[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[nummult..1][m..1], mulright[nummult..1][m..1], deltamult[m..1] : dffe; 
mulout[nummult..1][m..1] : node;
mulsum[nummult..1][m..1], addvec[check..1][m..1] : node;
deltazero[m..1] : node;
predelta[m..1], delta[m..1], deltaprev[m..1] : dffe;

mcount, omegacount : lpm_counter WITH (LPM_WIDTH = wide);
llnuma[wide..1], llnumb[wide..1] : node;
llnum[wide..1], num_eras_q[wide..1] : dffe;
llnumnode[wide..1] : node;
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;  

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

loadbdleft, loadbdright, loadbdprev, loadbdtemp, load_llnum, multmux : node; -- 1 - 4
shiftsynleft, shiftsynright, clearbd, shiftbdprev_ml, shiftbdprev_lm, shift_sh_sel : node; -- 6 - 9 
deltacalc, newdelta, olddelta : node; -- 10 - 12
incm, tlm : node; -- 13
incomega, initomega, calcomega : node; -- 14 - 18 
massdone : node; -- 19

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[19..1])
	   WITH STATES
			(s0  = B"0001000001000000000",

			 s1  = B"0001000001000010000",  -- load syndromes, multmux
			 s1a = B"0001000001000010010",  -- load bdright, multmux
			 s1b = B"0001000001000000000",  -- keep selecting deltacalc calomega
			 s1c = B"1101001001000100001",  -- shift syndrome as num erasures,
                                         -- incm, load bdleft, shiftbdprev_ml, shift_sh_sel
			 s1d = B"0001000001000010000",  -- multmux
			 s1e = B"0000000000000001000",  -- load bdtemp
			 s2a = B"0000000000000000100",  -- load bdprev not inc mloop
			 s2b = B"0000000011100000000",  -- calc new delta = Sm + (series)B(j)*S(m-j), shiftbdprev_lm

			 s77a= B"0000000011000010000",  -- 1 pipe stage to top of gfmuls, multmux
			 s77b= B"0000000011000010000",  -- 1 pipe stage to top of gfmuls

			 s3  = B"0000000000000000000",  -- if new delta <> 0, calc new BD

			 s4  = B"0000000000000001000",  -- TD = BD, BD = BD - deltamult*(D^i)*BDprev
			 s5  = B"0000000000000010001",  -- load first half BD  , multmux
			 s5a = B"0000000000000010010",  -- load second half BD, check 2L <= m?
			 s6  = B"0000000100000000100",  -- L = m+1-L, i=1, BDprev = BDtemp, olddelta = delta, load llnum
			 s8  = B"0000001000000100000",  -- inc mloop, shift synregs left

			 s10 = B"0001100000010001000",  -- initialize omegaleft, loadbdtemp, clearbd
			 s11 = B"0001100000001010101",  -- initialize omegaright, loadbdprev, shift synregs right
			
			 s12 = B"0001010000000000010",  -- calc omegaleft, load omegaright, incomega
			 s13 = B"0101000000001010001",  -- calc omegaright, load omegaleft, synshiftright, shiftbdprev_ml

			 s14 = B"0100000000000000000",  -- last shiftbdprev_ml

			 s99 = B"0010000000000000000");


BEGIN

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

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

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


	CASE mx IS

	WHEN s0 =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSE
	    mx = s1;
	  END IF;

	when S1 =>
	 if (reset == VCC) then
	 		mx = S0;
	 elsif eras_zero[wide] == VCC then
			mx = S1a;
	 else
			mx = S2a;
	 end if;

	WHEN s1a =>
	  IF (reset == VCC) THEN
			mx = s0;
	  ELSE
	    mx = s1b;
	  END IF;

	WHEN s1b =>
	  IF (reset == VCC) THEN
			mx = s0;
	  ELSE
	    mx = s1c;
	  END IF;

	WHEN s1c =>
	  IF (reset == VCC) THEN
			mx = s0;
	  ELSE
	    mx = s1d;
	  END IF;

	WHEN s1d =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSIF (init_syn[wide] == VCC) THEN
		mx = s1a;
	  ELSE	
		mx = s1e;
	  END IF;

  WHEN s1e =>
	  IF (reset == VCC) THEN
			mx = s0;
	  ELSE
	    mx = s2a;
	  END IF;

	WHEN s2a =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSE	
		mx = s2b;
	  END IF;

	WHEN s2b =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSIF (mchk[wide] == VCC) THEN
		mx = s77a;
	  ELSE	
		mx = s10;
	  END IF;

	WHEN s77a =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSE
		mx = s77b;
	  END IF;

	WHEN s77b =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSE
		mx = s3;
	  END IF;

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

	WHEN s4 =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSE
		mx = s5;
	  END IF;

	WHEN s5 =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSE
		mx = s5a;
	  END IF;

	WHEN s5a =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSIF (tlm == VCC) THEN
		mx = s6;
	  ELSE
		mx = s8;
	  END IF;

 	WHEN s6 =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSE
		mx = s8;
	  END IF;

	WHEN s8 =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSE
		mx = s2b;
	  END IF;

	WHEN s10 =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSE
		mx = s11;
	  END IF;

	WHEN s11 =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSE
		mx = s12;
	  END IF;

	WHEN s12 =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSIF (omegachk[wide] == VCC) THEN
		mx = s13;
	  ELSE
		mx = s14;
	  END IF;

	WHEN s13 =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSE
		mx = s12;
	  END IF;

	WHEN s14 =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSE
		mx = s99;
	  END IF;

	WHEN s99 =>
	  IF (reset == VCC) THEN
		mx = s0;
	  ELSE
		mx = s99;
 	  END IF;

⌨️ 快捷键说明

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