📄 fdct.vhd.svn-base
字号:
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 + -