我尝试使用带有NAND门的 SR锁存器编程我的 NEXYS2 电路板并启用信号C.我的输入是(S,R,C)和输出是(Q,Qbar)。下面是我试过的VHDL中的一些代码,但不断出现错误。如果这有助于任何人理解我的问题,下面的原理图也是如此。如果你在verilog中知道它也可以。 提前谢谢
process(S,R,C,Q,Qbar)
begin
if (C = '1') then
Q <= (R nand Qbar);
Qbar <= (S nand Q);
end if;
end process;
答案 0 :(得分:2)
首先,您的原理图实现不正确:R应该是 ~S,S应该是~R。尝试用S或R等于1来跟踪逻辑 当C为1时 - 输出应设置为高。
更正了Verilog(我这里只有Altera&amp; Verilog):
module top(
input wire S, R, C,
output reg Q, Qbar);
always @(S, R, C, Q, Qbar)
if(C) begin
Q <= (~R & Q) | S;
Qbar <= (~S & Q) | R;
end
endmodule
这在Altera上合成了Ok,并且有两条警告
Warning (10240): Verilog HDL Always Construct warning at test.v(5): inferring latch(es) for variable "Q", which holds its previous value in one or more paths through the always construct
并且时间分析仪发出警告,它分析了两个组合 循环作为锁存器。技术观点看似合理,但你有一个 这种编码风格的问题,可能导致问题。
问题是你明确地编写了唯一的反馈路径,但你也是
离开合成器推断闩锁。您的代码包含if(C = '1')
,所以
合成器推断内存行为 - 一个锁存器 - 当C不是1.但是,这个
没有意义,因为你也明确地告诉它闩锁所在的位置
你的反馈路径。不要两者都做;假设任何一个是错误的
合成器足够聪明,可以弄清楚你的意思。这是一个
毫无疑问你想要的版本:
module top(
input wire S, R, C,
output wire Q, Qbar);
wire S2 = ~(C & S);
wire R2 = ~(C & R);
assign Q = ~(S2 & Qbar);
assign Qbar = ~(R2 & Q);
endmodule
这反过来给出两个'找到2个节点的组合循环'警告,如 你期待的。这也合成了Ok,RTL /技术视图看起来很好, 乍一看。
标准免责声明:计时分析师不擅长计时设计 组合循环。如果你只是在玩,这可能都会奏效 周围,但如果这是一个真正的设计,你需要认真思考你的 约束,以及分析仪是否实际跟踪过你的 反馈路径(可能没有)。你需要用sdf进行计时模拟 反向注释以确认它确实有效。
答案 1 :(得分:0)
您的原理图是正确的。
问题出在您的VHDL代码中,因为您没有完全指定电路的功能(请注意,未定义c ='0'的输出值),这会导致锁存器的推断(仅注册电路可以是设计的规格不完整,因为无论如何,产生的信号都存储在D型触发器中。
您可以执行以下操作(以及其他替代方法):
entity sr_latch is
port (
s, r, c: in bit;
q, qbar: buffer bit);
end entity;
architecture sr_latch of sr_latch is
begin
q <= (s nand c) nand qbar;
qbar <= (r nand c) nand q;
end architecture