前言
AMBA中的AHB总线是我们经常使用到的一种系统总线协议。很多初学者在实现AHB总线协议的过程中,都会因为AHB总线信号多,协议相对复杂而产生一些困扰。本文主要实现了一个基础的将模块内部简单的读写信号转换为AHB-Lite协议信号的转换模块。
提示:未经授权严禁转载。
一、设计原理
1. 模块框图
2. 功能简介
模块框图中左边的信号是内部信号,右边是转换后得到的AHB-Lite信号。我们可以调用这个模块来实现一个AHB Master接口功能,这个模块可以非常简单地将AHB Master模块内部的读写信号转换为AHB接口时序,且电路逻辑非常简单,只需要使用少量的逻辑资源,同时,内部可以通过检测ready信号获取AHB总线的传输状态。但是该设计不支持BURST传输,仅支持SINGLE类型的操作。
相信AHB-Lite总线的各个信号的含义大家都有所了解,这里仅介绍一下内部的信号:
name | direction | width | description |
---|---|---|---|
rd_addr | input | 32 | 读地址 |
rd_en | input | 1 | 读使能 |
rd_data | output | 32 | 读数据 |
rd_vld | output | 1 | 读数据有效 |
ready | output | 1 | 高电平时内部对该模块的读写有效; rd_en和ready同时为高时完成一次读转换; wr_en和ready同时为高时完成一次写转换 |
wr_addr | input | 32 | 写地址 |
wr_en | input | 1 | 写使能 |
wr_data | input | 32 | 写数据 |
二、Verilog代码
`timescale 1ns / 1ps
module ahblite_master(
// Globle signals
input HCLK ,
input HRESETn ,
// Internal write channel
input wr_en ,
input [31:0] wraddr ,
input [31:0] wrdata ,
// Internal read channel
input rd_en ,
input [31:0] rdaddr ,
output [31:0] rddata ,
output rd_vld ,
// Internal ready signal
output ready ,
// AHB-Lite signals
// Address and control
output [31:0] HADDR ,
output HWRITE ,
output [2:0] HSIZE ,
output [2:0] HBURST ,
output [3:0] HPROT ,
output [1:0] HTRANS ,
output HMASTLOCK ,
// Data
input [31:0] HRDATA ,
output reg [31:0] HWDATA ,
// Transfer response
input [1:0] HRESP ,
input HREADY
);
reg hwrite_d, htrans_d;
assign HADDR = wr_en ? wraddr :
rd_en ? rdaddr : 32'd0;
assign ready = HREADY;
assign HWRITE = wr_en;
assign HTRANS = (wr_en | rd_en) ? 2'b10 : 2'b00; // NONSEQ / IDLE
assign HPROT = 4'b0001; // Data access
assign HBURST = 3'b000; // SINGLE
assign HSIZE = 3'b010; // word (32-bit)
assign HMASTLOCK = 1'b0;
assign rddata = HRDATA;
always @(posedge HCLK or negedge HRESETn)
if (!HRESETn)
HWDATA <= 32'd0;
else if (wr_en & ready)
HWDATA <= wrdata;
always @(posedge HCLK or negedge HRESETn)
if (!HRESETn) begin
htrans_d <= 1'b0;
hwrite_d <= 1'b0;
end else if (HREADY) begin
htrans_d <= HTRANS[1];
hwrite_d <= HWRITE;
end
assign rd_vld = htrans_d && ~hwrite_d && HREADY;
endmodule
三、仿真结果
上图的仿真波形中,从机最内部存储单元的读写需要两个时钟周期才能完成,这种情况下,对从机发起一次读写操作时,从机会拉低一个时钟周期HREADYOUT信号。图中,黄色波形为内部的写时序,蓝色波形为内部的读时序。
上图中,从机只需要一个时钟周期就可以完成读写操作时,从机的HREADYOUT信号一直输出为高电平。
完整的测试文件链接:
https://download.youkuaiyun.com/download/weixin_44505013/55587520
总结
本文仅仅实现了一个简单的接口转换的功能,将一般的读写信号转换为AHB接口时序。