- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 webPack ISE v 13 使用以下代码对 Nexys 3 板进行编程,并通过在 if elsif 语句中交换语句来注意到完全不同的行为。本质上,我在板上使用了三个按钮:当按下第一个按钮 btn(0) 时,8 个开关的状态存储在一个寄存器中。当我按下 btn(1) 时,开关的状态应显示在 8 个 LED 中,并且 LED 应保持此状态。当我按下 btn(2) 时,我强制点亮所有 LED,如果没有按下 btn 1 或 2,它们应该保持这种状态。通过交换按钮 1 和 2 的 if 和 elsif 下的操作,行为会发生变化:仅当我按下相应的按钮时才会显示开关的状态,一旦松开,所有 LED 都会亮起。
不仅仅是寻找“这是你需要让它工作的东西”,我还在解释为什么 vhdl 的行为与 C++ 如此不同,比如说(在这种情况下,顺序无关紧要)
以下是代码摘录;我指出要评论/取消评论哪些行以获得行为“a”或行为“b”。
行为“一”:
process(clk)
begin
if (clk'event and clk='1') then
if (db_btn(0)='1') then --load sw state into data_reg
data_reg <= sw;
end if;end if; end process;
process(btn,data_reg)
begin
if btn(1)='1' then
data_s2f <= "1111111111111111"; --behvr a; comment this line for behvr b
-- data_s2f <= "00000000" & data_reg; -- uncomment for behvr b; comment for behvr a
elsif btn(2)='1' then -- read
data_s2f <= "00000000" & data_reg; --behvr a; comment this line for behvr b
--data_s2f <= "1111111111111111"; -- uncomment for behvr b; comment for behvr a
end if;
end process;
-- output
led <= data_s2f(7 downto 0); --display data_s2f in LEDs
仿真试验台
这是我的模拟测试台。每当我执行所有信号的结果都是 UUU..UU 任何评论将不胜感激:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;
ENTITY ifstmt_tb IS
END ifstmt_tb;
ARCHITECTURE behavior OF ifstmt_tb IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT ram_ctrl_test
PORT(
clk : IN std_logic;
reset : IN std_logic;
sw : IN std_logic_vector(7 downto 0);
btn : IN std_logic_vector(2 downto 0);
led : OUT std_logic_vector(7 downto 0)
);
END COMPONENT;
--Inputs
signal clk : std_logic := '0';
signal reset : std_logic := '0';
signal sw : std_logic_vector(7 downto 0) := (others => '0');
signal btn : std_logic_vector(2 downto 0) := (others => '0');
--Outputs
signal led : std_logic_vector(7 downto 0);
-- Clock period definitions
constant clk_period : time := 10 ns;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: ram_ctrl_test PORT MAP (
clk => clk,
reset => reset,
sw => sw,
btn => btn,
led => led
);
-- Clock process definitions
clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;
-- Stimulus process
stim_proc: process
begin
-- hold reset state for 100 ns.
reset <= '1';
sw <= "11001100";
btn<= (others => '0');
wait for 100 ns;
reset <= '0';
wait for clk_period*10;
-- load register
btn<= (0=>'1', others => '0');
wait for clk_period*2;
btn<= (others => '0');
wait for clk_period*10;
-- display with btn 1
btn<= (1=>'1', others => '0');
wait for clk_period*5;
btn<= (others => '0');
wait for clk_period*10;
-- display with btn 2
btn<= (2=>'1', others => '0');
wait for clk_period*5;
btn<= (others => '0');
wait for clk_period*10;
-- change pattern
sw <= "11100111";
wait for clk_period;
-- load register
btn<= (0=>'1', others => '0');
wait for clk_period*2;
btn<= (others => '0');
wait for clk_period*10;
-- display with btn 2
btn<= (2=>'1', others => '0');
wait for clk_period*5;
btn<= (others => '0');
wait for clk_period*10;
-- display with btn 1
btn<= (1=>'1', others => '0');
wait for clk_period*5;
btn<= (others => '0');
-- insert stimulus here
wait;
end process;
END;
最佳答案
VHDL 使用级联顺序执行 if 语句,从而可以驱动各种条件语句的输出。所有的条件都是完全计算的(让我们忽略这一点的传播延迟)。硬件“选择”第一个满足您条件的语句(后续 if elsif 分支的输出驱动较低语句的启用,因此如果一个评估为假,则启用下一个)。
我认为您看到的行为确实看起来“奇怪”,但实际上您期望什么。如果您不提供默认值,您将获得基于硬件的意外结果。您需要进行黑白编程。现在你正在编程灰色。对于程序员的意图,VHDL 的宽容度要低得多。你必须始终是明确的和明确的。
一个可能的答案是,这不是编写此 if 语句的最佳方式。一种更好的方法是创建一个指示“确定”按钮按下的“滴答”信号,该信号驱动一个单独的顺序锁存过程,记录按下的选项。我想您看到的行为取决于硬件,因此难以解释。
这里没有提到的另一点是你应该实现一个开关去抖动器。实际上,当按住并以您不期望的方式操作时,开关可能会切换很多(将其连接到示波器并将其置于边缘模式,您会看到)。您应该在按下开关时计算一段时间(例如 1 毫秒),并且仅在该时间段后打开。关机也是一样。这可能会更好地缓冲您可能拥有的任何弹性。这就是你如何让你的“确定”按钮按下“勾号”
关于vhdl - if elsif vhdl 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11019481/
我有某种 elsif 语句错误,我找不到: 我的 JSfiddle: http://jsfiddle.net/z3xV3/64/ Jquery: $('#slider1, #slider2, #sli
我基本上会在下面的 elsif 中说“if letter == (a letter contained within the array "letterbank") ===> print letter
如果表达式为空,你能解释一下在“elsif”中什么表达式使用 ruby 吗? arg = 3 if (arg == 1) puts "1" elsif (arg == 2) puts "2
我想使用三元语法编写 if...elsif 语句。我可以在此语句中再添加一次对 ARGV[1] 的检查吗? test-expression ? if-true-expression : if-fals
我一直在为使用 lex 和 yacc 的命令式语言开发一个编译器,今天我完成了语法,问题是我在网上读到每个语法都应该有一些转变/减少冲突,特别是如果它有 if/else 语句,这通常被称为悬空 if-
我有一个非常基本的XML,想编写一个Xpath查询来获取值。 这是XML: STD 1234 BA 1
我正在使用 webPack ISE v 13 使用以下代码对 Nexys 3 板进行编程,并通过在 if elsif 语句中交换语句来注意到完全不同的行为。本质上,我在板上使用了三个按钮:当按下第一个
我尝试用 Ruby 编写 snakes 程序。为了让自己更加熟悉Ruby。我通过将蛇的 X 和 Y 值保存在两个一维数组中来定义蛇的每个部分的位置,一个用于 X 值,一个用于 Y 值。 $x = [
在我的代码中,elsif 不起作用。如果我键入 "N" 或 "n",它会要求我输入密码而不是 puts,它应该这样做: puts "Would you like to access Your Soft
我有一个返回 nil 或非 nil 值的函数,我在下面的 if- 中使用它>else 子句: if condition_that_doesnt_involve_my_func # do stuff
我有以下代码: var_comparison = 5 print "Please enter a number: " my_num = Integer(gets.chomp) if my_num >
我在这里遇到一个简单的 if else 链错误,我无法弄清楚发生了什么。前几天我开始学习 ruby,我已经了解一些 java,只是想重新编写程序以更快地学习 ruby。我正在尝试计算元音和辅音
case/when 语句让我想起 Python 中的 try/catch 语句,它们相当昂贵操作。这与 Ruby 的 case/when 语句相似吗?除了可能更简洁之外,与 if/elsif Ruby
我的 HAML 代码中需要这种构造: - if something1 %div.a - elsif something2 %div.b - elsif something3 %div.c
使用 ruby 三元运算符,我们可以为简单的 if else 构造编写以下逻辑: a = true ? 'a' : 'b' #=> "a" 但是如果我想把它写成 if foo 'a' elsif
关于我需要在这个 Perl 代码中改变什么的任何想法? perl -wc 产生: elseif should be elsif at cgitelnet-mod.pl line 410. syntax
为什么这里带有 sub 的 eins else 比带有 sub 的 zwei elsif 慢? #!/usr/bin/env perl use warnings; use 5.012; use Ben
我正在用仙人掌图片制作一个游戏,但是当我执行代码时,如果它尝试在图片之间切换,它将停止并卡住在该点上,否则如果它不起作用,我也会对图片使用 bufferedimage我的代码: package
谁能帮忙解释一下以下代码的语法有什么问题: CREATE OR REPLACE FUNCTION linearly_decrement_offset(location_in text) RETURNS
在 ruby 中,伪代码之间有什么区别吗: if n > 2: do something to A end if n > 4: do something to B end if n >
我是一名优秀的程序员,十分优秀!