我想学习VHDL,但我真的不知道从哪里开始
我想要一些关于我需要开始使用的软件的建议和解释
我还想获得一些参考资料,以便在不浪费时间的情况下通过互联网搜索有效地学习,因为有很多电子书和教程,我真的不知道该选择哪一本。第一部分的网页(更具体地说,是课程文献、工具和链接部分)包含一个很好的阅读材料和工具列表。本课程不提供任何VHDL介绍,但对没有VHDL经验的学生开放,因此,使用所提供的材料自学效果非常好。(至少对我来说是这样的;YMMV。)我建议,你在数字设计方面有很好的背景。如果没有,从任何版本
在VHDL中,给matrix2D的信号类型赋予初始值零有一个问题。我将其定义如下:
type matrix2D is array (integer range <> , integer range <> ) of signed(2 downto 0);
但不幸的是,它不起作用
有人知道我如何定义矩阵2d的初始值零吗?我的状态副本第86页
我们还可以使用聚合来写入多维数组值。在本例中,我们将数组视为数组数组,首先为每个最左侧的索引值编写数组聚合
这就是您的示例所需要的:
对于那些对VHDL有很好理解的人来说,这是一个问题。我是个新手,但到目前为止,我一直在使用行为描述生成VHDL。对我来说,它更容易思考,因为它类似于编写软件。我知道一个可能的缺点是行为“执行”顺序,而结构在设计组件/过程中并发执行
所以我很好奇,如果我有一个使用进程的架构,比如说一个8位移位寄存器(SISO),我想创建4个实例(4x8位移位寄存器),我会创建一个组件和4个进程实例吗
或者我会生成4个进程(彼此并行执行),然后用不同的名称调用每个进程
另外,这只是一个一般性的问题,以获得人们在那里
我想对一个长度为16、有8位数字的数组进行排序。我用过bubblesort,效果很好。
现在我想从BRAM读取输入数组,并将排序后的输出写入BRAM。我在测试台上使用了单端口RAM,下面是它的外观
library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity testbench is
end testbench;
archi
我正在编写一个状态机,它有一个泛型参数,一些状态的存在依赖于此。由于我在类似枚举的东西中定义了我的状态(不知道它的vhdl术语),我想知道是否可以根据泛型定义这个枚举,有点像这样:
generic(x: bool); -- in the entity
....
architecture ...
if x then generate
type states_t is (State1, State2, State3ifX)
else
type st
这里是初学者的问题
我想执行以下操作
我有一个标准逻辑向量(1到0)输入。我应该把它扩展到四位
比如11=>0011
或10=>0010
我试过了,但失败了
(Data0 is declared as input at entity port list)
Signal Data0_4bit: std_logic_vector(3 downto 0) :=B"0000";
Data0_4bit(1 downto 0)<=Data0(1 downto 0);
(数据0在实体端口列表中声明
我是vhdl新手,我有简单的代码来模拟slt操作;但是,我得到以下错误:
错误(10500):文本“if”附近SetLessThan.vhd(14)处的VHDL语法错误;应为“end”或“(”或标识符(“if”是保留关键字)或并发语句
有人能帮忙吗?(代码粘贴在下面)
我试着把()放在a
计数器计数输入样本数。然后计数器输出(n),我想检查样本数是否为偶数,然后n_of_samples=(n*n),否则如果为奇数,则为((n*n)-1)
会是那样的吗
signal dis : integer range 0 to 255 := 0;
signal n : integer range 0 to 255 :=0;
if n mod 2=1 then
n_of samples<= ((n*n)-1);
else
n_of_samples <
敏感度列表与流程声明关联的必要性是什么?你能申报吗
没有敏感度列表的时钟进程?带有敏感度列表的进程是一种方便的特例
首先,只有没有wait语句的进程才能有敏感度列表。其次,这样一个进程相当于一个没有敏感度列表的进程,最后一个语句是一个额外的wait语句。wait语句指定了等效的灵敏度
因此,理论上,具有灵敏度列表的过程是可选的。然而,在实践中,它所涵盖的建模案例非常常见。为清晰起见,尽可能使用敏感度列表是更好的建模选项。敏感度列表需要与流程声明关联什么?
有一些信息描述并发语句和进程之间的关系;
我已经创建了一个分频器,我想用FPGA板测试它。为了测试它,我想让led在开关打开的情况下以分频闪烁。问题是,如果时钟不在上升沿,我不知道如何更改led的值
下面是我得到的确切错误:
第51行:信号led无法合成,同步描述不良。当前软件版本不支持用于描述同步元素(寄存器、内存等)的描述样式。
-->
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_ARITH.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体divi
我正在使用lfsr生成随机序列。我想在fpga板上显示输出序列。因此,我应该使用.ucf文件将我的I/O映射到板上的实际管脚。这足以在板上显示我的o/p吗?或者我还需要做更多的工作吗?我喜欢用示波器显示o/p序列。如果没有更多的上下文,我想这个问题是无法回答的。如何显示序列符合您的要求。你是想证明这个序列是伪随机的,还是你必须证明什么,只是为了展示,还是你需要其他东西的输出,…我想在另一个程序中使用这个序列,但在此之前,我想证明,不同的输入种子会产生不同的序列。
第一个VHDL用于使26个LED从0旋转到26。为此,需要10 hz和1 hz的时钟信号。唯一可用的时钟是50Mhz。第二个VHDL文件是将可用信号降低到1和10hz。我使用一个.do文件来运行模拟以生成波形。50MHz时钟显示良好,但1hz和10hz均为平线。这两个需要第二个VHDL文件。由于ModelSIm只允许每个模拟选择1个VHDL文件,因此是否需要在模拟中同时包含这两个文件才能执行此操作
简言之,一个文件包含大部分旋转led代码,另一个文件本质上是一个头文件,用于完成主文件所需的任务。
标签: Vhdl
xilinxxilinx-ise
我刚刚开始学习如何使用这个工具,所以如果我的问题看起来很愚蠢,我会提前道歉。我已经在许多论坛上搜索了这个错误(已经回复了帖子,不是我的),无法理解我做错了什么,所以这里是我的问题:
我的行为准则:
----------------------------------------------------------------------------- -----
-- Company:
-- Engineer:
--
-- Create Date: 01:47:22 07/07
当我在变量上运行游标时,是否可以更改显示值的基数
因此,如果在调试模式下将鼠标悬停在变量上(因为已达到断点),则二进制基数对我来说没有用处。是否有办法更改此基数?打开Modelsim图形界面后,您可以按照以下步骤更改基数:
选择模拟>运行时选项
在默认基数框中,选择所需的基数
希望这对您有所帮助。如果您想永久设置它,请在modelsim安装文件夹中打开modelsim.ini(有时,您可能需要更改此文件的权限-默认为只读),导航到
默认基数=符号
并将其更改为
默认基数=十六进制
Default
我想用VHDL设计一个8位alu,但我得到了这个错误,我认为这与我的输入被声明为位向量有关。这是真的吗
** Error: C:/Programs/Modeltech_pe_edu_10.4a/examples/alu.vhdl(19): No feasible entries for infix operator "+".
** Error: C:/Programs/Modeltech_pe_edu_10.4a/examples/alu.vhdl(19): Type error resolvi
我想写一个代码,其中我的W_EN(std_logic)信号在需要时设置为一(如果满足某些条件),否则(如果没有不同的指定)为零。如果W_EN是标准逻辑向量,我可以用“其他”语句这样做(在示例代码中,“W_EN”称为“one_If_one”):
信号cnt:无符号(1到0)--在每个clk_循环中递增
信号一如果一:标准逻辑;
工艺(cnt)
开始
一个“如果”一个“0”);
如果(cnt=“01”),则
一个如果一个你不需要在这里做任何特别的事情。如果一个信号在一个特定的过程中被多次赋值,最后一
标签: Vhdl
compiler-warningsbcd
这个问题困扰了我一段时间。如果有人能帮助我,我将不胜感激。已经反复阅读了大部分代码,但没有任何解决方案。有多套代码在使用中;此bcd计数器将在我的项目的其余部分中进一步使用。我在下面添加了必要的代码:
1位BCD计数器:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;
USE WORK.mypackage_p.ALL;
ENTITY bcd_e IS
POR
我已经写了这个简单的代码。但当我尝试使用Modelsim模拟它时,它显示了一个错误,表示库无法映射。我该怎么分类呢
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity p1 is
Port ( a : in STD_LOGIC;
b : in STD_LOGIC;
c : out STD_LOGIC);
end p1;
architecture Behavioral of p1 is
我在网上找到了一个简单处理器的以下代码。我正在尝试使用仓鼠在VHDL AMS中添加一些模拟组件。但它产生了一个错误:类型不匹配
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;
entity program_counter is
port (
clk, en_A, ld, inc, reset: in STD_LOGIC;
aBus: out STD_LOGIC_VECTOR(15 downt
我在Xillinx中合成此代码时出错。此错误是:
无法合成信号Z_1,同步描述错误
实体uk3为
港口(
rst:以位表示;
C:整数;
时钟:以位为单位;
S:输出整数
);
结束uk3;
--}}自动维护区段的结束
uk3的架构uk3是
开始
过程(C、clk、rst)
变量Z_1:整数:=0;
开始
如果rst='1',则Z_1:=0;
elsif rst='0'和clk'事件以及clk='1'和C=1
然后
Z_1:=Z_1+1;
elsif rst='0'和clk'事件以及clk='1
当比较2比特std_逻辑_向量与std_逻辑_签名加载到十六进制常量(如x“3”)的包时,我遇到了意外的比较结果。当两个位都设置好时,我希望比较结果为真,但它总是假的。可能是因为std_logic_vector将符号扩展到4位,以便与4位十六进制常量进行比较。然而,真正奇怪的是,当使用常量3时,比较工作与预期一样,但仅当使用std\u logic\u vector时,而不是使用带符号的类型时。请参见下面的示例代码。除第一个断言外,所有断言均失败。为什么这个断言会成功?另外,当未加载std_log
我正在学习VHDL,从昨天起我就一直在努力学习下面这个简单的例子
在VHDL中为零(0)到九(9)计数器写入一个实体,该计数器由正边缘时钟触发,并具有异步活动高电平“归零”输入。系统有三(3)个输出信号“低”、“中”和“高”,产生以下值:
假设所有信号均为Std_逻辑类型
代码是这样的
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
我已经有了一个4位堆栈,但我不知道如何使它成为8位堆栈。这是一个更大项目的一部分,我正在fpga上制作一个“苏打机模拟器”(BASYS2,ISE网页包)。到目前为止,情况是这样的:
实现堆栈的模块:
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.std_logic_arith.all;
实体堆栈是
港口
(
A:标准逻辑向量(3到0);
S_辅助:标准逻辑向量中(1到0);
Q_aux:in标准逻辑向量(3到0);
clk_2:标准逻辑中;
clr_2:标准_
我有一个VHDL问题:作为家庭作业,我们必须为VHDL设计的电路编写一个带有assert的测试台。我们应该测试每一个位比较器的信号组合。我想用for循环来解决这个问题,如下所示:
architecture ts of testbench is
signal a: std_logic_vector(3 downto 0) := "0000";
signal b: std_logic_vector(3 downto 0) := "1011";
signal c1, c0: std_logic :=
我正在为开发板上用于测试的Intel Max II CPLD开发设计(VHDL)。稍后,它很可能会被Coolrunner II CPLD取代
我对这个很陌生。
使用Quartus Prime Lite和Modelsim进行的基本编译和模拟效果良好。我当前的设计如下所示:
-- The top level entity used for synthesis.
entity foo is
port(...)
end foo;
architecture rtl of foo is
...
b
我一直在尝试在单独的“mytypes.vhd”文件中声明我的类型,如下所示:
library ieee;
use ieee.std_logic_1164.all;
package mytypes is
type my_bus_array_type is array (0 to 3) of std_logic_vector(7 downto 0);
end package mytypes;
library ieee;
use ieee.std_logic_1164.all;
libr
我正在用VHDL编写代码,其中一个数字乘以一个向量。但它给出了一个错误
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity multi is
port ( clk : in std_logic;
ipixel : in std_logic_vector(15 downto 0);
opixel : out std_logic_vecto
我在用VHDL设计内存电路时遇到问题。我试图找出以下提示的解决方案:
使用结构化VHDL方法在Xilinx工具中创建NAND基本单元。向两个与非门添加1ns门延迟(用于上升和下降转换)。适当标记输入S和R以及输出Q和QN。创建一个VHDL测试台来模拟电路,按照以下规定驱动输入
在模拟开始时取消断言两个输入。在100纳秒时,资产S.在200纳秒时,取消断言S.在300纳秒时,断言R.在400纳秒时,取消断言R.在500纳秒时,断言两个输入。在600ns时,取消断言两个输入。在700ns时,断言两个
在一个体系结构中,我有大量遵循特定公式的并发信号分配,在本例中:
x(i) <= x(i-1) XOR x(i-4) XOR ROTATE_LEFT(x(i-8), 2)
x(i)(其他=>0');
开始
为此,sigArray(8)VHDL具有带循环(for)的generate构造,因此您可以将代码编写为:
x_gen : for i in 8 to 127 generate
x(i) <= x(i-1) XOR x(i-4) XOR ROTATE_LEFT(sigArray
代码如下:在这种情况下,奇偶校验位的计算没有完成。奇偶校验位可以使用for循环计算,但是在这种情况下,是否有其他短的或更好的方法来计算偶数奇偶校验位。
考虑到制作阵列后,我希望逐位访问8位8信号的阵列,逐位发送uart_tx端口中的数据,是否有可能使用阵列而不是8 TxDataReg std_logic_vector
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_L
标签: Vhdl
bit-shiftlogical-operatorsbluespec
我使用5级多路复用器(Shift1/2/4/8/16)实现了一个右移位器(32位)。我的问题是如何扩展我的实现,以使用最少的额外硬件实现左移位器?可以通过反转参数向量、向右移位,然后反转结果,使用向右移位来实现左移位,因此:
shift_left(arg, n) = reverse(shift_right(reverse(arg), n))
可以在中找到std\u logic\u vector的反转函数。这似乎是一个硬件问题。@IsThatSo VHDL是一种硬件描述语言。你可以推断其中有硬件
标签: Vhdl
fpgahdlspartanxilinx-ise
5年前我学习了VHDL,此后我就再也没有使用过,因为我在不同的领域工作。现在我在一个项目中工作,这个项目需要一些VHDL语言的工作。我必须实现SPI来编程ADF4158设备。我打开一本语法书,试着编写程序。我需要开发下面的模块,我按照我的理解编写代码,还有一个测试台,但它在模拟中无法像我需要的那样工作。下面是我想开发的模块和总体框图
过程和vhdl模块框图(可点击):
以下是SPI时序图,如下所示(可单击):
下面是我为实现上述SPI通信而编写的VHDL代码:
library IEEE;
u
标签: Vhdl
fpgasynthesisvivado
如果我注释掉第二个进程块,我下面的vhdl模块将进行合成,但是如果我尝试同时使用这两个模块,合成将失败,并且没有列出任何严重警告或错误。
有一些警告,但它们只是普通的东西(Zynq没有连接以太网,没有使用的东西,等等)
我看不出有任何理由会发生这种情况。最初,我在导致错误的process语句中有一个for循环,但是去掉它并不起作用。
然后我认为这可能是两个进程之间的多驱动网络,但事实也并非如此
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IE
我正在运行一个用VHDL编写的HDL代码,我有一个最大长度为512位的输入向量。我的一些输入小于最大大小。所以我想知道是否有一种方法可以找到每个输入的实际长度,以便在输入向量的最高有效位切割不需要的零。有没有任何可能的方法来做这种事情?我想您正在寻找一种明确的数据填充方法。我建议您采用ISO/IEC 9797-1填充方法2,如下所示:
对于每个输入数据(即使它已经有512位),您添加一个前导“1”位。然后添加前导“0”位(可能没有)以填充向量
要实现此方案,您必须将输入向量放大到513位(因为您
我可以为您提供这种左/右移位或使用旋转的方法(VHDL'87!)
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体桶移位器为
通用型(gSize:natural:=3);
港口(
iPortA:标准逻辑向量(2**gSize-1向下至0);
oPortQ:输出标准逻辑向量(2**gSize-1向下至0);
iShiftDigits:标准逻辑向量(gSize-1向下至0);
IMO取消选择:在标准逻辑向量中(1到0)
);
端
我正在通过I2C将FPGA连接到MPU-6050陀螺传感器。我已经尝试了不同的方法,但现在我得到了错误:未解决的信号‘i2c_rx_data’有多个来源(106)
你知道我做错了什么吗
格雷廷斯洛斯波斯特酒店
我的源代码:
-----------------------------------------------------------------
-- Project : Invent a Chip
-- Authors :
-- Year :
标签: Vhdl
ramdigital-logic
我使用两个3位地址寄存器创建了一个64字节的RAM,并使用两个3to8解码器创建了3位寄存器的交叉条。以下是VHDL代码:
library ieee;
use ieee.std_logic_1164.all;
entity ram88 is
port(a : in std_logic_vector (2 downto 0);
s0: in std_logic;
s1: in std_logic;
s: in std_logic;
e
标签: Vhdl
hdlstate-machinequartus
我是VHDL新手,我对FSM的实现有一个疑问。
我想要图片中显示的行为(我用AHDL实现了相同的FSM)。当我用VHDL实现它时,我有一个不同的重置行为:如果它检测到重置=1,同时有一个上升沿,FSM不会继续,但它会继续将PS置于S0。
我知道问题是如果。。。elsif(它检测到正确的第一个条件,我想不会进入第二个条件)。
我尝试了许多不同的方法,但仍然不起作用,输出在第一个上升沿后也保持在00
AHDL实现的波形:
VHDL实现的波形:
库ieee;——塞克斯韦林巴朗图书馆
使用ieee.
我用的是FPGA斯巴达2板,我想数一数键盘上的按键
这是我的VHDL代码:
library ieee ;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
ENTITY Keyboard IS
PORT(CLOCK : IN STD_LOGIC;
RESET : IN STD_LOGIC;
我是新来的
事实上,我正在学习VHDL。我已经编写了以下代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Problems is
port(
S : in std_logic;
D : in std_logic;
CLK : in std_logic;
R : in std_logic;
Q : out std_logic;
标签: Vhdl
simulationvivado
如何使用Virtex 7在vhdl的特定条件下关闭时钟(0)
前
下面是一个伪代码:
if(x>1)
clk off
else
clk on (rising-edge)
你所描述的是一个“门控时钟”,这通常不是一个好主意。如果目标是节能,则可以通过启用时钟来实现。时钟启用时发生的情况是,时钟仍在运行,但在关闭时钟启用时,您会阻止always块(在Verilog中)或进程(在VHDL中)内的逻辑切换触发器。这里有一些伪代码
always @(posedge i_clk)
begin
我正试图在50兆赫的频率下对14位ADC信号进行积分(求和)。积分从信号“触发器”的上升沿开始。如果积分达到规定的阈值(6000000),数字信号(“dout”)应设置为0(变为1,“触发器”变为1)。到目前为止,这是一项相当容易的任务。
尽管在硬件本身(Cyclone V)上,我意识到了一种奇怪的行为。虽然我将电压电平保持在ADC恒定,但输出信号“dout”的脉冲宽度有时会波动(尽管对于具有低噪声的ADC的恒定14位值,它应该保持几乎恒定)。脉冲宽度随着电压水平的升高而减小,因此集成本身工作良
错误信息相当全面:无法写入进入模块的信号
a、 b和cin都在STD_逻辑中a,b,ci:但您尝试编写它们。欢迎使用堆栈溢出。你想在代码中做什么?您需要添加farc4bit实体描述。我需要创建一个全加器4bit。我显示的代码只是架构部分。farc4bit是顶级实体,我调用子电路farc1bit 4次。在堆栈溢出时,您应该始终发布@jhbonaris啊,是的。fa1bit的港口定义误导了我。我将删除该评论。
architecture behavioral of farc4bit is
compo
我有一个VHDL测试台,我想把32位二进制字写入一个文件进行测试。下面是一个最小的、完整的、可验证的示例
当使用GHDL(下面的命令)执行时,在指示行生成溢出。如果该行被注释掉,执行将成功完成并写入文件。只要设置高位,就会发生溢出
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;
use std.env.stop;
entity u32_file_write is
e
我正在设计一个系统,它有两个独立的计数器同时执行,两个计数器都向一组4个LED输出4位二进制信号。一个计数器的输出总是由LED显示,而另一个计数器仍在计数(只是没有显示到LED的输出)。通过按下一个按钮激活切换,该按钮将LED上显示的输出从一个计数器切换到另一个计数器
我甚至不知道从哪里开始在我的设计中包含这个功能。我不确定是否可以将逻辑包含到顶层文件中,并切换发送到LED的信号(我甚至不确定这是否可行),或者是否可以将必要的逻辑包含到计数器文件中。我的程序包装文件位于下面,显示了顶级组件的实例
我想在VHDL中执行无符号数和无符号定点数之间的算术运算:
信号A:ufixed(11到-8);
信号B:无符号(11到0);
信号C:ufixed(A’范围);
对整数部分执行算术运算的最佳方法是什么,如下所示:
ca,
B=>B,
C=>C);
--波形产生
WaveGen_过程:过程
开始
A在fixed\u-pkg包中有一个to\u-fixed函数:
function to_ufixed (
arg : UNRESOLVED_UNSI
我试图在Verilog设计中实例化一个VHDL组件,作为在另一个复杂设计中测试除法函数的一部分。获取语法错误:
错误(10170):文本附近deldel.v(29)处的Verilog HDL语法错误:
“[“期待”)”
我的VHDL文件:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
entity divi
我试图将数组大小(integer ArraySize)从顶级文件传递到组件,但出现错误:
[Synth 8-561]范围表达式无法解析为常量[/uncorray.vhd]:39]
我想知道是否有办法做到这一点。另外,如果一个无约束数组必须定义为常数,那么重点是什么
无约束测试
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity UnconstrainedTest is
Port ( clk : in std_logic;
我使用的函数返回用户定义的无约束数组:
type t_array is array(integer range <>) of std_logic_vector(7 downto 0);
类型t_数组是std_逻辑_向量(7到0)的数组(整数范围);
然后将该数组传递给一个过程。在我的过程或函数中,没有明确定义数组的范围
当数组作为参数传递时,它的索引范围默认为什么?它将默认为与参数关联的任何内容。因此,在本例中:
library IEEE;
use IEEE.std_logic_
我的任务是设计缓存和缓存控制器。我正在从内存中读取一个块的16个字节,并将其写入缓存。仅在块的最后一个字节上,数据_数组不更新,保持0。我已经成功地将一个意外的行为隔离到一条奇怪的没有执行的指令
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity cache is
...
port(
...
m_readdata : in std_logic_vector (7 downto 0
1 2 3 4 5 6 ...
下一页 最后一页 共 51 页