//主要是// 和**********部分是关键
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仿真的方法的更多相关文章

  1. 在verilog中关于inout口的设计方法

    在学习IIC的时候我们知道这么设计inout inout   scl : reg    scl_reg ,  scl_en ; scl  = scl_en ?   scl_reg : 1'dz ; 当 ...

  2. 用Modelsim仿真QuartusII综合后网表时库的添加方法(转)

    这两天做综合后仿真,发现FPGA器件库又不会加了,无奈上网找方法.说起来不好意思,很早就接触Modelsim这个仿真软件了,可是没有好好琢磨.把这两天找的方法贴出来,再加上自己的理解,以后忘了可以上博 ...

  3. 【黑金原创教程】【Modelsim】【第一章】Modelsim仿真的扫盲文

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

  4. ModelSim仿真入门

    ModelSim仿真入门之一:软件介绍 编写这个教程之前,为了让不同水平阶段的人都能阅读,我尽量做到了零基础入门这个目标,所有的操作步骤都经过缜密的思考,做到了详细再详细的程度. 如果您是FPGA开发 ...

  5. modelsim仿真基本流程

    好久没再用过modelsim,都忘的一干二净了.刚换了份工作,又要重新拾起来,不过现在感觉modelsim的仿真其实是比较快的,很有用处.再者这么长时间老是学了忘,忘了再学,觉得真浪费时间,平时确实应 ...

  6. cordic算法的verilog实现及modelsim仿真

    1. 算法介绍 CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数.双曲 ...

  7. 45.modelsim仿真include文件

    modelsim仿真include文件会出现找不到文件的情况,这是因为include文件路径有两种,一种是相对路径,另一种是绝对路径. 相对路径: 如果 ‘include "primitiv ...

  8. 14.quartus联合modelsim仿真

    在quartus调用modelsim仿真过程中,出现了一个错误,如下所示: Check the NativeLink log file I:/Quartus11.0/Myproject/testi_n ...

  9. modelsim 仿真时出现无限迭代(iteration reach limitation)的原因及其解决办法

    modelsim 仿真时出现无限迭代(iteration reach limitation) 出现这种故障的原因:  一般都是代码里出现的组合逻辑无限循环或者组合逻辑A产生signal_A,signa ...

随机推荐

  1. JAVA循环的语法

    一,有几种循环的语法 1while. while(循环条件){ 循环操作 } while(循环条件){ 循环操作 } 2.do-while do{ 循环操作 }while(循环条件); do{ 循环操 ...

  2. CF1062E Company

    CF1062E Company 链接 cf luogu 题目大意 给定一颗树,有若干个询问,每个询问给出 l,r,要求编号为 ll~rr 的点任意删去一个之后剩余点的 LCA 深度最大,输出删去点的编 ...

  3. Python3.6 运行提示 ImportError: cannot import name 'CONFIG_FILE'

    如下代码: import os from utils.file_reader import YamlReader BASE_PATH = os.path.split(os.path.dirname(o ...

  4. inode满处理

    https://blog.csdn.net/liuxiao723846/article/details/79423581 [root@monitor251 bin]# for i in /boot; ...

  5. ionic3 在windows环境下打包android 正式签名版APK

    生成签名文件keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore demo为 ...

  6. android------个人项目(歆语气象通新版)

    歆语气象通: 歆语气象伴随你的身边,便捷生活. 包含了以下功能: 1. 天气预报数据覆盖中国城市和地区:2. 提供一周天气预报及最低最高温度,时刻关注天气,轻松计划出行:3. 各种指数详细信息,如太阳 ...

  7. LVM方式安装Ubuntu 系统

    重装Ubuntu系统,使用LVM管理磁盘,最好不要使用默认的LVM安装方式,而应挂载U盘启动盘,进行物理磁盘分区,创建物理卷.卷组.虚卷(即创建LVM系列操作),在安装系统时将虚卷挂载到文件目录上.将 ...

  8. java Arrays.asList方法注意事项

    1. 简介 Arrays.asList()方法可以将数组转化为长度固定的列表. 该方法强调了列表的长度是固定的,因此不能使用list的add和remove方法修改list长度. 2. 示例 impor ...

  9. 磁盘当前目录下存在文件 c1.txt,其中存放了一段英文文字。请编程实现将c1.txt中英文文字全部转换为答谢字母,并保存到c2.txt中。要求:c2.txt文件前面保存的是c1.txt文案中的原始文字,后面紧跟着的是转换后的文字

    #include"stdio.h"#include"string.h" void main(){ FILE *fp1,*fp2; char ch[1000]=& ...

  10. kafka 常用参数

    通常的讲:kafka 的参数分为 Broker Configs 和 Topic-Level Configs,以 min.insync.replicas 为例,可以在 broker 和 topic 级别 ...