inout口在modelsim仿真的方法
//主要是// 和**********部分是关键
1 `timescale 1ns/1ns
module tb(); reg main_clk;
reg [:] addr;
reg FPGA_CS0;//FPGA cs
reg RD;
reg WR;
wire arm_clk;
wire led; wire [:]data; //*******
reg [:] treg_data; //关键部分
integer i; // assign data = treg_data; //***** STM32_FPGA u1(
.main_clk(main_clk),
.arm_clk(arm_clk),
.led(led),
.addr(addr),
.data(data),
.FPGA_CS0(FPGA_CS0),//FPGAƬ
.RD(RD),
.WR(WR) ); initial begin
main_clk = ;
addr = 'd0;
FPGA_CS0 = ;
RD = ;
WR = ;
i = ;
treg_data = ;
#
for(i=;i<;i=i+)begin //往FPGA寄存器写入8个随机数据
WR = ;
addr = i;
treg_data = $random;
#
WR = ;
#;
end
treg_data ='bz; //写完后,treg_data 与 data 断开
#
for(i=;i<;i=i+)begin //从FPGA 寄存器读出8个数据
FPGA_CS0 = ;
RD = ;
addr = i;
#;
end
FPGA_CS0 = ;
RD = ; end always # main_clk = ~main_clk; endmodule
1 /* 实际调试没有发现什么问题! */
module STM32_FPGA(
input main_clk,
output arm_clk, output led, input [:] addr,
inout[:] data, input FPGA_CS0,//FPGA片选
input RD,
input WR ); wire clk; pll_50M pll_50M_inst (
.inclk0 ( main_clk ),//25M
.c0 ( clk ), //50M
.c1 ( arm_clk ) //8M
); reg [:] cnt = ;
always @(posedge clk)
cnt <= cnt + 'b1; assign led = cnt[]; //AWE的上升沿,将数据写入FPGA寄存器 reg [:] ARM_FPGA_REG0;
reg [:] ARM_FPGA_REG1;
reg [:] ARM_FPGA_REG2;
reg [:] ARM_FPGA_REG3;
reg [:] ARM_FPGA_REG4;
reg [:] ARM_FPGA_REG5;
reg [:] ARM_FPGA_REG6;
reg [:] ARM_FPGA_REG7; wire rd_en = ~FPGA_CS0 && ~RD; reg [:] data_reg;
//always @(posedge clk) //DSP读操作,The sampling point of DSP reading is the risging edge of AWE!
always @(*)
begin
if(rd_en)
begin
case(addr[:])
'd0 : data_reg <= ARM_FPGA_REG0;
'd1 : data_reg <= ARM_FPGA_REG1;
'd2 : data_reg <= ARM_FPGA_REG2;
'd3 : data_reg <= ARM_FPGA_REG3;
'd4 : data_reg <= ARM_FPGA_REG4;
'd5 : data_reg <= ARM_FPGA_REG5;
'd6 : data_reg <= ARM_FPGA_REG6;
'd7 : data_reg <= ARM_FPGA_REG7;
default: data_reg<= 'hzzzz;
endcase
end
else data_reg<= 'hzzzz;
end /* AWE下降沿DSP的数据写入FPGA,即sampling point */ reg WR_tmp1;
reg WR_tmp2;
always @(posedge clk)
begin
WR_tmp1 <= WR;
WR_tmp2 <= WR_tmp1;
end wire WR_RISING = WR_tmp2 && ~WR_tmp1;//与clk同步 always @(*)
begin
if(WR_RISING)
begin
case(addr[:])
'd0 : ARM_FPGA_REG0 <= data;
'd1 : ARM_FPGA_REG1 <= data;
'd2 : ARM_FPGA_REG2 <= data;
'd3 : ARM_FPGA_REG3 <= data;
'd4 : ARM_FPGA_REG4 <= data;
'd5 : ARM_FPGA_REG5 <= data;
'd6 : ARM_FPGA_REG6 <= data;
'd7 : ARM_FPGA_REG7 <= data;
default: ;
endcase
end
else begin
ARM_FPGA_REG0 <= ARM_FPGA_REG0;
ARM_FPGA_REG1 <= ARM_FPGA_REG1;
ARM_FPGA_REG2 <= ARM_FPGA_REG2;
ARM_FPGA_REG3 <= ARM_FPGA_REG3;
ARM_FPGA_REG4 <= ARM_FPGA_REG4;
ARM_FPGA_REG5 <= ARM_FPGA_REG5;
ARM_FPGA_REG6 <= ARM_FPGA_REG6;
ARM_FPGA_REG7 <= ARM_FPGA_REG7;
end
end
// assign data = rd_en ? data_reg : 16'hzzzz;
assign data = data_reg; //可以用三目运算,但根据54行到68行逻辑判断,没有必要 endmodule
参考原文http://blog.chinaaet.com/xzy610030/p/37525
inout口在modelsim仿真的方法的更多相关文章
- 在verilog中关于inout口的设计方法
在学习IIC的时候我们知道这么设计inout inout scl : reg scl_reg , scl_en ; scl = scl_en ? scl_reg : 1'dz ; 当 ...
- 用Modelsim仿真QuartusII综合后网表时库的添加方法(转)
这两天做综合后仿真,发现FPGA器件库又不会加了,无奈上网找方法.说起来不好意思,很早就接触Modelsim这个仿真软件了,可是没有好好琢磨.把这两天找的方法贴出来,再加上自己的理解,以后忘了可以上博 ...
- 【黑金原创教程】【Modelsim】【第一章】Modelsim仿真的扫盲文
声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...
- ModelSim仿真入门
ModelSim仿真入门之一:软件介绍 编写这个教程之前,为了让不同水平阶段的人都能阅读,我尽量做到了零基础入门这个目标,所有的操作步骤都经过缜密的思考,做到了详细再详细的程度. 如果您是FPGA开发 ...
- modelsim仿真基本流程
好久没再用过modelsim,都忘的一干二净了.刚换了份工作,又要重新拾起来,不过现在感觉modelsim的仿真其实是比较快的,很有用处.再者这么长时间老是学了忘,忘了再学,觉得真浪费时间,平时确实应 ...
- cordic算法的verilog实现及modelsim仿真
1. 算法介绍 CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数.双曲 ...
- 45.modelsim仿真include文件
modelsim仿真include文件会出现找不到文件的情况,这是因为include文件路径有两种,一种是相对路径,另一种是绝对路径. 相对路径: 如果 ‘include "primitiv ...
- 14.quartus联合modelsim仿真
在quartus调用modelsim仿真过程中,出现了一个错误,如下所示: Check the NativeLink log file I:/Quartus11.0/Myproject/testi_n ...
- modelsim 仿真时出现无限迭代(iteration reach limitation)的原因及其解决办法
modelsim 仿真时出现无限迭代(iteration reach limitation) 出现这种故障的原因: 一般都是代码里出现的组合逻辑无限循环或者组合逻辑A产生signal_A,signa ...
随机推荐
- MySQL 常用30种SQL查询语句优化方法
1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...
- springBoot整合jpa
https://blog.csdn.net/qq_35180973/article/details/82316438 总体来讲只是在service调用dao的时候用接口代替dao继承CrudRepos ...
- 你有可能不知道的css浮动问题
最近在开发过程中,有的时候会经常遇见明明知道需要这样做,但是为什么要这样做的原因我们却总是不明所以然. 先来解释下什么叫做清除浮动吧: 在非IE浏览器(如Firefox)下,当容器的高度为auto,且 ...
- Linux之磁盘分区
一.基础知识 1.磁盘分区 磁盘的分区主要分为基本分区(primary partion)和扩充分区(extension partion)两种,基本分区和扩充分区的数目之和不能大于四个.且基本分区可以马 ...
- Redis 持久化RDB 和AOF
一.持久化之全量写入:RDB rdb配置 [redis@6381]$ more redis.conf save 900 1 save 300 10 save 60 10000 dbfilename & ...
- MPU6050可以读取器件ID值,但读出的加速度计和陀螺仪的数据均为零
今天在调试MPU6050时发现,MPU6050可以正常读取器件ID,但读取的加速度计和陀螺仪的数据均为零. 经过排查发现,MPU6050第20脚的电容没用焊接,C6可以使用10uF的电容.
- efk学习整理
概念 Logstash 数据收集处理引擎.支持动态的从各种数据源搜集数据,并对数据进行过滤.分析.丰富.统一格式等操作,然后存储以供后续使用. kibana 可视化化平台.它能够搜索.展示存储在 El ...
- JS-函数作用域
如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量.
- 雷林鹏分享:jQuery EasyUI 数据网格 - 设置排序
jQuery EasyUI 数据网格 - 设置排序 本实例演示如何通过点击列表头来排序数据网格(DataGrid). 数据网格(DataGrid)的所有列可以通过点击列表头来排序.您可以定义哪列可以排 ...
- JMETER-02
JMeter使用篇 1.界面介绍 2.JMeter-测试计划 测试计划:一个JMeter脚本只有一个测试计划,且测试计划必须启用状态 容易掉的坑:由于JMeter脚本中的每个元器件都可以单独禁用,上级 ...