日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Verilog 中 inout 端口的使用与测试

發(fā)布時間:2023/12/13 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 Verilog 中 inout 端口的使用与测试 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

inout 端口的使用

第一次遇到inout端口的使用,是在大三的時候,課程要求寫一個通過 I2C 讀取EEPROM的電路。當(dāng)時連抄帶蒙實現(xiàn)了功能,助教略略檢查了一下就過關(guān)了。現(xiàn)在導(dǎo)師給了個小任務(wù),給一個存儲芯片寫SPI接口,這又涉及到inout端口的使用了。不必奇怪,SPI的Master的確不需要用inout,但現(xiàn)在做的事寫SPI的Slave,目標存儲器用了inout

稍稍百度一下可以知道,inout需要一個三態(tài)門,一個實現(xiàn)方法是(當(dāng)然還有其它方法):

assign data_io=read?mem_tmp:8'bzzzzzzzz;

讀取時,往mem_tmp送數(shù)據(jù),接收輸入時,直接從inout端口取數(shù)據(jù),類似于:

mem_tmp <= memory[addr];

這是被讀取端。

如何進行測試

也許是我沒認真看其它網(wǎng)友的博客,我根據(jù)自己的理解理了理對inout端口的Testbench的編寫。

首先,Testbench沒有端口,也就沒有inout類型的信號/變量可以用,讀取數(shù)據(jù)需要wire類型的信號,寫入數(shù)據(jù)需要reg類型的信號,也就是說需要兩個信號來測試inout端口。

舉個例子,一個16-Byte隨機存取存儲器:

`timescale 1ns/1ps

module ram_16x8bit(
    input clk,
    input [7:0] addr,
    input read,
    inout [7:0] data_io
);
reg [7:0] memory[0:15];
reg [7:0] mem_tmp;
assign data_io=read?mem_tmp:8'bzzzzzzzz;

initial begin
    $readmemh("mem.txt", memory);
end

always@(posedge clk) begin
    if(read) mem_tmp <= memory[addr];
    else memory[addr] <= data_io;
end

endmodule // 16Byte ram

它的Testbench可以是:

`timescale 1ns/1ps

module test;
reg clk;
reg [7:0] addr;
reg read;
wire [7:0] data_wire;
reg [7:0] data_reg;

assign data_wire = read?8'hzz:data_reg;

initial begin
    $dumpfile("wave.vcd");
    $dumpvars(0,test);
    clk = 1'b1;
    forever begin
        #5 clk = ~clk;
    end 
end
integer i;
initial begin
    // Read Test
    #10;
    i = 0;
    while(i<=15) begin
        #10;
        read = 1'b1;
        addr = i;
        i = i + 1;
    end

    //Write Test
    i = 0;
    while(i<=15) begin
        #10;
        read = 1'b0;
        addr = i;
        data_reg = 15 - i;
        i = i + 1;
    end
    i = 0;
    while(i<=15) begin
        #10;
        read = 1'b1;
        addr = i;
        i = i + 1;
    end

    #10 $finish;
end

ram_16x8bit test_ram(
    .clk(clk),
    .addr(addr),
    .read(read),
    .data_io(data_wire)
);
endmodule

inout端口的處理:

assign data_wire = read?8'hzz:data_reg;

示意圖如下:

VCS生成的Schematic:

測試波形:

結(jié)論

本文實現(xiàn)了對inout端口的讀寫。

總結(jié)

以上是生活随笔為你收集整理的Verilog 中 inout 端口的使用与测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。