总线读写---verilog代码
总线读写---verilog代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: chensimin
//
// Create Date: 2017/11/16 17:32:35
// Design Name:
// Module Name: read_and_write
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////// module read_and_write( //-----------------------clock and reset--------------------------
input wire clk,
input wire reset,
//-----------------------up_interface---------------------------
input wire [:]up_address_channel,
input wire [:]up_wdata,
output wire [:]up_rdata,
input wire up_read_en,
input wire up_write_en,
output wire up_ack,
//--------------------device IPC interface------------------------
input wire ipc_ack,
input wire [:]ipc_rdata,
output wire [:]ipc_wdata,
output wire ipc_rd,
output wire ipc_wr,
output wire [:]ipc_addr,
//--------------------------channel-------------------------------
input wire channel_sel,
//--------------------read flag-----------------------------------
output wire read_start_w
); //------------------------read------------------------------------
reg ipc_rd_r;
reg [:]ipc_addr_r;
reg ipc_wr_r;
reg [:]ipc_wdata_r;
reg [:]ipc_rdata_r;
reg read_start;
reg read_done;
reg write_done;
reg [:]i;
reg [:]j;
reg get_read_address;
reg get_write_address;
reg up_read_en_delay;
reg up_write_en_delay; always @ (posedge clk or posedge reset)
if(reset)
begin
up_read_en_delay <= 'b0;
up_write_en_delay <= 'b0;
end
else
begin
up_read_en_delay <= up_read_en;
up_write_en_delay <= up_write_en;
end always @ (posedge clk or posedge reset)
if(reset)
begin
ipc_rd_r <= 'b0;
ipc_rdata_r <= 'h00000000;
read_start <= 'b0;
read_done <= 'b0;
i <= 'd0;
get_read_address <= 'b0;
end
else
begin
read_start <= 'b0;
read_done <= 'b0;
ipc_rd_r <= 'b0;
get_read_address <= 'b0;
case(i)
'd0:
begin
if(channel_sel && up_read_en_delay)
begin
get_read_address <= 'b1;
i <= i + 'b1;
end
else
i <= 'd0;
end
'd1:
begin
if(!ipc_ack)
ipc_rd_r <= 'b1;
else
begin
ipc_rdata_r <= ipc_rdata;
read_start <= 'b1;
read_done <= 'b1;
i <= i + 'b1;
end
end
'd2:
begin
if(channel_sel && !up_read_en_delay)
i <= 'd0;
else
i <= 'd2;
end
default:
begin
i <= 'd0;
read_start <= 'b0;
read_done <= 'b0;
ipc_rd_r <= 'b0;
get_read_address <= 'b0;
end
endcase
end
//------------------------write--------------------------------
always @ (posedge clk or posedge reset)
if(reset)
begin
ipc_wr_r <= 'b0;
ipc_wdata_r <= 'h00000000;
write_done <= 'b0;
j <= 'd0;
get_write_address <= 'b0;
end
else
begin
write_done <= 'b0;
ipc_wr_r <= 'b0;
get_write_address <= 'b0;
case(j)
'd0:
begin
if(channel_sel && up_write_en_delay)
begin
get_write_address <= 'b1;
ipc_wdata_r <= up_wdata;
j <= j + 'b1;
end
else
j <= 'd0;
end
'd1:
begin
if(!ipc_ack)
ipc_wr_r <= 'b1;
else
begin
write_done <= 'b1;
j <= j + 'b1;
end
end
'd2:
begin
if(channel_sel && !up_write_en_delay)
j <= 'd0;
else
j <= 'd2;
end
default:
begin
j <= 'd0;
write_done <= 'b0;
ipc_wr_r <= 'b0;
get_write_address <= 'b0;
end
endcase
end
//-------------------up_ack signal--------------------------
reg up_ack_r;
always @ (posedge clk or posedge reset)
if(reset)
up_ack_r <= 'b0;
else if(read_done || write_done)
up_ack_r <= 'b1;
else
up_ack_r <= 'b0; assign up_ack = up_ack_r; //------------------drive addr output-------------------------
always @ (posedge clk or posedge reset)
if(reset)
ipc_addr_r <= 'h000;
else if(get_read_address || get_write_address)
begin
ipc_addr_r <= up_address_channel;
end assign ipc_rd = ipc_rd_r;
assign ipc_addr = ipc_addr_r;
assign ipc_wdata = ipc_wdata_r;
assign ipc_wr = ipc_wr_r;
assign up_rdata = ipc_rdata_r;
assign read_start_w = read_start; endmodule
备注:在进行总线写操作的时候,写地址和数据信号要先准备好,等待写使能信号的到来。
非常重要的两点需要注意:
1.外部输入的控制信号,(如使能信号)往往和clk不同步,这就需要在使用前做延时处理,使其同步,这需要根据调试情况来定。
2.使能信号的使用,使能信号往往是一种脉冲信号,即:一个高点平期间,只进行一次相应的操作(读或写),这就需要在状态机中对使能信号进行合理的运用。如状态机中最后的一个状态:
'd2:
begin
if(channel_sel && !up_read_en_delay)
i <= 'd0;
else
i <= 'd2;
end 'd2:
begin
if(channel_sel && !up_write_en_delay)
j <= 'd0;
else
j <= 'd2;
end
当使能信号执行完一个状态机后拉低时,状态机回到初始状态;
当使能信号执行完一个状态机后依旧保持高电平,状态机依旧保持当前状态。
这就是一个使能脉冲,执行一次操作的控制方法。
总线读写---verilog代码的更多相关文章
- AXI总线slave模式下接收数据---verilog代码
AXI总线slave模式下接收数据---verilog代码 `timescale 1ns / 1ps ///////////////////////////////////////////////// ...
- 分享:FIFO 同步、异步以及Verilog代码实现
FIFO 很重要,之前参加的各类电子公司的逻辑设计的笔试几乎都会考到. FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线 ...
- FIFO 的控制逻辑---verilog代码
FIFO 的控制逻辑---verilog代码 //fifo的例化 wire fifo_full; wire fifo_empty; : ] fifo_dout; :]rd_data_count; :] ...
- Verilog代码和FPGA硬件的映射关系(一)
代码和硬件之间的映射关系是一个很奇妙的过程,也展现出人类的智慧.单片机内部的硬件结构都是固定的,无法改变,我们通过代码操作着寄存器的读写,来执行各种复杂的任务.FPGA的硬件结构并不像单片机一样是固定 ...
- Verilog代码规范I
Verilog代码规范I "规范"这问题 "规范"这个富含专业气息的词汇(个人感觉),其实规范这种东西,就是大家都约定熟成的东西,一旦你不遵守这个东西,专业人士 ...
- HD,3G视频数据中行号的插入方法---Verilog代码实现
HD,3G视频数据中行号的插入方法---Verilog代码实现 行号的生成: `timescale 1ns / 1ps //////////////////////////////////////// ...
- 串口接收端verilog代码分析
串口接收端verilog代码分析 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////// ...
- 串口发送端verilog代码分析
串口发送端verilog代码分析 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////// ...
- verilog 代码分析与仿真
verilog 代码分析与仿真 注意:使用vivado 自带的仿真工具, reg和wire等信号需要赋予初始值 边沿检测 module signal_test( input wire cmos_pcl ...
随机推荐
- 看我怎么扒掉CSDN首页的底裤(python selenium+phantomjs爬取CSDN首页内容)
这里只是学习一下动态加载页面内容的抓取,并不适用于所有的页面. 使用到的工具就是python selenium和phantomjs,另外调试的时候还用了firefox的geckodriver.exe. ...
- CSS3一个酷炫的加载效果
上效果图,用截屏工具制作的,看起来有点卡,在网页上面显示还是不错的. CSS代码: <style type="text/css"> .loader{ position: ...
- JAVA (StringBuffer/StringBuilder)常用API
public class Copy3 { public static void main(String[] args) { //构造实例化 StringBuffer strbu = new Strin ...
- 复杂的动态布尔表达式性能评估(2)--Groovy实现
前言: 规则引擎中, 往往涉及到多个条件构成了复杂布尔表达式的计算. 对于这类布尔表达式, 一是动态可变的(取决于运营人员的设定), 二是其表达式往往很复杂. 如何快速的计算其表达式的值, 该系列文章 ...
- day 016 面向对象---类与类的关系
---恢复内容开始--- 一 依赖关系(最轻的一种关系,在方法中引入另一个类的对象) class Elephant: def __init__(self,name): self.name=name ...
- putty 、xshell的使用 和 putty 、xshell、 shell 间免密登陆
相关软件的使用: ######################################################################### 以上是相关软件的使用! 以下是免密 ...
- Python字符集
字符集: 美国:ASCII 需要8bit表示 英文字母一个字节,不支持中文中国:GBK 英文字母一个字节,汉字占两个字节万国:un ...
- spring IOC简单分析
Spring IOC 体系结构 BeanFactory(BeanFactory 里只对 IOC 容器的基本行为作了定义,根本不关心你的 bean 是如何定义怎样加载的.正如我们只关心工厂里得到什么的产 ...
- windows server 2008 R2 部署NFS,实现多台服务器间、客户端间的共享目录。
如何通过Windows Server 2008 R2建立NFS存储服务? 通过Windows Server 2008 R2,我们可以很容易地将其作为一台NFS存储服务器,得到一个NFS软存储,轻松解决 ...
- 【shell编程】之基础知识-常用命令
一.Shell echo命令 Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出.命令格式: echo string 您可以使用echo实现更复杂的输出格式控制. ...