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

📄 forney_conv12x17.vhd

📁 一种交织算法——forney交织
💻 VHD
📖 第 1 页 / 共 2 页
字号:
LIBRARY	IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
PACKAGE CONST_PKG_BEHAV IS 
	CONSTANT INT18:INTEGER:=20;
	CONSTANT INT23:INTEGER:=0;
	CONSTANT INT24:INTEGER:=1;
	CONSTANT INT25:INTEGER:=0;
	CONSTANT INT29:INTEGER:=4;
	CONSTANT INT32:INTEGER:=2;
	CONSTANT INT33:INTEGER:=0;
END;

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.CONST_PKG_BEHAV.ALL;
PACKAGE PKG_BEHAV IS 
 	TYPE ARRAY_NATURAL_RANGE_OF_INTEGER IS ARRAY(NATURAL RANGE<>)OF INTEGER;
 	FUNCTION FUN10(P_INT1:INTEGER;P_INT2:INTEGER;P_INT3:INTEGER;P_INT4:INTEGER;P_STRING:STRING)RETURN ARRAY_NATURAL_RANGE_OF_INTEGER;
END;
PACKAGE BODY PKG_BEHAV IS 
	FUNCTION FUN10(P_INT1:INTEGER;P_INT2:INTEGER;P_INT3:INTEGER;P_INT4:INTEGER;P_STRING:STRING)RETURN ARRAY_NATURAL_RANGE_OF_INTEGER IS 
		VARIABLE TEMP_VECTOR:ARRAY_NATURAL_RANGE_OF_INTEGER(0 TO(P_INT2-1));
		CONSTANT CON_INT32:INTEGER:=32;
	BEGIN 
		IF P_INT3=INT25 THEN 
			IF P_INT1=INT23 THEN 
				FOR I IN 0 TO P_INT2-1 LOOP 
					TEMP_VECTOR(I):=I*P_INT4+1;
				END LOOP;
			ELSIF P_INT1=INT24 THEN   --该语句不执行
				FOR J IN 0 TO P_INT2-1 LOOP
 					TEMP_VECTOR(J):=(P_INT2-1-J)*P_INT4+1;
 				END LOOP;
 			END IF;
 		END IF;
		RETURN TEMP_VECTOR;
	END;
END;	--END PACKAGE BODY

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
LIBRARY STD;
USE STD.TEXTIO.ALL;
USE WORK.CONST_PKG_BEHAV.ALL;
USE WORK.PKG_BEHAV.ALL;
ENTITY FORNEY_CONV12X17 IS 	  
	GENERIC(
		C_MODE:INTEGER:=INT23;
		C_SYMBOL_WIDTH:INTEGER:=8;
		C_NUM_BRANCHES:INTEGER:=12;
		C_BRANCH_LENGTH_TYPE:INTEGER:=0;
		C_BRANCH_LENGTH_CONSTANT:INTEGER:=17;
		C_BRANCH_LENGTH_FILE:STRING:="";
		C_PIPE_LEVEL:INTEGER:=INT33;
		C_HAS_CE:INTEGER:=0;
		C_HAS_SCLR:INTEGER:=0);
	PORT(CLK:IN STD_LOGIC;
		FD:IN STD_LOGIC;
		ND:IN STD_LOGIC;
		DIN:IN STD_LOGIC_VECTOR(C_SYMBOL_WIDTH-1 DOWNTO 0);
		CE:IN STD_LOGIC:='1';
		SCLR:IN STD_LOGIC:='0';
		DOUT:OUT STD_LOGIC_VECTOR(C_SYMBOL_WIDTH-1 DOWNTO 0));
END FORNEY_CONV12X17;

