change isp output port and crop ip
This commit is contained in:
		
							
								
								
									
										96
									
								
								Crop/crop.v
									
									
									
									
									
								
							
							
						
						
									
										96
									
								
								Crop/crop.v
									
									
									
									
									
								
							@@ -15,69 +15,77 @@ module crop #(
 | 
			
		||||
    input [3 * COLOR_DEPTH - 1:0] data_in,
 | 
			
		||||
 | 
			
		||||
    output out_en,
 | 
			
		||||
    input out_que,
 | 
			
		||||
    output reg [3 * COLOR_DEPTH - 1:0] data_out
 | 
			
		||||
);
 | 
			
		||||
    wire fifo_full, fifo_empty;
 | 
			
		||||
    localparam READ_DATA = 0;
 | 
			
		||||
    localparam HANDLE_DATA = 1;
 | 
			
		||||
    localparam SEND_DATA = 2;
 | 
			
		||||
 | 
			
		||||
    reg [1:0] state, nextState;
 | 
			
		||||
    reg [11:0] cnt_x, cnt_y;
 | 
			
		||||
    reg fifo_en;
 | 
			
		||||
    reg [3 * COLOR_DEPTH - 1:0] data;
 | 
			
		||||
 | 
			
		||||
    async_fifo #(
 | 
			
		||||
        .DSIZE(3 * COLOR_DEPTH),
 | 
			
		||||
        .ASIZE(128)
 | 
			
		||||
    ) fifo_image (
 | 
			
		||||
        .wclk(clk),
 | 
			
		||||
        .wrst_n(reset),
 | 
			
		||||
        .rclk(clk),
 | 
			
		||||
        .rrst_n(reset),
 | 
			
		||||
    // 状态切换
 | 
			
		||||
    always @(posedge clk or posedge reset) begin
 | 
			
		||||
        if (reset)
 | 
			
		||||
            state <= READ_DATA;
 | 
			
		||||
        else
 | 
			
		||||
            state <= nextState;
 | 
			
		||||
    end 
 | 
			
		||||
 | 
			
		||||
        .winc(fifo_en),
 | 
			
		||||
        .wdata(data_in),
 | 
			
		||||
        .wfull(fifo_full),
 | 
			
		||||
        .awfull(),
 | 
			
		||||
 | 
			
		||||
        .rinc(out_en),
 | 
			
		||||
        .rdata(data_out),
 | 
			
		||||
        .rempty(fifo_empty),
 | 
			
		||||
        .arempty()
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    assign in_que = !fifo_full;
 | 
			
		||||
    assign out_en = (out_que && !fifo_empty) ? 1 : 0;
 | 
			
		||||
    // 下一状态更新
 | 
			
		||||
    always @(*) begin
 | 
			
		||||
        case (state)
 | 
			
		||||
            READ_DATA:      nextState <= (in_que && in_en) ? HANDLE_DATA : READ_DATA; 
 | 
			
		||||
            HANDLE_DATA:    nextState <= SEND_DATA;
 | 
			
		||||
            SEND_DATA:      nextState <= READ_DATA;
 | 
			
		||||
        endcase
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    always @(posedge clk or posedge reset) begin
 | 
			
		||||
        if (reset) begin
 | 
			
		||||
            fifo_en <= 0;
 | 
			
		||||
            cnt_x <= 0;
 | 
			
		||||
            cnt_y <= 0;
 | 
			
		||||
 | 
			
		||||
            data <= 0;
 | 
			
		||||
        end
 | 
			
		||||
        else begin
 | 
			
		||||
            if (in_en) begin
 | 
			
		||||
 | 
			
		||||
                if (OFFSET_Y <= cnt_y && cnt_y < (OFFSET_Y + OUT_HEIGHT)) begin
 | 
			
		||||
                    if (OFFSET_X <= cnt_x && cnt_x < (OFFSET_X + OUT_WIDTH)) begin
 | 
			
		||||
                        fifo_en <= 1;
 | 
			
		||||
                    end 
 | 
			
		||||
                    else begin
 | 
			
		||||
                        fifo_en <= 0;
 | 
			
		||||
            case (state)
 | 
			
		||||
                READ_DATA: begin
 | 
			
		||||
                    in_que <= 1;
 | 
			
		||||
                    
 | 
			
		||||
                    if (in_en) begin
 | 
			
		||||
                        data <= data_in;
 | 
			
		||||
                        in_que <= 0;
 | 
			
		||||
                    end
 | 
			
		||||
                end
 | 
			
		||||
                else begin
 | 
			
		||||
                    fifo_en <= 0;
 | 
			
		||||
                end
 | 
			
		||||
 | 
			
		||||
                cnt_x <= cnt_x + 1;
 | 
			
		||||
                if (cnt_x >= (OFFSET_X + OUT_WIDTH)) begin
 | 
			
		||||
                    cnt_x <= 0;
 | 
			
		||||
                    if (cnt_y >= (OFFSET_Y + OUT_HEIGHT)) begin
 | 
			
		||||
                        cnt_y <= 0;
 | 
			
		||||
                HANDLE_DATA: begin
 | 
			
		||||
                    if (OFFSET_Y <= cnt_y && cnt_y < (OFFSET_Y + OUT_HEIGHT)) begin
 | 
			
		||||
                        if (OFFSET_X <= cnt_x && cnt_x < (OFFSET_X + OUT_WIDTH)) begin
 | 
			
		||||
                            out_en <= 1;
 | 
			
		||||
                        end
 | 
			
		||||
                    end
 | 
			
		||||
 | 
			
		||||
                    if (cnt_x >= (OFFSET_X + OUT_WIDTH)) begin
 | 
			
		||||
                        cnt_x <= 0;
 | 
			
		||||
                        if (cnt_y >= (OFFSET_Y + OUT_HEIGHT)) begin
 | 
			
		||||
                            cnt_y <= 0;
 | 
			
		||||
                        end
 | 
			
		||||
                        else begin
 | 
			
		||||
                            cnt_y <= cnt_y + 1;
 | 
			
		||||
                        end
 | 
			
		||||
                    end
 | 
			
		||||
                    else begin
 | 
			
		||||
                        cnt_y <= cnt_y + 1;
 | 
			
		||||
                        cnt_x <= cnt_x + 1;
 | 
			
		||||
                    end
 | 
			
		||||
                end
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
                SEND_DATA: begin
 | 
			
		||||
                    data_out <= data;
 | 
			
		||||
                    out_en <= 0;
 | 
			
		||||
                end
 | 
			
		||||
                
 | 
			
		||||
            endcase
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										16
									
								
								isp.v
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								isp.v
									
									
									
									
									
								
							@@ -16,7 +16,6 @@ module isp #(
 | 
			
		||||
    input data_en,
 | 
			
		||||
    input [15:0] data_in [2:0],     // 数据输入线,0、1、2分别表示第一、二、三行
 | 
			
		||||
    output reg data_que,            // 数据请求线,高电平:请求三个数据,直到读取完才拉低
 | 
			
		||||
    output reg data_line,           // 新一行请求数据线,高电平:请求九个数据,直到读取完才拉低
 | 
			
		||||
 | 
			
		||||
    output out_clk,
 | 
			
		||||
    output out_en,
 | 
			
		||||
@@ -32,9 +31,9 @@ module isp #(
 | 
			
		||||
    reg [3 * COLOR_DEPTH - 1:0] scale_in_data;
 | 
			
		||||
 | 
			
		||||
    // 写入RAM
 | 
			
		||||
    wire RAM_in_en;
 | 
			
		||||
    wire RAM_in_que;        // RAM 请求数据
 | 
			
		||||
    wire [3 * COLOR_DEPTH - 1:0] RAM_in_data;
 | 
			
		||||
    // wire RAM_in_en;
 | 
			
		||||
    // wire RAM_in_que;        // RAM 请求数据
 | 
			
		||||
    // wire [3 * COLOR_DEPTH - 1:0] RAM_in_data;
 | 
			
		||||
 | 
			
		||||
    assign out_clk = clk;
 | 
			
		||||
 | 
			
		||||
@@ -47,7 +46,6 @@ module isp #(
 | 
			
		||||
        .data_en(data_en),
 | 
			
		||||
        .data_in(data_in),
 | 
			
		||||
        .data_que(data_que),
 | 
			
		||||
        .data_line(data_line),
 | 
			
		||||
        .out_en(rgb_en),
 | 
			
		||||
        .out_r(im_red),
 | 
			
		||||
        .out_g(im_green),
 | 
			
		||||
@@ -59,9 +57,6 @@ module isp #(
 | 
			
		||||
        .reset(reset),
 | 
			
		||||
        .in_en(rgb_en),
 | 
			
		||||
        .data_in({im_red[11:0], im_green[11:0], im_red[11:0]}),
 | 
			
		||||
        // .data_in[0](im_red[11:0]),
 | 
			
		||||
        // .data_in[1](im_green[11:0]),
 | 
			
		||||
        // .data_in[2](im_red[11:0]),
 | 
			
		||||
 | 
			
		||||
        .data_que(scale_in_que),
 | 
			
		||||
        .out_en(scale_in_en),
 | 
			
		||||
@@ -76,9 +71,8 @@ module isp #(
 | 
			
		||||
        .in_que(scale_in_que),
 | 
			
		||||
        .data_in(scale_in_data),
 | 
			
		||||
 | 
			
		||||
        .out_en(RAM_in_en),
 | 
			
		||||
        .out_que(RAM_in_que),
 | 
			
		||||
        .data_out(RAM_in_data)
 | 
			
		||||
        .out_en(out_en),
 | 
			
		||||
        .data_out(data_out)
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    // RGB_to_RAM write_to_RAM (
 | 
			
		||||
 
 | 
			
		||||
@@ -54,7 +54,7 @@ VERILATOR_FLAGS += --assert
 | 
			
		||||
TOP_MODULE = isp
 | 
			
		||||
VERILATOR_FLAGS += -top $(TOP_MODULE)
 | 
			
		||||
# Input files for Verilator
 | 
			
		||||
VERILATOR_INPUT = isp.v sc_main.cpp ./Demosaic/demosaic2.v ./Crop/*.v ./FIFO/*.v ./Merge/*.v ./RAM/*.v
 | 
			
		||||
VERILATOR_INPUT = ../isp.v sc_main.cpp ../Demosaic/demosaic2.v ../Crop/*.v ../FIFO/*.v ../Merge/*.v ../RAM/*.v
 | 
			
		||||
 | 
			
		||||
# Check if SC exists via a verilator call (empty if not)
 | 
			
		||||
SYSTEMC_EXISTS := $(shell $(VERILATOR) --get-supported SYSTEMC)
 | 
			
		||||
@@ -88,7 +88,7 @@ run:
 | 
			
		||||
	@echo "-- RUN ---------------------"
 | 
			
		||||
	@rm -rf logs
 | 
			
		||||
	@mkdir -p logs
 | 
			
		||||
	obj_dir/Vtop +trace
 | 
			
		||||
	obj_dir/V$(TOP_MODULE) +trace
 | 
			
		||||
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "-- COVERAGE ----------------"
 | 
			
		||||
@@ -10,7 +10,7 @@
 | 
			
		||||
 | 
			
		||||
#include <sys/stat.h>  // mkdir
 | 
			
		||||
 | 
			
		||||
// Include model header, generated from Verilating "top.v"
 | 
			
		||||
// Include model header, generated from Verilating "isp.v"
 | 
			
		||||
#include "Visp.h"
 | 
			
		||||
 | 
			
		||||
using namespace sc_core;
 | 
			
		||||
@@ -53,20 +53,20 @@ int sc_main(int argc, char* argv[]) {
 | 
			
		||||
    sc_signal<uint64_t> out_quad;
 | 
			
		||||
    sc_signal<sc_bv<70>> out_wide;
 | 
			
		||||
 | 
			
		||||
    // Construct the Verilated model, from inside Vtop.h
 | 
			
		||||
    // Using unique_ptr is similar to "Vtop* top = new Vtop" then deleting at end
 | 
			
		||||
    const std::unique_ptr<Vtop> top{new Vtop{"top"}};
 | 
			
		||||
    // Construct the Verilated model, from inside Visp.h
 | 
			
		||||
    // Using unique_ptr is similar to "Visp* isp = new Visp" then deleting at end
 | 
			
		||||
    const std::unique_ptr<Visp> isp{new Visp{"isp"}};
 | 
			
		||||
 | 
			
		||||
    // Attach Vtop's signals to this upper model
 | 
			
		||||
    top->clk(clk);
 | 
			
		||||
    top->fastclk(fastclk);
 | 
			
		||||
    top->reset_l(reset_l);
 | 
			
		||||
    top->in_small(in_small);
 | 
			
		||||
    top->in_quad(in_quad);
 | 
			
		||||
    top->in_wide(in_wide);
 | 
			
		||||
    top->out_small(out_small);
 | 
			
		||||
    top->out_quad(out_quad);
 | 
			
		||||
    top->out_wide(out_wide);
 | 
			
		||||
    // Attach Visp's signals to this upper model
 | 
			
		||||
    isp->clk(clk);
 | 
			
		||||
    isp->fastclk(fastclk);
 | 
			
		||||
    isp->reset_l(reset_l);
 | 
			
		||||
    isp->in_small(in_small);
 | 
			
		||||
    isp->in_quad(in_quad);
 | 
			
		||||
    isp->in_wide(in_wide);
 | 
			
		||||
    isp->out_small(out_small);
 | 
			
		||||
    isp->out_quad(out_quad);
 | 
			
		||||
    isp->out_wide(out_wide);
 | 
			
		||||
 | 
			
		||||
    // You must do one evaluation before enabling waves, in order to allow
 | 
			
		||||
    // SystemC to interconnect everything for testing.
 | 
			
		||||
@@ -79,7 +79,7 @@ int sc_main(int argc, char* argv[]) {
 | 
			
		||||
    if (flag && 0 == std::strcmp(flag, "+trace")) {
 | 
			
		||||
        std::cout << "Enabling waves into logs/vlt_dump.vcd...\n";
 | 
			
		||||
        tfp = new VerilatedVcdSc;
 | 
			
		||||
        top->trace(tfp, 99);  // Trace 99 levels of hierarchy
 | 
			
		||||
        isp->trace(tfp, 99);  // Trace 99 levels of hierarchy
 | 
			
		||||
        Verilated::mkdir("logs");
 | 
			
		||||
        tfp->open("logs/vlt_dump.vcd");
 | 
			
		||||
    }
 | 
			
		||||
@@ -102,7 +102,7 @@ int sc_main(int argc, char* argv[]) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Final model cleanup
 | 
			
		||||
    top->final();
 | 
			
		||||
    isp->final();
 | 
			
		||||
 | 
			
		||||
    // Close trace if opened
 | 
			
		||||
    if (tfp) {
 | 
			
		||||
							
								
								
									
										33
									
								
								sim/tb_isp.v
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								sim/tb_isp.v
									
									
									
									
									
								
							@@ -1,33 +0,0 @@
 | 
			
		||||
`include "isp.v"
 | 
			
		||||
`default_nettype none
 | 
			
		||||
 | 
			
		||||
module tb_isp;
 | 
			
		||||
reg clk;
 | 
			
		||||
reg rst_n;
 | 
			
		||||
 | 
			
		||||
 isp
 | 
			
		||||
(
 | 
			
		||||
    .rst_n (rst_n),
 | 
			
		||||
    .clk (clk),
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
localparam CLK_PERIOD = 10;
 | 
			
		||||
always #(CLK_PERIOD/2) clk=~clk;
 | 
			
		||||
 | 
			
		||||
// initial begin
 | 
			
		||||
//     $dumpfile("tb_isp.vcd");
 | 
			
		||||
//     $dumpvars(0, tb_isp);
 | 
			
		||||
// end
 | 
			
		||||
 | 
			
		||||
initial begin
 | 
			
		||||
    #1 rst_n<=1'bx;clk<=1'bx;
 | 
			
		||||
    #(CLK_PERIOD*3) rst_n<=1;
 | 
			
		||||
    #(CLK_PERIOD*3) rst_n<=0;clk<=0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    $finish(2);
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
`default_nettype wire
 | 
			
		||||
		Reference in New Issue
	
	Block a user