总线读写---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 ...
随机推荐
- 莫烦tensorflow(4)-placeholder
import tensorflow as tf input1 = tf.placeholder(tf.float32)input2 = tf.placeholder(tf.float32) outpu ...
- React-native-camera error with Expo: undefined is not an object (evaluating 'CameraManager.Aspect')
React-native-camera error with Expo: undefined is not an object (evaluating 'CameraManager.Aspect') ...
- 2.26 js解决click失效问题
2.26 js解决click失效问题 前言有时候元素明明已经找到了,运行也没报错,点击后页面没任何反应.这种问题遇到了,是比较头疼的,因为没任何报错,只是click事件失效了.本篇用2种方法解决这种诡 ...
- sequence to sequence模型
sequence to sequence模型是一类End-to-End的算法框架,也就是从序列到序列的转换模型框架,应用在机器翻译,自动应答等场景. Seq2Seq一般是通过Encoder-Decod ...
- JavaScript中的内置对象-8--2.String-符串对象 方法; 截取方法; 综合应用; 其他方法;
JavaScript内置对象-2String(字符串) 学习目标 1.掌握字符串对象 方法: charAt() charCodeAt() indexOf() lastIndextOf() charAt ...
- search的 制作
<meta charset="utf-8"> <title>search的制作</title> <style type="te ...
- SQLI DUMB SERIES-4
less4 输入单引号发现回显正常,说明单引号被过滤了,输入双引号: ?id=1" 说明输入的Id被一对双引号和圆括号包围,因此闭合双引号和圆括号就行,其他方法跟less1差不多 例如:un ...
- 嵌套for
- 使用w uptime vmstat top sar nload 等命令查看系统负载
1. w 和uptime,查看cpu的使用率: 2.vmstat 命令,查看更细的物理设备使用状况: 3.top 命令: top -c 可具体查看命令及路径: top -bn1 静太显示一条命令, ...
- sudo命令 和限制root 远程登陆
1.对sudo命令的配制,输入 visudo 然后,找到92行进行以下配制 以下就是效果 比如: 如果要同时给两个普通用户设置这样子的权限,就可以用另一种方式,下面这种方式不可取的 而是用这种 效果如 ...