FPGA基礎(chǔ)知識極簡教程(8)詳解三態(tài)緩沖器
博文目錄
寫在前面
正文
全雙工與半雙工
FPGA和ASIC中的三態(tài)緩沖器
如何在VHDL和Verilog中推斷出三態(tài)緩沖區(qū)
參考資料
交個朋友
寫在前面
下面用舉例子的方式引出三態(tài)門,內(nèi)容過長,大家可直接跳過,進(jìn)入正文!
三態(tài)門在FPGA以及ASIC設(shè)計中十分常用,隨便舉一個例子,在RAM的設(shè)計中(無論是同步讀寫RAM還是異步讀寫RAM設(shè)計),我們常將數(shù)據(jù)總線設(shè)計成inout類型,下面是一個設(shè)計程序?qū)嵗?/p>
`timescale 1ns / 1ps // // Engineer: Reborn Lee // Module Name: single_port_syn_ram / module single_port_syn_ram#( parameter ADDR_WIDTH = 4, parameter DATA_WIDTH = 16, parameter DEPTH = 2**ADDR_WIDTH )( input i_clk, input [ADDR_WIDTH - 1 : 0] addr, inout [DATA_WIDTH - 1 : 0] data, input cs, input wr, input oe ); reg [DATA_WIDTH - 1 : 0] mem[0 : DEPTH - 1]; reg [DATA_WIDTH - 1 : 0] mid_data; // write part always@(posedge i_clk) begin if(cs&wr) begin mem[addr] <= data; end end // read part always@(posedge i_clk) begin if(cs & !wr) begin mid_data <= mem[addr]; end end assign data = (cs & oe & !wr)? mid_data: 'hz; 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
在讀數(shù)據(jù)的時候,我們需要設(shè)計一個三態(tài)緩沖器,如下:
assign data = (cs & oe & !wr)? mid_data: 'hz;
1
讀使能有效時,我們將從緩沖區(qū)讀出的數(shù)據(jù)放到mid_data中,之后通過一個三態(tài)門來將數(shù)據(jù)mid_data輸出到三態(tài)總線上,此三態(tài)門的使能條件為讀使能!
這條語句在綜合工具中就會被推斷為一個三態(tài)緩沖器!
在讀使能有效時,將讀取數(shù)據(jù)放在總線上,否則呈現(xiàn)為高阻態(tài),避免占用此數(shù)據(jù)總線。
在testbench文件中,我們同樣需要作出類似的操作,如下針對上面的ram的測試文件:
`timescale 1ns / 1ps /// // Engineer: Reborn Lee // Module Name: ram_tb // module ram_tb( ); parameter ADDR_WIDTH = 4; parameter DATA_WIDTH = 16; parameter DEPTH = 2**ADDR_WIDTH; reg i_clk; reg [ADDR_WIDTH - 1 : 0] addr; wire [DATA_WIDTH - 1 : 0] data; reg cs; reg wr; reg oe; reg [DATA_WIDTH-1:0] tb_data; //generate system clock initial begin i_clk = 0; forever begin # 5 i_clk = ~i_clk; end end assign data = !oe ? tb_data : 'hz; initial begin {cs, wr, addr, tb_data, oe} = 0; repeat (2) @ (posedge i_clk); //write test for (integer i = 0; i < 2**ADDR_WIDTH; i= i+1) begin repeat (1) @(negedge i_clk) addr = i; wr = 1; cs =1; oe = 0; tb_data = $random; end //read test repeat (2) @ (posedge i_clk); for (integer i = 0; i < 2**ADDR_WIDTH; i= i+1) begin repeat (1) @(posedge i_clk) addr = i; wr = 0; cs = 1; oe = 1; end #20 $finish; end single_port_syn_ram #( .ADDR_WIDTH(ADDR_WIDTH), .DATA_WIDTH(DATA_WIDTH), .DEPTH(DEPTH) ) inst_single_port_syn_ram ( .i_clk (i_clk), .addr (addr), .data (data), .cs (cs), .wr (wr), .oe (oe) ); 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
由于inout端口在測試文件中必須設(shè)置為wire類型,因此,我們在設(shè)計寫數(shù)據(jù)時,需要定義一個中間reg類型變量,這個變量在寫使能有效時候輸入給寫數(shù)據(jù)端口,如下:
assign data = !oe ? tb_data : 'hz;
1
否則,也就是寫使能無效時,就為高阻態(tài),不占用數(shù)據(jù)總線!
注:上面用了oe無效代替寫使能有效,有點(diǎn)不太嚴(yán)謹(jǐn),但也沒問題 ,僅供各位參考!
個人博客首頁
注:學(xué)習(xí)交流使用!
正文
三態(tài)緩沖器可以處于以下三種狀態(tài)之一:邏輯0,邏輯1和Z(高阻抗)。它們的使用允許多個驅(qū)動程序共享一條公共線路。這使得它們在半雙工通信中特別有用。讓我們首先討論半雙工和全雙工通信之間的區(qū)別。
全雙工與半雙工
全雙工和半雙工的區(qū)別可以使用下面的兩幅圖來說明:
在全雙工系統(tǒng)中,有兩個路徑用于在兩個芯片之間發(fā)送數(shù)據(jù)。從芯片1到芯片2有一條專用路徑,從芯片2到芯片1有一條專用路徑。在半雙工系統(tǒng)中,只有一條路徑可以在兩個芯片之間發(fā)送數(shù)據(jù)。因此,這兩個芯片必須在要傳輸?shù)膶ο笊线_(dá)成共識。如果兩者嘗試同時傳輸,則線路上將發(fā)生沖突,并且數(shù)據(jù)將丟失。
在以上兩個圖中,三角形是您的緩沖區(qū)。注意,在半雙工框圖中,存在信號Tx En。這是控制三態(tài)發(fā)送緩沖器的信號。在全雙工塊圖中,此信號不是必需的,因?yàn)閮蓚€發(fā)送器都可以在100%的時間內(nèi)打開,而不會在線路上發(fā)生沖突。
FPGA和ASIC中的三態(tài)緩沖器
如下為三態(tài)緩沖器的真值表:
請注意,如果兩個Tx En同時都為高,則兩個發(fā)送器都將在驅(qū)動并且線路上將發(fā)生沖突。 使用半雙工三態(tài)緩沖器時,至關(guān)重要的是,共享線路的模塊必須制定出一種避免數(shù)據(jù)沖突的通信方案。
如何在VHDL和Verilog中推斷出三態(tài)緩沖區(qū)
綜合工具可以推斷出三態(tài)緩沖器。這是在VHDL中推斷三態(tài)緩沖區(qū)的方法。信號io_data 在實(shí)體的端口映射部分中聲明為inout。在VHDL中,“ Z”為高阻抗。
inout io_data : std_logic; --port declaration of bidirectional data line io_data <= w_Tx_Data when w_Tx_En = '1' else 'Z'; w_Rx_Data <= io_data;
1
2
3
4
這是在Verilog中推斷三態(tài)緩沖區(qū)的方法。信號io_data 在模塊的端口聲明部分中聲明為inout。在Verilog中,1’bZ是高阻抗。
inout io_data; //port declaration of bidirectional data line assign io_data = Tx_En ? Tx_Data : 1'bZ; assign Rx_Data = io_data;
1
2
3
4
三態(tài)緩沖器常用于半雙工UART和I2C接口等電路中。它們是數(shù)字設(shè)計師了解的非常有用的工具。您應(yīng)該知道如何在VHDL和Verilog中推斷三態(tài)緩沖區(qū)。
參考資料
參考資料1
參考資料2
參考資料3
交個朋友
知乎:李銳博恩
FPGA/IC技術(shù)交流2020
FPGA 單片機(jī)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。