ARCHITECTURE BEHAVIORAL OF FORNEY_CONV12X17 IS 
	CONSTANT CON_INT:INTEGER:=INT18; --INT18=20
	SUBTYPE VECTOR_TYPE1 IS STD_LOGIC_VECTOR(C_SYMBOL_WIDTH-1 DOWNTO 0);
	SUBTYPE VECTOR_TYPE2 IS STD_LOGIC_VECTOR(0 TO C_NUM_BRANCHES-1);
	TYPE RECORD_TYPE IS RECORD 
		DATA:STD_LOGIC_VECTOR(C_SYMBOL_WIDTH-1 DOWNTO 0);
	END RECORD;
	CONSTANT CON_INT1:INTEGER:=3;
	CONSTANT CON_TIME:TIME:=1 NS;
	TYPE ARRAY_RECORD_TYPE IS ARRAY(NATURAL RANGE<>)OF RECORD_TYPE;
	CONSTANT CON_ARRAY_INTEGER:ARRAY_NATURAL_RANGE_OF_INTEGER:=FUN10(C_MODE,C_NUM_BRANCHES,C_BRANCH_LENGTH_TYPE,C_BRANCH_LENGTH_CONSTANT,C_BRANCH_LENGTH_FILE);
	--CON_ARRAY_INTEGER:=(17*11+1)(17*10+1)(17*9+1)...(17*1+1)(17*0+1)

	FUNCTION FUNCTION1(P_INT:INTEGER;P_ARRAY_INTEGER:ARRAY_NATURAL_RANGE_OF_INTEGER)RETURN INTEGER IS 
		VARIABLE TEMP_INTEGER:INTEGER;
	BEGIN 
		TEMP_INTEGER:=0;
		FOR I IN 0 TO P_INT-1 LOOP 
			IF P_ARRAY_INTEGER(I)>TEMP_INTEGER THEN 
				TEMP_INTEGER:=P_ARRAY_INTEGER(I);
			END IF;
		END LOOP;
		RETURN TEMP_INTEGER;
	END;

	CONSTANT CON_INTEGER:INTEGER:=FUNCTION1(C_NUM_BRANCHES,CON_ARRAY_INTEGER);	--CON_INTEGER=188
	FUNCTION FUNCTION2(P_INT:INTEGER;P_ARRAY:ARRAY_NATURAL_RANGE_OF_INTEGER)RETURN INTEGER IS 
		VARIABLE TEMP_INT:INTEGER;
	BEGIN 
		IF(P_ARRAY(0)-1)=0 THEN 
			TEMP_INT:=1;
		ELSE 
			TEMP_INT:=(P_ARRAY(0)-1)*P_INT;
		END IF;
		RETURN TEMP_INT;
	END;
	CONSTANT CON_INTEGER1:INTEGER:=FUNCTION2(C_NUM_BRANCHES,CON_ARRAY_INTEGER);	--CON_INTEGER1=1
	TYPE BRANCH_ARRAY_RECORD_TYPE IS ARRAY(0 TO C_NUM_BRANCHES-1,0 TO CON_INTEGER-1)OF RECORD_TYPE;	  --ARRAY(0 TO 11,0 TO 187)
	SIGNAL SIGNAL_CE:STD_LOGIC;				   
 	SIGNAL SIGNAL_SCLR:STD_LOGIC;
 	SIGNAL SIGNAL_DIN:STD_LOGIC_VECTOR((C_SYMBOL_WIDTH-1)DOWNTO 0);
	SIGNAL SIGNAL_ND:STD_LOGIC;
	SIGNAL SIGNAL_FD:STD_LOGIC;
	SIGNAL SIGNAL_BIT7:STD_LOGIC;
	SIGNAL SIGNAL_BIT8:STD_LOGIC;
	SIGNAL SIGNAL_BIT9:STD_LOGIC;
	SIGNAL SIGNAL_RFFD:STD_LOGIC;
	SIGNAL SIGNAL_BIT11:STD_LOGIC;
	SIGNAL SIGNAL_BIT12:STD_LOGIC;
	SIGNAL SIGNAL_BIT13:STD_LOGIC;
	SIGNAL SIGNAL_RECORD1:RECORD_TYPE;
	SIGNAL SIGNAL_RECORD2:RECORD_TYPE;
	SIGNAL SIGNAL_RECORD3:RECORD_TYPE;
	SIGNAL SIGNAL_VECTOR1:VECTOR_TYPE2;
	SIGNAL SIGNAL_VECTOR2:VECTOR_TYPE2;
	SIGNAL SIGNAL_VECTOR3:VECTOR_TYPE2;
	SIGNAL SIGNAL_VECTOR4:VECTOR_TYPE2;
	SIGNAL SIGNAL_VECTOR5:VECTOR_TYPE2;
	SIGNAL SIGNAL_BIT14:STD_LOGIC;
	SIGNAL SIGNAL_BIT15:STD_LOGIC;
	SIGNAL SIGNAL_BIT16:STD_LOGIC;
	SIGNAL SIGNAL_BIT17:STD_LOGIC;
	SIGNAL SIGNAL_BIT18:STD_LOGIC;
	SIGNAL SIGNAL_BIT19:STD_LOGIC;
	SIGNAL SIGNAL_VECTOR6:STD_LOGIC_VECTOR(CON_INT1 DOWNTO 0);	--CON_INT1=3
	SIGNAL SIGNAL_BIT20:STD_LOGIC;
	SIGNAL SIGNAL_VECTOR7:STD_LOGIC_VECTOR(CON_INTEGER1 DOWNTO 0);	--CON_INTEGER1=1
	SIGNAL SIGNAL_BIT21:STD_LOGIC;
	SIGNAL SIGNAL_VECTOR8:STD_LOGIC_VECTOR(CON_INTEGER1 DOWNTO 0);
	SIGNAL SIGNAL_BIT22:STD_LOGIC;
	SIGNAL SIGNAL_VECTOR9:VECTOR_TYPE1;--SYMBOL(7 DOWNTO 0)
	SIGNAL SIGNAL_BIT23:STD_LOGIC;
	SIGNAL SIGNAL_VECTOR10:ARRAY_RECORD_TYPE(0 TO C_NUM_BRANCHES-1);
	SIGNAL SIGNAL_RECORD4:RECORD_TYPE;
