一个串口的完整FPGA工程
源代码在线查看: ebi.v
/*********************************************************************************************************
** All right reserve 2008-2009(C)
** Created & maintained by http://www.edaok.net
**=======================================================================================================
** 模 块 名: ebi
** 描 述: 连接类似于8051MCU外部总线模块, 输出从外部总线上接收的地址, 数据, 写信号线信号, 主要为工
** 程中的其它模块提供外部总线的地址和数据
**
** 原 作 者: Adeko (from http://www.edaok.net)
** 参 与 者: (...welcome you join in)
**
**=======================================================================================================
********************************************************************************************************/
module ebi (
clk,
ebi_ad,
ebi_addr_h,
ebi_wr_n,
ebi_rd_n,
ebi_ale,
we,
data_in,
data_out,
addr_out
);
input clk; // 全局时钟
inout [7:0] ebi_ad; // 外部总线的地址/数据线
input [7:0] ebi_addr_h; // 外部总线高位地址线
input ebi_wr_n; // 外部总线写信号线
input ebi_rd_n; // 外部总线读信号线
input ebi_ale; // 外部总线地址锁存信号线
output we; // 写信号线上升沿有效信号
input [7:0] data_in; // 将要发送到外部总线上的数据
output [7:0] data_out; // 从外部总线上接收的数据
output [15:0] addr_out; // 从外部总线得到的16位地址线
/*
* 综合成8位锁存器, 当ALE高电平时锁存数据, 锁存外部总线的地址低8位
*/
reg [7:0] rAddrL;
wire [15:0] wAddr;
always @(ebi_ale or ebi_ad)
begin
if (ebi_ale) begin
rAddrL[7:0] end
end
assign wAddr[15:0] = {ebi_addr_h[7:0], rAddrL[7:0]}; // 和地址高8位组合比16位地址
/*
* 产生和全局时钟同步的'写'信号上升沿信号,提供其它模块作为写线有效, 可以进行
* 数据读写
*/
wire wWrNeg;
assign wWrNeg = ~ebi_wr_n;
/*
* 输出端口
*/
assign ebi_ad = (~ebi_rd_n)? data_in : 8'hzz; // 输出三态, 当'读'信号为高时输出数据
assign addr_out[15:0] = wAddr[15:0]; // 输出外部总线的地址
//assign data_out[7:0] = rData[7:0]; // 输出外部总线锁存的数据
assign data_out[7:0] = ebi_ad[7:0];
assign we = wWrNeg; // 输出写线有效信号, 同步于全局时钟
endmodule
/*********************************************************************************************************
** End Of File
********************************************************************************************************/