总线读写---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 ...
随机推荐
- 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6152 Friend-Graph(暴力搜索)
题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=6152 Problem Description It is well known that small ...
- HDU 2585 Hotel(字符串的模糊匹配+递归)
Problem Description Last year summer Max traveled to California for his vacation. He had a great tim ...
- Spring 配置文件
<?xml version="1.0" encoding="UTF-8" ?> <beans> <bean id=...> ...
- a标签总结
一.<a>定义和用法 <a> 标签定义超链接,用于从一张页面链接到另一张页面. <a> 元素最重要的属性是 href 属性,它指示链接的目标. 在所有浏览器中 ...
- jqGrid 加载完jqGrid之后可以执行函数的方法
, gridComplete: function() { jQuery('#first_gridpager').html("首页 "); jQuery('#prev_gridpag ...
- CentOS7源码安装qbittorrent最新版本
CentOS的软件 yum 里 yum search qbittorrent yum info qbittorrent 找到的是3.37版本 官网最新的是4.12版本.但需要源码安装: 官网下载最新版 ...
- Python语言规范
Lint 对你的代码运行pylint 定义: pylint是一个在Python源代码中查找bug的工具. 对于C和C++这样的不那么动态的(译者注: 原文是less dynamic)语言, 这些bug ...
- 重写&重载
重写:子类对父类或接口中方法重新定义,是同一个方法 (1)子类不能重写final方法 (2)子类必须重写abstract方法 重载:一个类内部,方法同名,参数列表不同 (1)返回值不能作为区分重载方法 ...
- LA3641 Leonardo's Notebook
题意 PDF 分析 给出一个26个大写字母的置换B,是否存在A^2 = B 每个置换可以看做若干个循环的乘积.我们可以把这些循环看成中UVa 10294的项链, 循环中的数就相当于项链中的珠子. A^ ...
- golang . xml output with cdata
out put with cdata package main //warning: go version must >=1.6 import ( "encoding/xml" ...