*我正在Xilinx14.3中编写VHDL,并针对Nexys 2板。*。
据我所读,锁存来自于不完整的if/case语句,或者当输出没有在所有可能的路径上设置时。
我已经多次检查我的代码,并且仍然得到两个闩锁。
WARNING:Xst:737 - Found 8-bit latch for signal <DR>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they ma
library ieee;
use ieee.std_logic_1164.all;
entity ccou is
port(clk2 : in bit;
qc: out bit_vector(3 downto 0);
qnc: out bit_vector(3 downto 0));
end entity;
architecture a_ccou of ccou is
component dfff
port(d,clk1:in bit;
qd,qnd:out bit);
end component;
signal tqc
我试图用一个带有启用信号的NAND门的NEXYS2板来编程SR锁存。我的输入是(S、R、C)和输出 are <code>E 110</code>(q,Qbar)。下面是我尝试过的一些VHDL代码,但是一直有错误。另外,如果这能帮助任何人理解我的问题的话,图表就在下面。如果你在verilog知道的话,那也没关系。提前谢谢你
process(S,R,C,Q,Qbar)
begin
if (C = '1') then
Q <= (R nand Qbar);
Qbar <= (S nand Q);
en
有时我在Xilinx中收到警告:
锁存可以从不完整的大小写或if语句中生成。我们不建议在FPGA/CPLD设计中使用锁存器,因为它们可能导致计时问题。
但是,如果我使用rising_edge()函数,那么即使我有一个不完整的情况,也没有任何警告,例如:
process (clk, rst)
begin
if (rst = '1') then
test <= '0';
elsif (rising_edge(clk)) then
test <= '1';
end if;
我已经用VHDL写了一个简单的RS锁存器,并试图用ISE来综合它。合成器增加了一个D触发器,其中D输入接地,我的(S)et和(R)eset输入被视为预置和清除输入。我以为只会看到NAND门。为什么在不需要触发器的情况下添加触发器?另外,为什么D输入连接到地?
entity rs is
Port ( r : in STD_LOGIC;
s : in STD_LOGIC;
q : inout STD_LOGIC);
end rs;
architecture Behavioral of rs is
begin
process( r, s )
begin
帮助我理解表变量和临时表之间的闩锁区别。示例:
SET NOCOUNT ON
DECLARE @t TABLE (id int NOT NULL IDENTITY(1,1) PRIMARY KEY, ss varchar(50))
INSERT INTO @t (ss)
VALUES ('TestTest'), ('TestTest')
declare @n int = 0
WHILE @n < 100000
BEGIN
SET @n += 1
UPDATE @t
SET ss = REVERSE(ss)
END
如果我正确理解闩锁,它是在组合块中创建的,在组合块中,当将变量赋值时并不会声明所有可能的条件。我怎么把锁锁在我的顺序块里?
当我通过Quartus编译我的代码时,它实现了2FMAX,这表明我有一个锁存器。
always@(posedge clk or negedge nreset) begin
case(counter)
0: begin
if(state == IDLE) begin
// DOES SOMETHING
end
end
1:
我对语句always_ff和always_latch的用法感到困惑。前者将被用作:
always_ff @ (posedge clk)
begin
a <= b;
end
而后者:
always_latch
begin
a <= b;
end
第一个被时钟的正边缘激活,再加上非阻塞分配,产生一个FF。
显然,always_latch被认为是一个锁存器,但是为什么要使用非阻塞分配呢?
使用带有阻塞分配的always_comb不是更好吗?
有人能给我解释一下为什么要推断锁锁而不是触发器吗?
always_ff @ (posedge clk, negedge rst)
begin
if (!rst)
a <= '0;
end
不应该总是块对信号边缘敏感这一事实不足以推断触发器。在这种情况下,当重置的负边缘被触发为gets 0时,它将保留以前的值。
此问题来自于从堆栈溢出问题中选择的最佳答案:
===========================================================================
我将在这里分享我到目前为止发现的情况。之所以合成锁存,而不是
RTL视图中的逻辑门以前是一个锁存器。正如答案所示,我为每个输入都分配了输出。闩锁就变成了逻辑门。我不知道这是否是解决问题的正确方法。还有一个加法器连接到计数器上。我想消除加法器和逻辑门。(?我应该修改什么?
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use IEEE.std_logic_unsigned.all;
entity mux8x1 is port( input: in std_logic_vector( 7 downto 0); clk: in std_logic;
谁能解释一下为什么我的计数有一个刻度的延迟,而我的总和有两个刻度的延迟?我是一个初学者,所以这对一些人来说可能是微不足道的,但我真的不明白问题所在。这模拟了单个类型的硬币存储实体在自动食品分配器的情况下应该如何表现。最初,我认为与计数相比,总和的1个节拍延迟可能是由于2个不同的时钟进程中的2个信号,但似乎不是这样。考虑到这里需要一个顺序代码,我不知道如何至少为每个信号减少1个滴答的总延迟。如果两者都没有延迟,那将是最理想的。感谢您查看此问题。
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use
我的VHDL代码怎么了?以下是代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity main is
port(
-- 50 MHz clock
cp : in std_logic;
-- Reset signal
reset : in std_logic;
-- PS/2 data and clock lines
我正在PIC18F4550上编写一个程序,其中我在内存中定义了数据,并希望将其逐字符发送到PORTA。我已经这样做了,但在LATA上显示的值并不是PORTA寄存器中显示的值。我搜索了数据表,它声明写入端口将写入其闩锁,但是,我遇到了端口和闩锁寄存器在写入时都具有相同值的情况。只是港口和拉特不应该一样,还是我做错了什么?我正在使用MPLABXV5.30上的模拟器工具
LIST p=18f4550
INCLUDE <p18f4550.inc>
我有一个定义为be和INOUT信号的端口信号。我将端口设置为D锁存器的输出,在异常情况下输出未定义。当我没有通过另一个模块运行D锁存器的输出时,一切工作正常。然而,我需要从d锁存器获取输出信号,并将其用作不同模块的输入。完成此操作后,D锁存器的输出始终为未定义。下面是我的代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use
我有一个FSM,它能工作。然而,合成器抱怨说"acc_x“、"acc_y”和"data_out“都有锁存器,我理解为什么和为什么不好。然而,我不知道如何重写FSM,以便状态部分进入时钟进程。有什么想法从哪里开始?以下是密克罗尼西亚联邦的代码:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity storage is
port
(
clk_in : in std_logic;
我正在编写一个N位的非恢复除法器,但我遇到了一个小问题。
我有一个运算部分(组合)和一个控制部分(有限状态机)。控制部分有两个进程FSM,一个用于更新下一个状态,一个用于“状态序列”。
update: process(clk_in, next_state)
begin
if rising_edge(clk_in) then
current_state <= next_state;
end if;
end process;
这是第二个过程:
control: pro
我有以下代码片段:
SIGNAL ALU_hilo : STD_LOGIC_VECTOR(63 downto 0);
PROCESS ( ALU_ctl, Ainput, Binput )
BEGIN
-- Select ALU operation
CASE ALU_ctl IS
-- ALU performs ALUresult = A_input AND B_input
WHEN "0000" => ALU_Internal <= Ainput AND Binput;
-- ALU pe
我正在学习Java中的同步。我无法理解CountDownLatch的确切机制。
CountDownLatch‘按照声明时给出的线程数来计算锁存器(等待完成线程数)吗?
下面是我试图理解的代码:
public class LatchExample implements Runnable {
private CountDownLatch latch;
private int id;
public LatchExample(int id, CountDownLatch latch){
this.id=id;
this.latch = lat