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

📄 fdct.vhd.svn-base

📁 Pure hardware JPEG Encoder design. Package includes vhdl source code, test bench, detail design docu
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
          if x_block_cnt = unsigned(img_size_x)-8 then            x_block_cnt <= (others => '0');            -- vertical block counter            if y_block_cnt = unsigned(img_size_y)-8 then              y_block_cnt <= (others => '0');              eoi_fdct <= '1';                else              y_block_cnt <= y_block_cnt + 8;            end if;          else            x_block_cnt <= x_block_cnt + 8;          end if;        else          cmp_idx <=cmp_idx + 1;        end if;                x_block_cnt_cur <= x_block_cnt;        y_block_cnt_cur <= y_block_cnt;        cur_cmp_idx     <= cmp_idx;      end if;            -- wait until FIFO becomes half full      if rd_started = '1' and (bf_fifo_hf_full = '1' or cur_cmp_idx /= 0) then        rd_en      <= '1';        rd_started <= '0';      end if;            bf_fifo_rd_s   <= '0';      fram1_rd       <= '0';      -- stall reading from input FIFO and writing to output FIFO       -- when output FIFO is almost full      if rd_en = '1' and unsigned(fifo1_count) < 256-64 then        -- read request goes to BUF_FIFO only for component 0.         if cur_cmp_idx = 0 then           bf_fifo_rd_s <= '1';        end if;                -- count number of samples read from input in one run        if input_rd_cnt = 64-1 then          rd_en        <= '0';          start_int    <= '1' and not eoi_fdct;          eoi_fdct     <= '0';        else          input_rd_cnt <= input_rd_cnt + 1;        end if;        -- FRAM read enable        fram1_rd <= '1';      end if;      -- increment FRAM1 read address      if fram1_rd_d(4) = '1' then        fram1_raddr <= std_logic_vector(unsigned(fram1_raddr) + 1);      end if;          end if;  end process;    -------------------------------------------------------------------  -- FDCT with input level shift  -------------------------------------------------------------------  U_MDCT : entity work.MDCT	port map  (	  		clk          => CLK,		rst          => RST,    dcti         => mdct_data_in,    idv          => mdct_idval,    odv          => mdct_odval,    dcto         => mdct_data_out,    odv1         => odv1,    dcto1        => dcto1	);     mdct_idval   <= fram1_rd_d(8);    R_s <= signed('0' & fram1_q(7 downto 0));  G_s <= signed('0' & fram1_q(15 downto 8));  B_s <= signed('0' & fram1_q(23 downto 16));    -------------------------------------------------------------------  -- Mux1  -------------------------------------------------------------------  p_mux1 : process(CLK, RST)  begin    if RST = '1' then      mdct_data_in <= (others => '0');    elsif CLK'event and CLK = '1' then      case cur_cmp_idx_d9 is        when "00" =>           mdct_data_in <= std_logic_vector(Y_8bit);        when "01" =>           mdct_data_in <= std_logic_vector(Cb_8bit);        when "10" =>           mdct_data_in <= std_logic_vector(Cr_8bit);        when others =>          null;      end case;    end if;  end process;    -------------------------------------------------------------------  -- FIFO1  -------------------------------------------------------------------  U_FIFO1 : entity work.FIFO     generic map  (        DATA_WIDTH        => 12,        ADDR_WIDTH        => 8  )  port map   (                rst               => RST,        clk               => CLK,        rinc              => fifo1_rd,        winc              => fifo1_wr,        datai             => fifo_data_in,        datao             => fifo1_q,        fullo             => fifo1_full,        emptyo            => fifo1_empty,        count             => fifo1_count  );    fifo1_wr     <= mdct_odval;  fifo_data_in <= mdct_data_out;        -------------------------------------------------------------------  -- FIFO rd controller  -------------------------------------------------------------------  p_fifo_rd_ctrl : process(CLK, RST)  begin    if RST = '1' then      fifo1_rd     <= '0';      fifo_rd_arm  <= '0';      fifo1_rd_cnt <= (others => '0');      fifo1_q_dval <= '0';    elsif CLK'event and CLK = '1' then      fifo1_rd     <= '0';            fifo1_q_dval <= fifo1_rd;          if start_pb = '1' then        fifo_rd_arm  <= '1';        fifo1_rd_cnt <= (others => '0');      end if;            if fifo_rd_arm = '1' then              if fifo1_rd_cnt = 64-1 then          fifo_rd_arm  <= '0';          fifo1_rd     <= '1';        elsif fifo1_empty = '0' then          fifo1_rd     <= '1';          fifo1_rd_cnt <= fifo1_rd_cnt + 1;        end if;            end if;    end if;  end process;    -------------------------------------------------------------------  -- write counter  -------------------------------------------------------------------  p_wr_cnt : process(CLK, RST)  begin    if RST = '1' then      wr_cnt   <= (others => '0');      ready_pb <= '0';      xw_cnt   <= (others => '0');      yw_cnt   <= (others => '0');      writing_en <= '0';    elsif CLK'event and CLK = '1' then      ready_pb <= '0';          if start_pb = '1' then        wr_cnt <= (others => '0');        xw_cnt <= (others => '0');        yw_cnt <= (others => '0');        writing_en  <= '1';      end if;            if writing_en = '1' then        if fifo1_q_dval = '1' then          if wr_cnt = 64-1 then            wr_cnt <= (others => '0');            ready_pb <= '1';            writing_en <= '0';          else            wr_cnt <= wr_cnt + 1;          end if;                    if yw_cnt = 8-1 then            yw_cnt <= (others => '0');            xw_cnt <= xw_cnt+1;          else            yw_cnt <= yw_cnt+1;          end if;        end if;      end if;    end if;  end process;    -------------------------------------------------------------------  -- RGB to YCbCr conversion  -------------------------------------------------------------------  p_rgb2ycbcr : process(CLK, RST)  begin    if RST = '1' then      Y_Reg_1  <= (others => '0');      Y_Reg_2  <= (others => '0');      Y_Reg_3  <= (others => '0');      Cb_Reg_1 <= (others => '0');      Cb_Reg_2 <= (others => '0');      Cb_Reg_3 <= (others => '0');      Cr_Reg_1 <= (others => '0');      Cr_Reg_2 <= (others => '0');      Cr_Reg_3 <= (others => '0');      Y_Reg    <= (others => '0');      Cb_Reg   <= (others => '0');      Cr_Reg   <= (others => '0');    elsif CLK'event and CLK = '1' then      Y_Reg_1  <= R_s*C_Y_1;      Y_Reg_2  <= G_s*C_Y_2;      Y_Reg_3  <= B_s*C_Y_3;            Cb_Reg_1 <= R_s*C_Cb_1;      Cb_Reg_2 <= G_s*C_Cb_2;      Cb_Reg_3 <= B_s*C_Cb_3;            Cr_Reg_1 <= R_s*C_Cr_1;      Cr_Reg_2 <= G_s*C_Cr_2;      Cr_Reg_3 <= B_s*C_Cr_3;            Y_Reg  <= Y_Reg_1 + Y_Reg_2 + Y_Reg_3;      Cb_Reg <= Cb_Reg_1 + Cb_Reg_2 + Cb_Reg_3 + to_signed(128*16384,Cb_Reg'length);      Cr_Reg <= Cr_Reg_1 + Cr_Reg_2 + Cr_Reg_3 + to_signed(128*16384,Cr_Reg'length);    end if;  end process;    Y_8bit  <= unsigned(Y_Reg(21 downto 14));  Cb_8bit <= unsigned(Cb_Reg(21 downto 14));  Cr_8bit <= unsigned(Cr_Reg(21 downto 14));      -------------------------------------------------------------------  -- DBUF  -------------------------------------------------------------------  U_RAMZ : entity work.RAMZ  generic map  (       RAMADDR_W     => 7,      RAMDATA_W     => 12  )  port map  (              d           => dbuf_data,        waddr       => dbuf_waddr,        raddr       => dbuf_raddr,        we          => dbuf_we,        clk         => CLK,                            q           => dbuf_q  );    dbuf_data  <= fifo1_q;  dbuf_we    <= fifo1_q_dval;  dbuf_waddr <= (not zz_buf_sel) & std_logic_vector(yw_cnt & xw_cnt);  dbuf_raddr <= zz_buf_sel & zz_rd_addr;end architecture RTL;--------------------------------------------------------------------------------- Architecture: end-------------------------------------------------------------------------------

⌨️ 快捷键说明

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