这里发生了什么?为什么我得到'运算符参数类型不匹配',我该怎么做才能修复它?
--
-- 32-bit counter with enable and async reset
--
architecture synthesis1 of counter_32bit is
signal nextvalue : std_logic_vector ( 31 downto 0 );
begin
--
-- combo
--
nextvalue <= value + 1; -- here
--
-- sequential
--
ff:process( clk, rst )
begin
if( rst = '1' ) then
value <= 0; -- and here...
elsif( clk'event and ( clk ='1' ) ) then
if( ena = '1' ) then
value <= nextvalue;
end if;
end if; …
Run Code Online (Sandbox Code Playgroud) 我最近一直试图实现模块化指数器.我正在用VHDL编写代码,但我正在寻找更具算法性质的建议.模幂运算器的主要组件是模块化乘法器,我也必须自己实现.我对乘法算法没有任何问题 - 它只是添加和移位而且我已经很好地弄清楚了所有变量的含义,以便我可以在相当合理的时间内繁殖.
我遇到的问题是在乘法器中实现模数运算.我知道重复减法会有效,但也会很慢.我发现我可以改变模数以有效地减去模数的大倍数,但我认为可能还有更好的方法来做到这一点.我正在使用的算法是这样的(奇怪的伪代码如下):
result,modulus : integer (n bits) (previously defined)
shiftcount : integer (initialized to zero)
while( (modulus<result) and (modulus(n-1) != 1) ){
modulus = modulus << 1
shiftcount++
}
for(i=shiftcount;i>=0;i--){
if(modulus<result){result = result-modulus}
if(i!=0){modulus = modulus >> 1}
}
Run Code Online (Sandbox Code Playgroud)
所以...这是一个很好的算法,或者至少是一个好的开始?维基百科并没有真正讨论用于实现模运算的算法,每当我尝试在其他地方搜索时,我发现它真的很有趣,但却非常复杂(通常是无关的)研究论文和出版物.如果有一种明显的方法可以实现这一点,我没有看到,我真的很感激一些反馈.
您好我正在尝试找到替换此命令的方法:Bus_S <= "0000000000000000000000000000000" & Ne;
使用更方便的东西.逐个计数零并不是很复杂.该程序是针对ALU的SLT SLT单元.SLT仅获得1位(ADDSU32的MSB)并且具有全为零的32位输出,但第一位取决于ADDSU32的Ne = MSB.(暂时忽略ALUop)
entity SLT_32x is
Port ( Ne : in STD_LOGIC;
ALUop : in STD_LOGIC_VECTOR (1 downto 0);
Bus_S : out STD_LOGIC_VECTOR (31 downto 0));
end SLT_32x;
architecture Behavioral of SLT_32x is
begin
Bus_S <= "0000000000000000000000000000000" & Ne;
end Behavioral;
Run Code Online (Sandbox Code Playgroud)
有没有办法使用(30 downto 0)='0'或类似的东西?谢谢.
我喜欢三元运算符vs if子句的整洁.
该运算符是否存在于vhdl中?我的搜索恰恰相反.我还检查了when语句,但它不是运算符,我希望能够在进程中使用它...
我在VHDL编程中遇到了这些语句,无法理解两个运算符mod和rem之间的区别
9 mod 5
(-9) mod 5
9 mod (-5)
9 rem 5
(-9) rem 5
9 rem (-5)
Run Code Online (Sandbox Code Playgroud) VHDL和Verilog的用途相同,但大多数工程师都喜欢这两种语言中的一种.我想找出谁喜欢哪种语言.
有关Verilog和VHDL之间分离的几十个神话和常见智慧.(ASIC/FPGA,欧洲/美国,商业/国防等)如果你四处询问,人们会一遍又一遍地告诉你同样的事情,但我想知道这些神话是否基于现实.
所以我的问题是:任何人都可以提供定量数据来源,表明谁使用VHDL,谁使用Verilog?再一次,我正在寻找数字,而不是寻找直觉和一般迹象.
我刚刚写了一个简单的VHDL程序.我将文件保存为.vhd文件.然后我编译了它
ghdl -a test.vhd
Run Code Online (Sandbox Code Playgroud)
然后用.构建和执行文件
ghdl -e test
Run Code Online (Sandbox Code Playgroud)
最后试着用它来运行它
ghdl -r test
Run Code Online (Sandbox Code Playgroud)
发生了什么事是我现在有一个work-obj93.cf
文件,它是可见的,其他两个文件,即..
和.
那些不知何故不可见的.
有人能说出我在Mac上测试vhdl程序到底有多准确吗?也许与GTKWave结合使用.
我可以在类似于C-源代码,宏VHDL东西使用__DATE__
,并__TIME__
借此让该编译时在FPGA作为一种版本的时间戳的?
作为一个>>> new-cmer <<< to VHDL我想修改以下现有代码,它将硬编码日期放入FPGA寄存器.我总是要记住在编译之前调整值.如果这是自动完成的话会更容易.我还可以包括小时/分钟/秒吗?
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
ENTITY Datum2 IS
PORT
(
Day :OUT std_logic_vector(4 downto 0);
Month :OUT std_logic_vector(3 downto 0);
Year :OUT std_logic_vector(4 downto 0)
);
END Datum2 ;
ARCHITECTURE rtl OF Datum2 IS
BEGIN
-- "08.08.0013"
Day <= conv_std_logic_vector(8, 5);
Month <= conv_std_logic_vector(8, 4);
Year <= conv_std_logic_vector(13, 5);
END ARCHITECTURE rtl;
Run Code Online (Sandbox Code Playgroud) 在模拟中,这是完美的.这是检查可合成代码的零的最佳方法.会产生什么资源?
signal vector_slv : std_logic_vector(2048 downto 0);
...
if (vector_slv = (vector_slv'range => '0')) then
-- do something...
Run Code Online (Sandbox Code Playgroud)
考虑到h/w映射(具有最佳资源利用率),是否有任何其他最佳方式来实现此解决方案.
我会更了解所使用的资源.
触发器(,寄存器......)通常由上升沿或下降沿触发.但是大多数在代码中你会看到一个使用上升沿触发的if子句.事实上,我从未见过具有下降优势的代码.
这是为什么?是因为程序员自然会使用上升沿,因为它们习惯了,或者是因为某些物理/模拟定律/事实,其中上升沿编程更快/更简单/节能/ ......?