雙向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