雙向IO口的FPGA實現

雙向IO口的Verilog試驗

主要功能

爲深入理解雙向端口的使用,進行本仿真試驗,完成一個類似可修改數值的計數器。en_set爲0時,通過一個雙向IO數據接口inout [7:0] bio 輸出模塊內部計數器cnt的計數值;en_set爲1時,通過bio輸入數值對內部計數器cnt進行設置。主模塊定義如下:

module stg
#
(
    parameter           WIDTH   =   7
)
(
    input               			clk             	,
    input               			rst_n           	,
    inout   [WIDTH:0]   	        bio                	,
    input               			en_set                  
);

bio爲雙向IO:
1)en_set爲1時bio爲輸入口,置爲高阻態輸出(不影響輸入),並將輸入的數值賦值到cnt;
2)en_set爲0時bio爲輸出口,輸出cnt的數值。

模塊代碼

`timescale 1ns/1ps
module stg
#
(
    parameter           WIDTH   =   7
)
(
    input               clk             ,
    input               rst_n           ,
    inout   [WIDTH:0]   bio             ,
    input               en_set                  
);

    reg     [WIDTH:0]   cnt;
    always @(posedge clk or negedge rst_n) begin
        if(~rst_n)
            cnt <= 'd0;
        else if(en_set == 1'b1)
            cnt <= bio;
        else
            cnt <= cnt + 'd1;
    end
    
    
    assign bio = (en_set == 1'b1) ? 'bz : cnt;

endmodule

仿真代碼

`timescale 1ns/1ps
module tb_stg;

reg                     clk             ;
reg                     rst_n           ;
wire        [7:0]       bio             ;
reg                     en_set          ;     

stg
#
(
.WIDTH              (7          )
)
u_stg
(
.clk                (clk        )           ,
.rst_n              (rst_n      )           ,
.bio                (bio        )           ,
.en_set             (en_set     )       
);

initial begin
    rst_n = 0;
    clk = 0;
    en_set = 0;
    #100;
    rst_n = 1;
    #1000;
    en_set = 1;
    #100;
    en_set = 0;
end

always #10 clk = ~clk;

assign bio = (en_set == 1'b1) ? 7'h68 : 7'hzz;

endmodule

仿真結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章