AMBA 3 AHB-Lite接口转换模块Verilog设计与验证

文章目录

  • 前言
  • 一、设计原理
    • 1. 模块框图
    • 2. 功能简介
  • 二、Verilog代码
  • 三、仿真结果
  • 总结


前言

       AMBA中的AHB总线是我们经常使用到的一种系统总线协议。很多初学者在实现AHB总线协议的过程中,都会因为AHB总线信号多,协议相对复杂而产生一些困扰。本文主要实现了一个基础的将模块内部简单的读写信号转换为AHB-Lite协议信号的转换模块。


提示:未经授权,严禁转载和使用。

一、设计原理

1. 模块框图

AMBA 3 AHB-Lite接口转换模块Verilog设计与验证_第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

三、仿真结果

AMBA 3 AHB-Lite接口转换模块Verilog设计与验证_第2张图片
     上图的仿真波形中,从机最内部存储单元的读写需要两个时钟周期才能完成,这种情况下,对从机发起一次读写操作时,从机会拉低一个时钟周期HREADYOUT信号。图中,黄色波形为内部的写时序,蓝色波形为内部的读时序。

AMBA 3 AHB-Lite接口转换模块Verilog设计与验证_第3张图片
     上图中,从机只需要一个时钟周期就可以完成读写操作时,从机的HREADYOUT信号一直输出为高电平。

完整的测试文件链接:
https://download.csdn.net/download/weixin_44505013/55587520


总结

     本文仅仅实现了一个简单的接口转换的功能,将一般的读写信号转换为AHB接口时序。

你可能感兴趣的:(数字IC设计,fpga开发,verilog)