VESA DSC 基于FPGA DSC_Encoder IP仿真

发布于:2025-06-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

VESA DSC 基于FPGA DSC_Encoder IP仿真

1:IP设置

2:仿真文件导入

3:仿真

                //
// Created by Microsemi SmartDesign Thu Oct 10 12:36:11 2019
// Testbench Template
// This is a basic testbench that instantiates your design with basic 
// clock and reset pins connected.  If your design has special
// clock/reset or testbench driver requirements then you should 
// copy this file and modify it. 
//

///
// Company: <Name>
//
// File: test_bench.v
// File history:
//      <Revision number>: <Date>: <Comments>
//      <Revision number>: <Date>: <Comments>
//      <Revision number>: <Date>: <Comments>
//
// Description: 
//
// <Description here>
//
// Targeted device: <Family::PolarFire> <Die::MPF300T> <Package::FCG1152>
// Author: <Name>
//
/// 


`timescale 1ns/100ps
 
module test_bench;

parameter SYSCLK_PERIOD = 10;// 100MHZ
parameter H_RES = 432;
parameter V_RES = 240;
parameter g_DATAWIDTH = 8;

reg SYSCLK;
reg NSYSRESET;
reg [15:0] h_resolution=H_RES,v_resolution=V_RES,h_blanking=280,v_blanking=20;
reg [15:0] h_counter,v_counter,h_total,v_total;
reg h_active,v_active,data_valid,data_valid_dly,eof,eof_dly;
reg[g_DATAWIDTH : 0] Y_array[0:(H_RES*V_RES)-1];
 reg[g_DATAWIDTH : 0] Cb_array[0:(H_RES*V_RES)-1];
reg[g_DATAWIDTH : 0] Cr_array[0:(H_RES*V_RES)-1]; 
reg[47 : 0] bitstream_quant_array[0:(H_RES*V_RES)-1];
reg[11 : 0] bitstream_array[0:(H_RES*V_RES)-1];
wire [g_DATAWIDTH - 1 : 0] Y_data,Cb_data,Cr_data;
wire [47  : 0] bitstream_quant;
wire bitstream_quant_valid;

reg [7 : 0] dsc_out_ref [0 : 262143];
reg [17 : 0] ref_addr;

reg [15 : 0] err;

reg pulse=0;
integer i; 


//
// Reset Pulse
//
initial
begin
    SYSCLK = 0;
    NSYSRESET = 0;
    #(SYSCLK_PERIOD * 10 )
        NSYSRESET = 1'b1;
end


//
// Clock Driver
//
always @(SYSCLK)
    #(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK;

/


// initialize the hexadecimal reads from the file
initial $readmemh("img_in_luma.txt", Y_array); 
initial $readmemh("img_in_cb.txt", Cb_array); 
initial $readmemh("img_in_cr.txt", Cr_array);   
initial $readmemh("dsc_out_ref.txt", dsc_out_ref);   
assign Y_data     = Y_array[i][7:0];
assign Cb_data     = Cb_array[i][7:0];
assign Cr_data     = Cr_array[i][7:0];

initial
begin
    h_total = h_resolution + h_blanking;
    v_total = v_resolution + v_blanking;
end
always @(posedge SYSCLK or negedge NSYSRESET) begin
        if(~NSYSRESET)   begin
        pulse     <= 0;
    end
    if(data_valid==1 && data_valid_dly==0) begin
        pulse = 1;
    end
    else begin
        pulse = pulse;
    end
end
always@(h_counter,h_resolution) begin
    if(h_counter >= (h_blanking+1)) begin
        h_active = 1;
    end
    else begin
        h_active = 0;
    end
end

always@(v_counter,v_resolution) begin
    if(v_counter >= (v_blanking+1)) begin
        v_active = 1;
    end
    else begin
        v_active = 0;
    end
end

always@(h_active,v_active) begin
    data_valid = h_active && v_active;
end

always@(v_counter) begin
    if((v_counter == 15)&&(pulse==1)) begin
        eof = 1;
    end
    else begin
        eof = 0;
    end
end

// Horizontal counter
always @(posedge SYSCLK or negedge NSYSRESET) begin
    if(~NSYSRESET)   begin
        h_counter     <= 0;
        i <= 0;
        data_valid_dly <= 0;
        eof_dly <= 0;
    end
    else begin
        data_valid_dly <= data_valid;
        eof_dly <= eof;
        if(h_counter < h_total) begin 
            h_counter     <= h_counter + 1;
        end
        else  begin
            h_counter     <= 0;
        end
        if(eof == 1) begin
            i <= 0;
        end
        else begin
            if (data_valid == 1) begin
                i = i + 1;
            end
        end
    end
end

// Vertical counter
always @(posedge SYSCLK or negedge NSYSRESET) begin
    if(~NSYSRESET)   begin
        v_counter     <= 0;
    end
    else begin    
        if(h_counter == h_total) begin                
            if(v_counter < v_total) begin 
                v_counter     <= v_counter + 1;
            end
            else  begin
                v_counter     <= 0;
            end
        end
    end
end
//
// Instantiate Unit Under Test:  data_gather
//
DSC_Encoder #(.G_DATA_WIDTH(g_DATAWIDTH)) DSC_Encoder(
    // Inputs
    .RESETN_I(NSYSRESET),
    .PIX_CLK_I(SYSCLK),
    .DATA_Y_I(Y_data),
    .DATA_CB_I(Cb_data),
    .DATA_CR_I(Cr_data),
    .HRES_I(H_RES[15:0]),
    .VRES_I(V_RES[15:0]),
    .DATA_VALID_I(data_valid),
     .FRAME_END_I(eof), 
    // Outputs
    .DATA_O(bitstream_quant),
    .DATA_VALID_O(bitstream_quant_valid)
    
);

always @ (posedge SYSCLK, negedge NSYSRESET)begin
    if(~NSYSRESET) begin 
        err     <= 0;
        ref_addr<= 0;
    end
    else if(eof==0 && eof_dly==1) begin 
        err     <= 0;
        ref_addr<= 0;
    end
    else if (bitstream_quant_valid)begin
        ref_addr <= ref_addr + 6;
        if(bitstream_quant != {dsc_out_ref[ref_addr],dsc_out_ref[ref_addr+1],dsc_out_ref[ref_addr+2],dsc_out_ref[ref_addr+3],
                               dsc_out_ref[ref_addr+4],dsc_out_ref[ref_addr+5]}) begin 
            err <=  err + 1;                  
        end
    end
end

always @ (posedge SYSCLK, negedge NSYSRESET)begin
    if(eof==1 && eof_dly==0) begin 
        $display(" ***********************************");
        $display(" ***********************************");
        $display(" H_RES:%d  V_RES:%d",H_RES,V_RES);
        
        if(err == 0) begin 
            $display(" DSC Compression Test Passed");
            $display(" ***********************************");
            $display(" ***********************************");
        end
        else begin 
            $display(" DSC Compression Test Failed");
            $display(" ***********************************");
            $display(" ***********************************");
        end
        
        $stop;
        
    end

end

endmodule

4:仿真运行

5:欢迎讨论交流

微:moning_hello


网站公告

今日签到

点亮在社区的每一天
去签到