📄 forney_conv12x17.vhd
字号:
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 + -