system verilog代码
`define PIC_W 176 //图像宽
`define PIC_H 144 //图像高
`define FRAME 300 //总帧数
`define H_CLK 5 //半周期
typedef byte unsigned ubyte_t;
//读取一帧图像,num表示第几帧,读取的像素存放在数组frame中
import "DPI-C" function int read_yuv(inout ubyte_t frame[][], input int num);
program automatic RD_YUV
int i_frame = 0; //表示读第几帧,从第0帧开始计
ubyte_t frame[`PIC_H][`PIC_W]; //存放像素的数组
initial begin
bit clk;
//读取参考帧
a1: assert(read_yuv(frame, i_frame) == 1)
else $error("read frame failed!");
fork
forever #`H_CLK clk = !clk;
forever @(posedge clk) begin
//处理
#100 ++i_frame;
//处理
a2: assert(read_yuv(frame, i_frame) == 1)
else $error("read frame failed!");
end
join_none
end
endprogram
c语言代码,只读取了亮度,色度没有读
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <svdpi.h>
#define PIC_P "F:\\sequence\\yuv\\foreman_qcif.yuv"//图像路径
int read_yuv(const svOpenArrayHandle pix_array, const int i_frame)
{
int width, height;
uint8_t *addr;
FILE *fp;
width = svSize(pix_array, 2); //获取图像宽
height = svSize(pix_array, 1); //获取图像高
addr = (uint8_t *)svGetArrayPtr(pix_array);
//打开文件
fp = fopen(PIC_P, "rb");
if (!fp)
return 0;
//找到一帧的开头
if( fseek( fp, (uint64_t)(i_frame) * width * height * 3 / 2, SEEK_SET ) )
return 0;
//读取Y分量至内存
if( fread( addr, 1, width * height, fp ) <= 0 )
return 0;
fclose(fp);
return 1;
}