我for
在Matlab中有一个循环,for循环中的所有代码都包含在一个if
语句中.例如 :
for p = 1:length(array)
if array(p) == 1 %// Test positive for condition
%// Generic code here that
%// Only executes if p == 1
end;
end;
Run Code Online (Sandbox Code Playgroud)
使用if
语句测试相等性是否更快,如果为true则执行内部代码,或者,测试不等式然后使用continue语句,例如:
for p = 1:length(array)
if array(p) ~= 1 %// Test negative for condition
continue; %// Skip if negative
end;
%// Generic code here that
%// Only executes if p == 1
end;
Run Code Online (Sandbox Code Playgroud)
或者,这两种方式都没有区别,即它在执行时优化到相同的结果?
由于其唯一的微观优化并不是非常重要 - 但我很想知道!
编辑:有趣的是,剖析推荐的代码之后,后者似乎是分数更快-是否有人会关心解释,将是巨大的!(毕竟,它充其量只是相同的逻辑,但需要执行额外的指令)
我正在尝试创建一个C++单例模式对象,使用引用而不是指针,其中构造函数采用2个参数
我已经看过的示例代码的整个主机,其中包括: 在C++单例模式, C++ Singleton设计模式和C++单例设计图案
我相信我理解所涉及的原则,但尽管试图几乎直接从示例中提取代码片段,但我无法将其编译.为什么不 - 以及如何使用带参数的构造函数创建此单例模式对象?
我已将收到的错误放在代码注释中.
另外,我在ARMmbed在线编译器中编译这个程序 - 可能/可能没有c ++ 11,我目前正试图找出哪个.
class Sensors
{
public:
static Sensors& Instance(PinName lPin, PinName rPin); //Singleton instance creator - needs parameters for constructor I assume
private:
Sensors(PinName lPin, PinName rPin); //Constructor with 2 object parameters
Sensors(Sensors const&) = delete; //"Expects ;" - possibly c++11 needed?
Sensors& operator= (Sensors const&) = delete; //"Expects ;"
};
Run Code Online (Sandbox Code Playgroud)
#include "Sensors.h"
/**
* Constructor for sensor object - takes two object …
Run Code Online (Sandbox Code Playgroud) 在过去,我问了一个关于复位的问题,以及如何将高时钟频率分解为一系列较低时钟的方波频率,其中每个输出是彼此的谐波,例如第一个输出是10 Hz,第二个是20 Hz等等
我收到了几个非常有用的答案,建议使用时钟使能引脚创建较低频率的惯例.
我发生了另一种选择; 使用不断递增的位数,并将该数字的最后x位作为时钟输出,其中x是输出的数量.
它在我的综合中起作用 - 但我很想知道 - 因为我从未在网上或在SO上提到它,我错过了一些意味着它实际上是一个糟糕的想法,我只是为了以后创造问题?
我知道对此的限制是我只能产生输入频率除以2的幂的频率,所以大部分时间它只能接近所需的输出频率(但仍然是正确的)订购).这种限制是不推荐的唯一原因吗?
非常感谢!
大卫
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
library UNISIM;
use UNISIM.VComponents.all;
use IEEE.math_real.all;
ENTITY CLK_DIVIDER IS
GENERIC(INPUT_FREQ : INTEGER; --Can only divide the input frequency by a power a of 2
OUT1_FREQ : INTEGER
);
PORT(SYSCLK : IN STD_LOGIC;
RESET_N : IN STD_LOGIC;
OUT1 : OUT STD_LOGIC; --Actual divider is 2^(ceiling[log2(input/freq)])
OUT2 : OUT STD_LOGIC); --Actual output is input over value above
END CLK_DIVIDER;
architecture …
Run Code Online (Sandbox Code Playgroud) 我正在创建一个 VHDL 项目(Xilinx ISE for Spartan-6),需要在定点/浮点中使用十进制“实型”数字(我希望定点就足够了)。
作为 VHDL 的新手,我发现非常困难的方法是real
综合不支持非常量类型,所以我开始寻找 IP 核或库来解决这个问题。
到目前为止,我找到了 3 个选项;
1) Xilinx 提供的浮点 IP 核
2) David Bishop 编写的可下载的“ieee_proposed”库在这里找到
3) 在尝试解决如何“创建”一个包含 David Bishops 文件的新库的过程中花费了大量时间后,我快速浏览了默认IEEE
库并看到它包含ieee.fixed_generic_pkg
和ieee.fixed_pkg
包。
我的问题是 - 在这两个库中 - 使用哪一个是明智的?一个适合合成而一个不适合,还是一个比另一个更老?然后如果提供了浮点,那么Xilinx提供的浮点IP核有没有真正的指向?
我已经浏览了许多试图添加库的人的问题ieee_proposed
,但似乎没有人提到它们似乎已经存在于现有的IEEE
.
非常感谢您的帮助!
============更新(基本上是我自己努力解决的)==================
我实际上无法使用ieee.fixed_pkg
- 并且尝试这样做会给我错误Cannot find <fixed_pkg> in library <ieee>
。
在 C:\Xilinx\14.7\ISE_DS\ISE\vhdl\xst\nt 找到 ieee 库后,我发现它fixed_pkg
实际上位于 ieee_proposed。但是,这仍然会引发相同的错误!
我用VHDL编写了一个程序(用于Xilinx Spartan-6),按下按钮时递增计数器,当按下另一个按钮时将其重置为零.
但是,我的进程会抛出WARNING:Xst:647 - Input is never used. This port will be preserved and left unconnected...
重置变量的错误- 尽管事实上它既用于进程的灵敏度又用作条件(同样多button
,但不会被标记!).
binary_proc : process(CLK_1Hz, button, reset) --include all inputs on sensitivity list
begin
if rising_edge(CLK_1Hz) and button = '1' then
binary <= binary + 1;
else if reset = '1' then
binary <= (others => '0');
end if;
end if;
end process;
Run Code Online (Sandbox Code Playgroud)
但更奇怪的是,我可以通过简单地使用两个if语句而不仅仅是if-else if语句来解决这个问题,如下所示;
binary_proc : process(CLK_1Hz, button, reset) --include all inputs on sensitivity list
begin
if rising_edge(CLK_1Hz) and button …
Run Code Online (Sandbox Code Playgroud) 我正在尝试处理输出到DVI芯片的像素数据.使用各种时钟频率是因为DVI芯片寄存器是使用I2C编程的(因此需要时钟<500 KHz) - 来自时钟分频器.
DVI芯片需要一个40 MHz的差分像素时钟,然而,DVI每半个显示半个字节,因此每半个周期需要另外80 MHz的时钟将每一半像素推到数据线上,这些都是来自DCM.
这导致了各种各样的问题.我试图只使用双像素时钟速率交换像素的每一半,但是我得到了错误:
This design contains a global buffer instance, <out2_bufg>,
driving the net, <pxlclk_p_int>, that is driving the following (first 30)
non-clock load pins.
所以我在DCM的输出和使用信号的组件之间添加了一个BUFG元素 - 但它没有改变任何东西,而是现在在BUFG的输入和输出上抛出两次错误.
我的代码如下; 我试图删除与时钟无关的不相关的东西,但它仍然很长!
编辑1:我添加了块,当添加到系统时,导致错误(之前没有)它在第二个代码块中!我目前正在研究差分信号的其他建议,并在完成后再次编辑!
非常感谢,
大卫
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
library UNISIM;
use UNISIM.VComponents.all;
ENTITY I2CBus IS
PORT(
SYSCLK_N : IN STD_LOGIC; --system 200MHz differential clock
SYSCLK_P : IN STD_LOGIC;
BTN : IN STD_LOGIC; -- to manually change reset
LED : OUT STD_LOGIC_VECTOR(3 …
Run Code Online (Sandbox Code Playgroud) 所以我有两个单独的Python包,我将其导入到我的Raspberry Pi的Python脚本中.在这种情况下;
from rflib import*
from Rpi.GPIO import*
Run Code Online (Sandbox Code Playgroud)
但是,两个包都有自己独立的方法 cleanup(self)
因此,在脚本结束时,当我使用命令时,我
cleanup()
如何a)知道方法来自哪个包(它们都完全不同的东西b)控制哪个包运行?
我查看了类似命名的问题,但它们似乎处理继承重载而不是包导入
我刚开始使用各种不同的模块创建 FPGA 系统来驱动 I2C 总线(尽管我认为这个问题适用于任何 FPGA 系统),并且所有模块都使用同步复位。
这些模块使用时钟分频器模块进行计时,该模块获取系统时钟并向系统的其余部分输出较低的频率。
我遇到的问题是,当复位信号变低时,时钟分频器复位,因此其他模块依赖的时钟停止 - 因此其他模块不会注册复位
一个明显的解决方案是进行异步复位,但是,在 Xilinx ISE 中,它似乎不喜欢它们,并抛出警告,指出这与 Spartan-6 FPGA 不兼容(特别是当异步代码之后的代码是同步代码时) ,这是因为 I2C 总线使用总线时钟将位放入总线上)。
另一种解决方案是时钟分频器根本不可重置,因此时钟永远不会停止并且所有模块都会正确重置。然而,这意味着时钟分频器寄存器无法初始化/重新初始化为已知状态 - 有人告诉我这将是一个大问题,尽管我知道您可以 := '0'/'1';
在模拟中使用该运算符,但这一旦编程就不起作用实际的 FPGA(?)。
同步复位的约定是什么?时钟发生器一般不复位吗?或者它们仅在复位信号的瞬时边沿复位?或者我的建议都不是真正的解决方案!
我放入了时序图和代码来说明我的意思,并显示我一直在使用的代码。
非常感谢!
大卫
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
library UNISIM;
use UNISIM.VComponents.all;
ENTITY CLK_DIVIDER IS
GENERIC(INPUT_FREQ : INTEGER;
OUT1_FREQ : INTEGER;
OUT2_FREQ : INTEGER
);
PORT(SYSCLK : IN STD_LOGIC;
RESET_N : IN STD_LOGIC;
OUT1 : OUT STD_LOGIC;
OUT2 : OUT STD_LOGIC);
END CLK_DIVIDER;
architecture Behavioral of Clk_Divider is
constant divider1 …
Run Code Online (Sandbox Code Playgroud) vhdl ×5
clock ×3
if-statement ×2
spartan ×2
synthesis ×2
xilinx ×2
xilinx-ise ×2
asynchronous ×1
buffer ×1
c++ ×1
conventions ×1
fixed-point ×1
for-loop ×1
ieee ×1
ieee-754 ×1
input ×1
matlab ×1
performance ×1
python ×1
reference ×1
reset ×1
singleton ×1