以前只知道电路的输出有高阻态,但是对高阻态的理解不够,对高阻态的用法也不清楚,直到用Verilog实现单端口SRAM时,才有了一个进一步的认识,记录如下;
Verilog实现单端口SRAM的内容见:Verilog实现RAM(2-单端口同步读写SRAM) 此处不再赘述
一、百度百科概念照搬
高阻态是一个数字电路里常见的术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,如果用万用表测的话有可能是高电平也有可能是低电平,随它后面接的东西定的。
简介:在电子学中,高阻态(英语:High impedance)表示电路中的某个节点具有相对电路中其他点相对更高的阻抗。这个概念在三态逻辑、上拉电阻中有所涉及。在硬件描述语言(如Verilog HDL和VHDL)中,高阻态通常用字母z来表示。
实质:电路分析时高阻态可做开路理解。你可以把它看作输出(输入)电阻非常大。它的极限状态可以认为悬空(开路)。也就是说理论上高阻态不是悬空,它是对地或对电源电阻极大的状态。而实际应用上与引脚的悬空几乎是一样的。
意义:当门电路的输出上拉管导通而下拉管截止时,输出为高电平;反之就是低电平;如上拉管和下拉管都截止时,输出端就相当于浮空(没有电流流动),其电平随外部电平高低而定,即该门电路放弃对输出端电路的控制 。
表示方法:高阻态常用字母 Z 表示。
典型应用 实例1:在总线连接的结构上。总线上挂有多个设备,设备与总线以高阻的形式连接。这样在设备不占用总线时自动释放总线,以方便其他设备获得总线的使用权。
典型应用 实例2:大部分单片机I/O使用时都可以设置为高阻输入,如凌阳,AVR等等。高阻输入可以认为输入电阻是无穷大的,认为I/O对前级影响极小,而且不产生电流(不衰减),而且在一定程度上也增加了芯片的抗电压冲击能力。
三态逻辑:在数字电路中,三态逻辑(英语:Three-state logic)允许输出端在0和1两种逻辑电平之外呈现高阻态,等效于将输出的影响从后级电路中移除。这允许多个电路共同使用同一个输出线(例如总线)。
三态输出在寄存器、总线以及7400系列、4000系列等各型号的逻辑IC发挥着重要的作用,并常常内置在其他各种集成电路。除此之外,三态逻辑的典型应用还包括微处理器、存储设备、外设的内部和外部总线。许多设备提供一个OE(Output Enable)用于在低电平时才令输出使能,而在不使能时保持高阻态。
二、单端口SRAM中的应用
d为inout端口,如果在输出的时候简单使用
assign d = (输出) ? reg_d : 0;//写逻辑时d作为数据输入,而输出逻辑将d置数;
还是
assign d = reg_d;//写逻辑时d作为数据输入,而输出逻辑将d与reg_d连接;
可见,输出部分电路设计势必对输入部分逻辑产生影响;
因此应利用三态逻辑中高阻态不占用总线这一逻辑,实现输入输出的交替逻辑,使得两者互不影响;实现代码如下
-
`timescale
1ns /
1ps
-
//
-
// Company:
-
// Engineer: guoliang CLL
-
//
-
// Create Date: 2020/02/23 12:06:07
-
//
-
-
-
module sram_sp_srsw
-
#(parameter
DW =
8,
AW =
4)
-
(
-
input [
AW
-1:
0]a,
//address
-
input clk,
-
input cs,
// chip select
-
input oe,
// output enable
-
input we,
// write enable
-
inout [
DW
-1:
0]d
// data
-
);
-
-
//
-
parameter
DP =
1 <<
AW;
// depth
-
reg [
DW
-1:
0]mem[
0:
DP
-1];
-
reg [
DW
-1:
0]reg_d;
-
//initialization
-
// synopsys_translate_off
-
integer i;
-
initial begin
-
for(i=
0; i <
DP; i = i +
1) begin
-
mem[i] =
8'h00;
-
end
-
end
-
// synopsys_translate_on
-
//
-
always@(posedge clk)
-
begin
-
if(cs & we)
//write declaration
-
begin
-
mem[a] <= d;
-
end
-
else
if(cs & !we & oe)
-
begin
-
reg_d <= mem[a];
-
end
-
else
-
begin
-
mem[a] <= mem[a];
-
reg_d <= reg_d;
-
end
-
end
-
//
-
assign d = (cs & !we & oe) ? reg_d : {
DW{
1'bz}};
-
endmodule
三、参考文献
</article>