本次主要采用ad9280和ad9708进行ad和da信号转换。
1、信号流通
由ROM中的IP核输出模拟信号,然后经由da9708进行数模转换,经过一根BNC线将ad9708的输出口和ad9280的输入口接到一起,形成一个环路,然后ad9280进行模数转换。
2、模块讲解
模块一:sample。进行8位数字信号的采集,每次采集1280位,然后间隔一段时间采集一次。将采集到的信号,同时还有有效信号,地址信号一同输入到display模块。
模块二:color。主要任务为产生行同步信号,场同步信号还有数据有效信号。同时输出一个彩条RGB信号作为背景。
模块三:display。接收来自sample的数据信号,还有来自color的hs,vs,de,rgb信号。使用IP核将数据信号写入RAM中,并根据不同的频率从ram中读出信号。display模块中还包含一个用于读取图像坐标的getxy模块。
IP核:包括三个IP核,时钟模块,rgb转dvi模块,还有ROM模块(输出预加载波形)
3、代码讲解
(1)sample模块
module AD_SAMPLE(
input ad_clk, //时钟信号
input rst, //重置信号
input[7:0] ad_data, //采集数据
input ad_data_valid, //信号有效位
output ad_buf_wr, //写允许信号
output[11:0] ad_buf_addr, //写地址
output[7:0] ad_buf_data //输出信号
);
//提前设置状态位数值
localparam S_IDLE=0; //空闲位
localparam S_SAMPLE=1; //采样位
localparam S_WAIT=2; //等待位
reg[7:0] ad_data0;
reg[10:0] sample_cnt; //采样计数
reg [31:0] wait_cnt; //等待计数
reg[2:0] state; //状态位
assign ad_buf_addr=sample_cnt; //把采样计数赋给地址
assign ad_buf_data=ad_data0; //给数据
assign ad_buf_wr=(state==S_SAMPLE && ad_data_valid==1'b1)?1'b1:1'b0; //在采样时段且数据有效位为高电平
//复位
always@(posedge ad_clk or posedge rst)
begin
if(rst==1'b1) //如果复位信号有效
ad_data0<=8'b0; //数据置零
else if(ad_data_valid==1'b1) //复位信号无效且数据有效位为高电平
ad_data0<=ad_data; //传送数据
end
//读取设置
always@(posedge ad_clk or posedge rst)
begin
if(rst==1'b1) //如果复位信号有效
begin
state<=S_IDLE; //转为空闲状态
wait_cnt=32'd0; //等待技术位置零
sample_cnt<=11'd0; //采样计数位置零
end
else
case(state)
S_IDLE:
begin
state<=S_SAMPLE; //转为采样位
end
//像素设置为1280*720,单次采样1280个数据
S_SAMPLE:
begin
if(ad_data_valid==1'b1) //如果数据有效位为高电平
begin
if(sample_cnt==11'd1279) //采样计数等于1280时
begin
sample_cnt<=11'd0; //计数清零
state<=S_WAIT; //转为等待位
end
else
begin
sample_cnt<=sample_cnt+1'b1; //采样计数加一
end
end
end
//等待一段时间再次采样
S_WAIT:
begin
if(wait_cnt==32'd25_000_000) //等待时间/晶振周期=25000000
begin
state<=S_SAMPLE; //转为采样位
wait_cnt<=32'd0; //等待计数置零
end
else
begin
wait_cnt<=wait_cnt+1'b1; //等待计数加一
end