并口的时序仿真--异步并口读写FPGA学习笔记--8

分类: RAM/ROM/FIFO |
2016年12月27日15:29:14
1、并口经常用于FPGA和cpu芯片通信、配置寄存器、跨芯片数据传输等
2、源同步传输:发送端同时发送时钟和数据给接收端,接收端使用源端发送的时钟采样数据。
3、异步并口通信:
异步并口应用:
--cpu类的芯片(dsp、stm32)与FPGA的数据交互,数据速率一般在100Mbps以内,数据总线不大于16bit
--非cpu类的功能芯片与FPGA通过并口进行数据交互,例如配置寄存器等
并口信号说明:
--chip select片选信号,简写为cs_n,此信号低有效,当被拉低的时候,表示此器件的并口被激活。
--write
enable写使能信号,简写为we_n,信号低有效,当别拉低时表示此事地址总线和数据总线的地址数据是写入操作的。
--read enable读使能信号,简写为rd_n,此信号低有效,当别拉低时表示此时地址总线和数据总线的地址和数据是
--Addr[7:0]地址总线,表示读写的地址。
--Data[15:0]数据总线,此总线是双向总线,读操作时数据总线上是读取的数据,写操作时数据总线上是写入的数据。
--写操作时序见图1
--并口不适合高速传输且占用管脚数量很多,优点是简单,逻辑简单
--读操作时序见图2
--读等待(设置为40ns),是为了使地址数据稳定之后才赋值给端口。
4、往寄存器中存储数据,对寄存器寻址
5、cs_n和wr_n是两个握手操作的信号
6、寄存器打拍延时--延时时钟数为n,需要延时的数据为xbit,则使用移位寄存器进行延时的格式为:
reg
Data_r <=
{Data_r[(n-1)*x,0],Data};--最后三个时钟后Data_r的高n位即为延时后的输出。
例如:
data_r <= {data_r[31:0],data};
//data为16bit,要打三拍,所以总的打拍寄存器为16*3=48bit,前面的为16*2=32bit
addr_r <= {addr_r[15:0],addr};
//addr为8bit,要打三拍,所以总的打拍寄存器为8*3=14bit,前面的为8*2=16bit
7、当task中含有参数的时候,参数需要在task中声明
task write_data(len); //需要在下面声明len
endtask
8、三态门的使用和测试:
--源程序模块的三态门
reg
inout
assign data = (cs_n_r[2] == 1'b0 && rd_n_r[2] == 1'b0) ?
rdata : 16'hzzzz;
--测试模块的三态门
reg
tri
assign w_data = (wr_n == 1'b0) ? data_tb : 16'hzzzz;
parall_interf parall_interf_inst( //例化
);
//-------------parall_interf.v--源程序文件代码---------------------------------------------------------
module parall_interf(
);
//reg
reg
reg
reg
reg
reg
//为降低亚稳态出现的概率,把cs_n rd_n wr_n这几个单bit信号打3拍
always @ (posedge sclk or negedge rst_n)
//数据也进行延时是为了与使能信号进行同步
always @ (posedge sclk or negedge rst_n)
//写操作--把数据线上的数据存入相应的寄存器
always @ (posedge sclk or negedge rst_n)
//读操作:来地址(cs_n拉低)把数据赋值给rdata,当rd_n为低的时候,将rdata赋值给data--看读操作时序图
always @ (posedge sclk or negedge rst_n)
//三态门--当rd_n为低的时候,将rdata赋值给data---读,此时三态门作为输出
assign data = (cs_n_r[2] == 1'b0 && rd_n_r[2] == 1'b0) ?
rdata : 16'hzzzz;
endmodule
//-------------------------------tb_parall_interf.v测试文件代码--------------------------------------------
`timescale 1ns/1ns
module tb_parall_interf;
parameter
parameter
parameter
parameter
reg
reg
reg
reg
reg
reg
reg
tri
always #10 sclk <= ~sclk;
//测试激励的三态门--FPGA内的三态门使用测试模块的三态门进行测试
assign w_data = (wr_n == 1'b0) ? data_tb : 16'hzzzz;
//注意()和{}是有区别的
initial begin
end
initial begin
end
//写数据任务--模拟cpu向FPGA发送数据。tasi中嵌套tasi
task write_data(len); //需要在下面声明len
endtask
//读数据任务--模拟FPGA读取cpu
task read_data(len);
endtask
//练习task使用--基本的延时任务
//延时产生延时setup_time
task setup_dly();
endtask
task hold_dly();
endtask
task read_dly();
endtask
task data_dly();
endtask
parall_interf parall_interf_inst(
);
endmodule
//-----------------run.do-文件代码---------------------------------------------------
quit -sim
.main clear
vlib work
vmap work work
vlog ./tb_parall_interf.v
vlog ./../design/parall_interf.v
vsim -voptargs=+acc work.tb_parall_interf
add wave
add wave tb_parall_interf/parall_interf_inst/*
add wave -divider {tb}
add wave tb_parall_interf/*
run 10us
//----------------------相关截图-------------------------------------------
http://s4/mw690/006hC78Ezy77xMxIUUjf3&690
http://s1/mw690/006hC78Ezy77xMxOogwa0&690
http://s4/mw690/006hC78Ezy77xMxSdCXc3&690
http://s10/mw690/006hC78Ezy77xMxWMjf69&690