• 【深入浅出玩转FPGA学习14----------测试用例设计2】


    深入浅出玩转FPGA学习13----------测试用例设计2

    可重用MCU读/写设计

    该测试脚本要模拟MCU读/写外部扩展RAM的时序 。 它将作为一个单独的测试模块, 只要在测试主文件中例化好接口,就可以被调用。 常见MCU读/写外部扩展RAM的时序如图3. 6和图3. 7所示 。
    在这里插入图片描述
    在这里插入图片描述
    该测试模块的脚本如下:

    `timescale 1ns/1ps
    module mcuram_rdwr(
    								mcu_ale,mcu_wr_n,mcu_rd_n,mcu_p1,mcu_p0
    								);
    output reg mcu_ale;  //MCU读写外部RAM片选信号,低电平有效
    output reg mcu_wr_n;   //MCU读写外部RAM写选通信号,低电平有效
    output reg mcu_rd_n;   //MCU读写外部RAM读选通信号,低电平有效
    output reg [7:0] mcu_p1;  //MCU的p1端口,高8位地址总线
    inout [7:0] mcu_p0;   //MCU的P0端口,低8位地址总线与8位数据总线复用
    //----------------------------------------------------------------------------------------------------//
    reg[7:0] mcu_p0_out;  //MCU的p0端口数据总线输出寄存器
    reg mcu_p0_link;    /MCU的p0端口数据方向控制寄存器,1----output,0-------input
    assign mcu_p0 = mcu_p0_link ? mcu_p0_out : 8'hzz;
    //---------------------------------initial begin----------------------------------------------
    //MCU各个信号复位
    mcu_ale = 1;
    mcu_wr_n = 1;
    mcu_rd_n = 1;
    mcu_p0_out = 8'hff;
    mcu_p0_link =1;
    mcu_p1 = 8'hff;
    //------------------------------------------------------------------------------------------------
    task mcu_wr_task;   //模拟MCU写外部RAM时序
    		input[15:0] wraddr;
    		input[7:0] wrdata;
    		begin
    			#(127-43);
    			mcu_p0_link =1;   //MCU的p0端口为输出
    			mcu_p0_out = wraddr[7:0];  //送低8位地址
    			mcu_p1= wraddr[15:8];   //送高8位地址
    			# 43
    			mcu_ale = 0;  //片选信号
    			#48;
    			mcu_p0_out = wrdata;   //送写入数据
    			#23;
    			mcu_wr_n =0;  //MCU读选通
    			# 400;
    			mcu_wr_n = 1;
    			#33;
    			mcu_p0_out = { $random};
    			mcu_p1 = {$random};
    			#(100-33);
    			mcu_ale =1;
    		end
    endtask
    task mcu_rd_task;    //模拟MCU读外部RAM时序
    		input[15:0] rdaddr;
    		output[7:0] rddata;
    		begin
    				#(127-43);
    				mcu_p0_link = 1;  //MCU的P0端口为输出
    				mcu_p0_out = rdaddr[7:0];  //送低8位地址
    				mcu_p1  rdaddr[15:8];  //送高8位地址
    				#43;
    				mcu_ale = 0;   //片选有效
    				#48;
    				mcu_p0_out {$random};
    				#(250-48);
    				mcu_rd_n = 0;   //MCU写选通
    				#25;
    				mcu_p0_link = 0;   //MCU的p0端口为输入
    				#(400-25-20);
    				rddata = mcu_p0;   //读取数据
    				#20;
    				mcu_rd_n = 1;
    				mcu_p0_link = 1;   //MCU的p0端口为输出
    				mcu_p0_out = {$random};
    				mcu_p1 = {$random};
    				#100;
    				mcu_ale = 1;
    		end
    endtask
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    根据测试脚本模拟出来的读/写时序波形分别如图3.8和3.9所示。
    **加粗样式**![
    在这里插入图片描述](https://img-blog.csdnimg.cn/fe319f94b18b400ab2462a83ccb0c3c4.png)
    对于这个设计,虽然它已经达到了可以复用的目的,但是在自动化判断方面做的还不够。比如,从图3.6中可以看到,MCU在读取外部存储器过程中,读选通信号RDn拉低后25ns内,P0数据总线上数据必须保持有效并稳定,该状态要一直保持到RDn拉高为止。

  • 相关阅读:
    手写一个 Redis LruCache 缓存机制
    Spring Boot整合Log4j2.xml的问题
    Springboot 是这样提高创建 docker 容器的效率的
    es笔记三之term,match,match_phrase 等查询方法介绍
    读高性能MySQL(第4版)笔记18_扩展MySQL
    链路预算仿真要求
    三井住友保险中国区信息技术部负责人陈婧,将出席“ISIG-RPA超级自动化产业发展峰会”
    哪吒汽车选择BlackBerry QNX为中国新能源轿跑——哪吒S保驾护航
    element table表格实现多列排序并清除排序
    μCOS-Ⅲ中断管理,这样理解非常简单!
  • 原文地址:https://blog.csdn.net/qq_38617667/article/details/126023087