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

📄 trellis1_synth.vhd

📁 turbo码的verilog程序
💻 VHD
字号:
--------------------------------------------------------------------------                                                              --------  trellis1_synth.vhd                                          --------                                                              --------  This file is part of the turbo decoder IP core project      --------  http://www.opencores.org/projects/turbocodes/               --------                                                              --------  Author(s):                                                  --------      - David Brochart(dbrochart@opencores.org)               --------                                                              --------  All additional information is available in the README.txt   --------  file.                                                       --------                                                              ------------------------------------------------------------------------------                                                              -------- Copyright (C) 2005 Authors                                   --------                                                              -------- This source file may be used and distributed without         -------- restriction provided that this copyright statement is not    -------- removed from the file and that any derivative work contains  -------- the original copyright notice and the associated disclaimer. --------                                                              -------- This source file is free software; you can redistribute it   -------- and/or modify it under the terms of the GNU Lesser General   -------- Public License as published by the Free Software Foundation; -------- either version 2.1 of the License, or (at your option) any   -------- later version.                                               --------                                                              -------- This source is distributed in the hope that it will be       -------- useful, but WITHOUT ANY WARRANTY; without even the implied   -------- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      -------- PURPOSE. See the GNU Lesser General Public License for more  -------- details.                                                     --------                                                              -------- You should have received a copy of the GNU Lesser General    -------- Public License along with this source; if not, download it   -------- from http://www.opencores.org/lgpl.shtml                     --------                                                              --------------------------------------------------------------------------architecture synth of trellis1 is    signal pathIdReg    : ARRAY8d;    signal reg          : ARRAY_TREL1_LENx8;begin    process (clk, rst)        variable free       : std_logic_vector(7 downto 0);        variable freeBeg    : std_logic_vector(7 downto 0);        variable pastState  : ARRAY8d;        variable pathId     : ARRAY8d;        variable current_state  : INT3BIT;        variable freePathId : INT3BIT;        variable state_l3   : INT2BIT;        variable state_l2   : INT2BIT;        variable state_l1   : INT2BIT;        variable outState_l2    : std_logic_vector(2 downto 0);        variable outState_l1    : std_logic_vector(2 downto 0);    begin        if rst = '0' then            for i in 0 to 3 loop                stateL1(i) <= (others => '0');            end loop;            selStateL1 <= (others => '0');            selStateL2 <= (others => '0');            selTransL2 <= (others => '0');            for i in 0 to 7 loop                pathIdReg(i) <= 0;                for j in 0 to TREL1_LEN - 1 loop                    reg(j * 8 + i) <= 0;                end loop;            end loop;        elsif clk = '1' and clk'event then            free := "11111111";            for i in 0 to 7 loop                pastState(i) := TRANS2STATE(i * 4 + conv_integer(unsigned(selTrans(i))));                pathId(i) := pathIdReg(pastState(i));                free(pathId(i)) := '0';            end loop;            freeBeg := "11111111";            for i in 0 to 7 loop                current_state   := i;                if freeBeg(pathId(current_state)) = '1' then                    reg(pathId(current_state)) <= conv_integer(unsigned(std_logic_vector(conv_unsigned(current_state, 3))(1 downto 0)));                    freeBeg(pathId(i)) := '0';                    pathIdReg(current_state) <= pathId(current_state);                    for j in 0 to TREL1_LEN - 2 loop                        reg((j + 1) * 8 + pathId(current_state)) <= reg(j * 8 + pathId(current_state));                    end loop;                else                    if free(0) = '1' then                        freePathId := 0;                    end if;                    if free(1 downto 0) = "10" then                        freePathId := 1;                    end if;                    if free(2 downto 0) = "100" then                        freePathId := 2;                    end if;                    if free(3 downto 0) = "1000" then                        freePathId := 3;                    end if;                    if free(4 downto 0) = "10000" then                        freePathId := 4;                    end if;                    if free(5 downto 0) = "100000" then                        freePathId := 5;                    end if;                    if free(6 downto 0) = "1000000" then                        freePathId := 6;                    end if;                    if free(7 downto 0) = "10000000" then                        freePathId := 7;                    end if;                    reg(freePathId) <= conv_integer(unsigned(std_logic_vector(conv_unsigned(current_state, 3))(1 downto 0)));                    free(freePathId) := '0';                    pathIdReg(current_state) <= freePathId;                    for j in 0 to TREL1_LEN - 2 loop                        reg((j + 1) * 8 + freePathId) <= reg(j * 8 + pathId(current_state));                    end loop;                end if;            end loop;            state_l3 := reg((TREL1_LEN - 3) * 8 + pathId(conv_integer(unsigned(selState))));            state_l2 := reg((TREL1_LEN - 2) * 8 + pathId(conv_integer(unsigned(selState))));            state_l1 := reg((TREL1_LEN - 1) * 8 + pathId(conv_integer(unsigned(selState))));            outState_l2(2) := std_logic_vector(conv_unsigned(state_l3, 2))(1) xor (std_logic_vector(conv_unsigned(state_l3, 2))(0) xor std_logic_vector(conv_unsigned(state_l2, 2))(1));            outState_l2(1 downto 0) := std_logic_vector(conv_unsigned(state_l2, 2));            outState_l1(2) := std_logic_vector(conv_unsigned(state_l2, 2))(1) xor (std_logic_vector(conv_unsigned(state_l2, 2))(0) xor std_logic_vector(conv_unsigned(state_l1, 2))(1));            outState_l1(1 downto 0) := std_logic_vector(conv_unsigned(state_l1, 2));            selStateL1 <= outState_l1;            selStateL2 <= outState_l2;            selTransL2 <= std_logic_vector(conv_unsigned(STATE2TRANS(conv_integer(unsigned(outState_l2)) * 4 + state_l1), 2));            for i in 0 to 3 loop                stateL1(i) <= std_logic_vector(conv_unsigned(TRANS2STATE(conv_integer(unsigned(outState_l2)) * 4 + i), 3));            end loop;        end if;    end process;end;

⌨️ 快捷键说明

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