基於FPGA的圖像比例縮放

哈哈哈

經過了一下午的鑽研

終於可以得到縮放的圖像了

這裏的圖像並不是高級的縮放

而是簡單的隔比例的像素顯示

在思考問題的時候我們往往正向思維,在我的正向思維怎麼都不可得的時候看到了一篇文章,可以反向思維。

既我們事先選定縮放後的左邊,然後通過計算得到原圖像的左邊,然後給地址在ROM中查找即可。

部分程序如下:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    14:43:19 08/12/2016 
// Design Name: 
// Module Name:    pic_display 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module pic_display
	#(parameter Column_Addr_Loc_L = 10'd64,
	parameter Row_Addr_Loc_L = 10'd64,
	parameter Pic_Size = 10'd32)
	(
	CLK,
	nRESET,
	Column_Addr_Sig, 
	Row_Addr_Sig,
	Red_Sig, 
	Ready_Sig,
	Rom_Data_red,
	Rom_Addr
//	Reduce_en
    );
	 
	input CLK;
	input nRESET;
	input [9:0]Column_Addr_Sig;
	input [9:0]Row_Addr_Sig;
	input Ready_Sig;
	input [7:0]Rom_Data_red;
	
//	input Reduce_en;
	
	output  [7:0]Red_Sig;
	output reg [11:0]Rom_Addr;
	 
	parameter Reduce_en = 1'd1;

	wire [9:0]Row_Addr_Loc_H;
	wire [9:0]Column_Addr_Loc_H;
	
	assign Column_Addr_Loc_H = Column_Addr_Loc_L + Pic_Size;
	assign Row_Addr_Loc_H = Row_Addr_Loc_L + Pic_Size;

	reg [7:0]data_red;
	
	always@(posedge CLK or negedge nRESET)
	begin
		if(!nRESET)
		begin
			data_red <= 8'd0;
		end
		
		else if (Column_Addr_Sig >= Column_Addr_Loc_L && Column_Addr_Sig <= Column_Addr_Loc_H && Row_Addr_Sig >= Row_Addr_Loc_L && Row_Addr_Sig <= Row_Addr_Loc_H)
		begin
			if( Column_Addr_Sig == Column_Addr_Loc_L && Row_Addr_Sig == Row_Addr_Loc_L)
			begin
				Rom_Addr <= 12'd0;
				data_red <= Rom_Data_red;
			end
			
			else
			begin
				if(Reduce_en)
				begin
					Rom_Addr <= (Row_Addr_Sig - Row_Addr_Loc_L)*2 + (Column_Addr_Sig - Column_Addr_Loc_L)* 2 * (Pic_Size *2);  
					data_red <= Rom_Data_red;
				end
				
				else
				begin
					Rom_Addr <= Rom_Addr;
				end
			end
		end
		
		else
		begin
			data_red <= 8'd0;
		end
	end
	
//	reg Display_zone;
//	reg [7:0]display_data;
//	
//	always@(posedge CLK or negedge nRESET)
//	begin
//		if(!nRESET)
//		begin
//			display_data <= 8'd0;
//		end
//		
//		else 
//		begin
//			if(Column_Addr_Sig > 10'd96 && Column_Addr_Sig < 10'd128 && Row_Addr_Sig > 10'd96 && Row_Addr_Sig < 10'd128)
//			begin
//				display_data <= data_red;
//			end
//			
//			else
//			begin
//				display_data <= 8'd0;
//			end
//		end
//	end
	
//	assign Red_Sig =  (Ready_Sig && Display_zone) ? data_red : 8'b1;
	assign Red_Sig =  (Ready_Sig) ? data_red : 8'b1;
	

endmodule

其餘程序連接:http://blog.csdn.net/sinat_25326461/article/details/52188655

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章