BEGIN 
OUTPUT_MAIN:PROCESS(SIGNAL_VECTOR9,SIGNAL_BIT23) --SIGNAL_BIT23是来自进程RDYPORT的信号
		VARIABLE TEMP_SYMBOL_OUT:VECTOR_TYPE1;
	BEGIN 
		IF(CON_INT/=INT18 AND SIGNAL_BIT23/='1')THEN 	--该语句不执行
			TEMP_SYMBOL_OUT:=(OTHERS=>'X');
		ELSE 
			TEMP_SYMBOL_OUT:=SIGNAL_VECTOR9;   --SIGNAL_VECTOR9是由进程DOUTPORT传送来的信号
		END IF;								   --
		DOUT<=TEMP_SYMBOL_OUT AFTER CON_TIME;  --
	END PROCESS;							   --
DOUTPORT:PROCESS(SIGNAL_RECORD4)			   --
	BEGIN 									   --
		SIGNAL_VECTOR9<=SIGNAL_RECORD4.DATA;   --SIGNAL_RECORD4.DATA是进程OUTPUT_SWITCH传送来的信号,SIGNAL_VECTOR9是输出给DOUT的临时信号
	END PROCESS;							   --
OUTPUT_SWITCH:PROCESS(CLK)		   --该进程用来将切换到的分支中的数据输出
	BEGIN 									   --
		IF(CLK'event AND CLK='1')THEN 
			IF SIGNAL_CE='1'THEN 
				IF SIGNAL_SCLR='0'THEN 
					IF SIGNAL_VECTOR6(CON_INT1-1)='1'THEN 			--SIGNAL_VECTOR6是来自进程NDO_DELAY_PROC , CON_INT1=3
						FOR I IN 0 TO C_NUM_BRANCHES-1 LOOP 		--
							IF SIGNAL_VECTOR5(I)='1'THEN 			--		--SIGNAL_VECTOR5是由进程SHIFTBR_SW2_OUT_PROC传送过来的信号
								SIGNAL_RECORD4<=SIGNAL_VECTOR10(I);	--				--SIGNAL_VECTOR10是由进程BPROC传送来的信号
							END IF;									--
						END LOOP;									--
					END IF;											--
				END IF;												--
			END IF;
		END IF;													--
	END PROCESS;													--
NDO_DELAY_PROC:PROCESS(CLK)								--
	BEGIN 															--
		IF(CLK'event AND CLK='1')THEN 
			IF SIGNAL_CE='1'THEN 
				IF SIGNAL_SCLR='1'OR(SIGNAL_BIT8='0')THEN 
					SIGNAL_VECTOR6<=(OTHERS=>'0');
					SIGNAL_BIT20<='0';
					SIGNAL_VECTOR6(0)<=SIGNAL_BIT11;
				ELSE 
					SIGNAL_BIT20<=SIGNAL_VECTOR6(CON_INT1-1);
					IF SIGNAL_BIT11='1'AND SIGNAL_BIT7='0'THEN 
						SIGNAL_VECTOR6<=(OTHERS=>'0');
						SIGNAL_VECTOR6(0)<='1';
					ELSE 
						SIGNAL_VECTOR6(0)<=SIGNAL_ND;		 ----SIGNAL_ND<=ND
						FOR I IN 1 TO(CON_INT1-1)LOOP 
							SIGNAL_VECTOR6(I)<=SIGNAL_VECTOR6(I-1);
						END LOOP;
					END IF;
				END IF;
			END IF;
		END IF;
	END PROCESS;
SHIFTBR_SW2_OUT_PROC:PROCESS(SIGNAL_VECTOR4)	--SIGNAL_VECTOR4是由进程DELSIGS传送来的信号
	BEGIN 
		SIGNAL_VECTOR5<=SIGNAL_VECTOR4;
	END PROCESS;
BPROC:PROCESS(CLK,SIGNAL_RECORD3) --SIGNAL_RECORD3是由DELSIGS进程传送来的信号
		VARIABLE TEMP_BRANCHES_RECORD:BRANCH_ARRAY_RECORD_TYPE;	   --ARRAY(0 TO 11,0 TO 187)
	BEGIN
		FOR I IN 0 TO C_NUM_BRANCHES-1 LOOP 
			IF CON_ARRAY_INTEGER(I)-1=0 THEN 	   --第一个分支的输入数据直接输出到缓存器SIGNAL_VECTOR10
				SIGNAL_VECTOR10(I)<=SIGNAL_RECORD3;--SIGNAL_RECORD3是由DELSIGS进程传送来的信号
			ELSIF CLK'event AND CLK='1' AND SIGNAL_CE='1'THEN 
				IF SIGNAL_BIT16='1'AND SIGNAL_VECTOR4(I)='1'THEN 	--SIGNAL_BIT16是来自进程DELSIGS的信号,SIGNAL_VECTOR4是由进程DELSIGS传送来的信号
					FOR K IN CON_ARRAY_INTEGER(I)-1-1 DOWNTO 0 LOOP 
						TEMP_BRANCHES_RECORD(I,K+1):=TEMP_BRANCHES_RECORD(I,K);	  --数据右移
					END LOOP;
					TEMP_BRANCHES_RECORD(I,0):=SIGNAL_RECORD3;					  --将输入数据赋给第I个分支的最左边的字节缓存器
				END IF;
				SIGNAL_VECTOR10(I)<=TEMP_BRANCHES_RECORD(I,CON_ARRAY_INTEGER(I)-1-1);	 --第I个分支输出的数据,也就是将第I个分支的最后一个字节缓存器的字节输出
			END IF;
		END LOOP;
	END PROCESS;
DELSIGS:PROCESS(CLK)   --SIGNAL_ACLR是来自进程ACLR_PROC的信号
	BEGIN 
		IF CLK'event AND CLK='1'THEN 
			IF SIGNAL_CE='1'THEN 
				IF SIGNAL_SCLR='1'THEN 		  --该语句不执行
					SIGNAL_VECTOR4<=(OTHERS=>'0');
					SIGNAL_VECTOR3<=(OTHERS=>'0');
					SIGNAL_BIT19<='0';
					SIGNAL_BIT18<='0';
					SIGNAL_BIT17<='0';
				ELSE 
					SIGNAL_BIT16<=SIGNAL_BIT15;		   --SIGNAL_ND<=ND
					IF SIGNAL_BIT11='1'AND SIGNAL_BIT7='0'THEN 
						SIGNAL_BIT19<='0';
						SIGNAL_BIT18<='0';
						SIGNAL_BIT17<='1';
						SIGNAL_RECORD3.DATA<=(OTHERS=>'0');
						SIGNAL_RECORD2.DATA<=(OTHERS=>'0');
						SIGNAL_VECTOR4<=(OTHERS=>'0');
						SIGNAL_VECTOR3<=(OTHERS=>'0');
					ELSE 
						SIGNAL_BIT19<=SIGNAL_BIT18;
						SIGNAL_BIT18<=SIGNAL_BIT17;
						SIGNAL_BIT17<=SIGNAL_BIT11;		--SIGNAL_BIT11是来自进程VFD_R_PROC的信号
						SIGNAL_RECORD3<=SIGNAL_RECORD2;	--SIGNAL_RECORD3作为与进程BPROC之间进行通信的信号,是输入数据的三级缓存器
						SIGNAL_RECORD2<=SIGNAL_RECORD1;	--SIGNAL_RECORD1是由下下一个进程SHIFTBR送来的信号,是输入数据的二级缓存器
						SIGNAL_VECTOR4<=SIGNAL_VECTOR3;
						SIGNAL_VECTOR3<=SIGNAL_VECTOR2;	--SIGNAL_VECTOR2是来自进程SHIFTBR的信号

⌨️ 快捷键说明

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