- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试一些代码,这些代码本质上涉及使用 FPGA 并从温度传感器读取值。
代码如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity ds18b20 is
Port ( clk : in STD_LOGIC; --50Mhz oscillator onboard
dq : inout STD_LOGIC;
temp_h : out STD_LOGIC_VECTOR (7 downto 0);
temp_l : out STD_LOGIC_VECTOR (7 downto 0);
temperature : out STD_LOGIC_VECTOR (11 downto 0));
end ds18b20;
architecture Behavioral of ds18b20 is
--RESET : RESET AND PRESENCE PULSE
--CMD_CC : SKIP ROM [CCh]
--WRITE_BYTE : WRITE SCRATCHPAD COMMAND
--WRITE_LOW
--WRITE_HIGH
--READ_BIT :
TYPE STATE_TYPE is (RESET,CMD_CC,WRITE_BYTE,WRITE_LOW,WRITE_HIGH,READ_BIT,CMD_44,WAIT800MS,CMD_BE,GET_TMP,WAIT4MS);
signal STATE: STATE_TYPE:=RESET;
signal clk_temp : std_logic:='0';
signal clk1m : std_logic;
signal write_temp : std_logic_vector(7 downto 0) := (others => '0');
signal TMP : std_logic_vector(11 downto 0);
signal tmp_bit : std_logic;
signal WRITE_BYTE_CNT : integer range 0 to 8:=0;
signal WRITE_LOW_CNT : integer range 0 to 2:=0;
signal WRITE_HIGH_CNT : integer range 0 to 2:=0;
signal READ_BIT_CNT : integer range 0 to 3:=0;
signal GET_TMP_CNT : integer range 0 to 12:=0;
signal cnt : integer range 0 to 100001:=0;
signal count : integer range 0 to 25:=0;
signal WRITE_BYTE_FLAG : integer range 0 to 4:=0;
begin
ClkDivider: process (clk)
begin
if rising_edge(clk) then
if (count = 24) then
count <= 0;
clk_temp<= not clk_temp;
else
count <= count +1;
end if;
end if;
clk1m<=clk_temp;
end Process;
STATE_TRANSITION: process(STATE,clk)
begin
if rising_edge(clk) then
case STATE is
--Master issues RESET pulse
when RESET=>
if (cnt>=0 and cnt<500) then
dq<='0';
cnt<=cnt+1;
STATE<=RESET;
--Master waits for PRESENCE pulse
elsif (cnt>=500 and cnt<1000) then
dq<='Z';
cnt<=cnt+1;
STATE<=RESET;
elsif (cnt>=1000) then
cnt<=0;
STATE<=CMD_CC; -- SKIP ROM COMMAND STATE
end if;
when CMD_CC=> -- SKIP ROM COMMAND
write_temp<="11001100"; -- SKIP ROM BINARY COMMAND
STATE<=WRITE_BYTE; -- modified here
--Master issues write scratchpad command
when WRITE_BYTE=>
case WRITE_BYTE_CNT is
when 0 to 7=>
if (write_temp(WRITE_BYTE_CNT)='0') then
STATE<=WRITE_LOW;
else
STATE<=WRITE_HIGH;
end if;
WRITE_BYTE_CNT<=WRITE_BYTE_CNT+1;
when 8=>
if (WRITE_BYTE_FLAG=0) then -- ????0XCC??
STATE<=CMD_44; --CONVERT TEMPERATURE
WRITE_BYTE_FLAG<=1;
elsif (WRITE_BYTE_FLAG=1) then --?0X44??
STATE<=RESET;
WRITE_BYTE_FLAG<=2;
elsif (WRITE_BYTE_FLAG=2) then --????0XCC??
STATE<=CMD_BE; -- READ SCRATCHPAD
WRITE_BYTE_FLAG<=3;
elsif (WRITE_BYTE_FLAG=3) then --?0XBE??
STATE<=GET_TMP;
WRITE_BYTE_FLAG<=0;
end if;
WRITE_BYTE_CNT<=0;
end case;
when WRITE_LOW=>
case WRITE_LOW_CNT is
when 0=>
dq<='0';
if (cnt=78) then
cnt<=0;
WRITE_LOW_CNT<=1;
else
cnt<=cnt+1;
end if;
when 1=>
dq<='Z';
if (cnt=2) then
cnt<=0;
WRITE_LOW_CNT<=2;
else
cnt<=cnt+1;
end if;
when 2=>
STATE<=WRITE_BYTE;
WRITE_LOW_CNT<=0;
when others=>WRITE_LOW_CNT<=0;
end case;
when WRITE_HIGH=>
case WRITE_HIGH_CNT is
when 0=>
dq<='0';
if (cnt=8) then
cnt<=0;
WRITE_HIGH_CNT<=1;
else
cnt<=cnt+1;
end if;
when 1=>
dq<='Z';
if (cnt=72) then
cnt<=0;
WRITE_HIGH_CNT<=2;
else
cnt<=cnt+1;
end if;
when 2=>
STATE<=WRITE_BYTE;
WRITE_HIGH_CNT<=0;
when others=>WRITE_HIGH_CNT<=0;
end case;
when READ_BIT=>
case READ_BIT_CNT is
when 0=>
dq<='0';
if (cnt=4) then
READ_BIT_CNT<=1;
cnt<=0;
else
cnt<=cnt+1;
end if;
when 1=>
dq<='Z';
if (cnt=4) then
READ_BIT_CNT<=2;
cnt<=0;
else
cnt<=cnt+1;
end if;
when 2=>
TMP_BIT<=dq;
if (cnt=1) then
READ_BIT_CNT<=3;
cnt<=0;
else
cnt<=cnt+1;
end if;
when 3=>
if (cnt=45) then
cnt<=0;
READ_BIT_CNT<=0;
STATE<=GET_TMP;
else
cnt<=cnt+1;
end if;
when others=>READ_BIT_CNT<=0;
end case;
when CMD_44=> -- CONVERT TEMPERATURE
write_temp<="01000100"; -- CONVERT TEMPERATURE BINARY COMMAND
STATE<=WRITE_BYTE;
when WAIT800MS=>
if (cnt>=100000) then
STATE<=RESET;
cnt<=0;
else
cnt<=cnt+1;
STATE<=WAIT800MS;
end if;
when CMD_BE=> -- READ SCRATCHPAD
write_temp<="10111110"; -- READ SCRATHPAD BINARY COMMAND
STATE<=WRITE_BYTE;
when GET_TMP=>
case GET_TMP_CNT is
when 0 to 11=>
STATE<=READ_BIT;
TMP(GET_TMP_CNT)<=TMP_BIT;
GET_TMP_CNT<=GET_TMP_CNT+1;
when 12=>
GET_TMP_CNT<=0;
STATE<=WAIT4MS;
end case;
when WAIT4MS=>
if (cnt>=4000) then
STATE<=RESET;
cnt<=0;
else
cnt<=cnt+1;
STATE<=WAIT4MS;
end if;
when others=>STATE<=RESET;
end case;
end if;
end process;
temp_h<='0'&TMP(11 downto 5);
temp_l<="0000"&TMP(4 downto 1);
temperature <= TMP;
end Behavioral;
我收到的警告是
WARNING:Xst:1293 - FF/Latch <write_temp_0> has a constant value of 0 in block <ds18b20>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <Mtridata_dq> (without init value) has a constant value of 0 in block <ds18b20>. This FF/Latch will be trimmed during the optimization process.
write_temp 是一个保存传感器二进制命令的变量。因此本质上,我将通过“dq”双向端口将这些命令发送到传感器。现在,警告指出 write_temp 始终为 0,这意味着我根本无法指示传感器执行任何操作,因为它始终为 0。
有人可以告诉我如何克服这个问题吗?非常感谢。
最佳答案
这里没有任何问题。该警告表示 write_temp_0
始终为 0 - 也就是说,该警告仅适用于 write_temp
的第 0 位,而不适用于其他 7 位。
这是可以预料到的,因为你永远不会将 write_temp
的位 0 设置为 0 以外的任何值。合成器会识别这一点,并通过简单地将其修剪为常量 0 来对其进行优化与逻辑相连。
所以尝试一下代码,看看它是否有效 - 如果不起作用,则可能是由于其他原因。
此外,在编写和验证这样的代码时,模拟器是一个很棒的工具 - 它可以让您非常轻松地找到代码中的逻辑错误。所以没有理由不去了解如何使用它。
关于warnings - VHDL综合警告FF/Latch的常量值为0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12171815/
一 点睛 若干个线程并发执行某个特定的任务,然后等到所有的子任务都执行结束后在统一汇总,比如用户想要查询自己三年以来银行账户的流水,为了保证运行的数据库的数据量在一个恒定的范围之内,通常数据只会保存一
一 点睛 若干个线程并发执行某个特定的任务,然后等到所有的子任务都执行结束后在统一汇总,比如用户想要查询自己三年以来银行账户的流水,为了保证运行的数据库的数据量在一个恒定的范围之内,通常数据只会保存一
一 点睛 对 Latch 设计模式增加超时功能 二 实战 1 Latch package concurrent.latch; import java.util.concurrent.TimeUnit
我有以下代码对应于 Excel 中的 VBA 程序中的三个 ToggleButtons。单击一个按钮时,应该保持“按下”状态,而其他两个按钮应该“释放”。但是,使用我拥有的代码,我必须单击一个按钮两次
我试图在我的程序中使用 boost::latch 来阻止等待,直到所有线程完成或超时。我的代码如下。 ctpl是从https://github.com/vit-vit/CTPL采用的线程池库. #in
当我为一个 api 运行 import.io 示例时,比如官方 api 文档,我得到了这个错误。 此外,我输入'''pip install latch'''没有名为 latch in pips 的模块
提议包含在 C++14(又名 C++1y)中的是一些新的线程同步原语:锁存器和屏障。提案是 N3600: C++ Latches and Barriers N3666: C++ Latches and
我最初有以下代码: Boolean successCheckPoint = false; Boolean failureCheckPoint = false;
我想要实现的是暂停线程并等到 doSomeProcess() 被调用后再继续。但是由于一些奇怪的原因,整个过程卡在了 await 中,永远不会进入 Runnable.run。 代码片段: final
这个问题与我在 Java 并发主题中的作业有关。我的任务是生成新线程并通过给定的 concurrencyFactor 限制它们。也就是说,继续分派(dispatch)新线程,直到 Activity 线
我最近听说了新的 C++ 标准特性,它们是: std::latch std::barrier 我无法弄清楚,在哪些情况下它们是适用的并且彼此有用。 如果有人能举出一个例子来说明如何明智地使用它们中的每
我想通过 RxJS 制作 SR 锁存器。它应该采用 2 个流(#1 和 #2)并且仅当 #1 发出某些东西时才发出。 然后它应该忽略 #1 并听取 #2 直到它发出一些东西。然后它应该“重置”(编辑:
我正在阅读 java.util.concurrent API , 并发现 CountDownLatch:一种同步辅助工具,允许一个或多个线程等待,直到其他线程中正在执行的一组操作完成。 CyclicB
从文档中可以很清楚地看出它们之间的区别在于 std::barrier可以多次使用 std::latch只能使用一次。 在我看来,std::latch 只是 std::barrier 的一个特例,它添加
我听说锁存器和触发器之间的主要区别在于锁存器是异步的,而触发器是边沿触发的,这是有道理的。但是当我查看他们的shematic时,它们看起来几乎一样。 这是我能理解的一本书中的锁扣设计。 但这是我在各种
我已经阅读了数据表和谷歌,但我仍然不明白。 就我而言,我将 PIC18F26K20 的 PIN RC6 设置为 INPUT 模式: TRISCbits.TRISC6 = 1; 然后我用 PORT 和
我看到一个 stackoverflow 成员建议使用 Thread.join() 让一个“主”线程等待 2 个“任务”线程完成。 我会经常做一些不同的事情(如下所示),我想知道我的方法是否有任何问题。
在什么情况下我们应该使用“Latch until release”而不是“Switch until release”? 根据 LabVIEW 2011 Help : Latch until relea
因为我是 VHDL 的初学者,所以互联网上的所有答案都不适合我。 我正在使用按钮和 LED 在 vhdl 中制作密码界面。我的程序按预期正确模拟。 基本上,我希望 LED 在输入错误密码时闪烁,但在输
Time-out occurred while waiting for buffer latch type 2 for page (1:1535865), database ID 6. 这是我在尝试创
我是一名优秀的程序员,十分优秀!