我的问题是关于以下代码的:
library ieee;
use ieee.std_logic_1164.all;
entity exam is port (
I,CLK,RESET : in std_logic;
Q : out std_logic
);
end entity;
architecture exam_arc of exam is
signal temp_sig : std_logic;
begin
process (CLK,RESET)
begin
if RESET = '1' then
下面的VHDL代码是一个简单的交换程序。但它并没有交换a和b的输入。我已经在评论中给出了成绩单的价值。
library ieee;
use ieee.std_logic_1164.all;
entity vhdl_swap is
port(a,b: inout integer);
end vhdl_swap;
architecture ar of vhdl_swap is
signal s : std_logic;
begin
process(s)
variable var : integer:=0;
begin
report "var is
Im makian是一个vhdl项目,我得到了这个警告:它是一个在8x8矩阵显示器上显示2个字母的小应用程序。
WARNING:Xst:819 - "C:/fitkitSVN/apps/demo/xhrbot01/fpga/ledc8x8.vhd" line 114: One or more signals are missing in the process sensitivity list. To enable synthesis of FPGA/CPLD hardware, XST will assume that all necessary signals ar
我们正在用VHDL实现一个以太网MAC控制器。
首先,这里是我的代码的一段代码片段。
-- next state
PROCESS(p_state, phy_start, phy_ctr, phy_clk)
BEGIN
CASE p_state IS
WHEN sIDLE =>
IF(phy_start = '1' or rising_edge(phy_start)) THEN
n_state <= sPRE;
ELSIF(phy_start'event A
我选择了一些VHDL代码来维护,这些代码以一种我不熟悉的方式编写了一个重置。我不确定它是否有效,并且我的模拟器(Modelsim)给出了我意想不到的警告。模式示例: process(clk, reset_n)
begin
if reset_n = '0' then
counter <= (others=>'0');
end if;
if rising_edge(clk) then
case state is
when IDLE =>
if signal_a = signal_b the
我是VHDL的新手。我听说信号赋值只在进程结束时更新,并且只会使用最近的赋值,所以我想测试一下它。为什么temp的值在第一个进程(i=0)结束时没有更新,即使我已经有了a,b,c的初始值?它只在第二次迭代(i=1)时开始更新temp的值。 我用来测试的代码: architecture Behavioral of test is
signal a : integer := 1;
signal b : integer := 2;
signal c : integer := 3;
signal i : integer := 0;
si
我已经在大学课程中用VHDL开发了一段时间,我认为我理解了它是如何工作的,但有时我意识到我实际上并不理解它。
我的问题来了:
正如我所理解的,如果一个信号在进程的敏感度列表中,那么每当该信号改变值时,该进程就会“执行”。
所以我问,这两段代码有什么不同:
process(clk) is
begin
if(clk = '1') then
--Do Something
end if;
end process;
和
process(clk) is
begin
if(rising_edge(clk)) then
--Do Something
我是VHDL的新手,我的代码可能看起来很愚蠢,但我仍然在努力。我正在试着用斯巴达3套件做一个BCD计数器。我在多路复用7段时遇到了问题,我知道我应该使用组件,但我选择了更简单的方法。我在综合中得到这个错误:“第103行:进程敏感度列表中缺少一个或多个信号”。为了能够综合FPGA/CPLD硬件,XST将假定所有必要的信号都出现在灵敏度列表中。请注意,合成的结果可能与初始设计规范不同。缺少的信号是:感谢任何帮助。谢谢。
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGI
为了在设计中用VHDL提供时序逻辑,我必须使用带有sensitivity_list的process语句。从不同的来源我知道,敏感性列表是不可综合的结构,也就是说,如果我要合成这个代码:
...
process(c)
b <= a and c;
end process;
...
我将不会有任何c信号锁定,这将只是一个通常的和-门。但是,当我合成没有敏感性列表的代码时:
...
process
b <= a and c;
end process;
...
无论我选择哪种版本的VHDL,我都会遇到同样的问题:
因此,我很难理解在vhdl中从ram或rom中获取值所花费的时间。在ram中插入数据,我知道发生在时钟的上升沿,需要一个时钟,就像我的例子一样,但是在获取数据方面,是否需要一个时钟从内存中获取数据,然后再获取另一个时钟周期来获取数据输出,这意味着需要2个时钟周期来获取数据?
process(clk)
begin
if(rising_edge(clk)) then
if(write_en = '1') then
mem(to_integer(unsigned(address))) <= incoming_data;--insert data
我是VHDL的新手,我在编写4位比较器时遇到了问题。当我想要比较不同的输入集合时,它们都只有一个输出。我不知道如何解决这个问题。我希望只有一个输出,如果A小于B,则显示0000,如果A大于B,则显示1111,如果它们相等,则显示0011。有谁能帮我解决我的问题吗? 下面是我的代码: library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity comp_4 is
port ( A:IN STD_LOGIC_VECTO
我有一个D触发器的VHDL程序如下所示
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY ff2 IS
PORT (
clk : IN STD_LOGIC;
rst_n : IN STD_LOGIC;
d : IN STD_LOGIC;
q : OUT STD_LOGIC
);
END ff2;
ARCHITECTURE beh OF ff2 IS
BEGIN -- beh
ff2_proc: PROCESS (clk, rst_n)
BEGIN --
我没有太多关于系统verilog的知识,我有以下问题。 据我所知,如果在always块的灵敏度列表中触发了复位信号的边沿,那么该复位信号的复位类型是‘异步’我需要知道,always_latch的复位信号的复位类型是什么? module test (input in_1,in_2,rst,clk,sig, output reg out_1,out_2,out_3);
always_latch
begin
if(~rst) // what is the reset type of this reset signal.?
out_3 <= 0;
else
我有一些VHDL代码在合成时表现得很奇怪,但我怀疑这是我对VHDL合成的基本理解是错误的。
"sync“是一个短脉冲(大约半个clk周期),它在clk上升沿是高的,但不久之后就会变低。在合成过程中,当sync为高电平时,仅在clk上升沿分配部分信号。
同步是否需要在某个最短时间内保持高电平?
process(clk)
begin
if rising_edge(clk) then
if sync = '1' then
a <= '1';
y3 <= y2;
y2 <= y1;
y1 &
我正在用VHDL实现一个FIR滤波器,需要一些关于何时使用和不使用过程语句的建议。下面给出了部分代码。具体地说,我想知道resetCoeffs循环将如何合成。这将是一个顺序重置,因此在速度和面积上都是非常低效的,还是会并行完成?如果是前一种情况,我该如何编写它才能成为并行重置。
process (clk) is begin
if rising_edge(clk) then
if rst = '1' then
-- Reset pointer
ptr <= (others => '0
请考虑如下代码:
reg [2:0] cnt;
// a is an input (say 4 bit) to design and being assigned after some manipulation
// to some other variable
always @(a)
for (cnt = 0; cnt < 4; cnt = cnt+1) begin
//some operation involving a [bitwise]
end
现在您可以看到,我没有在always块的事件列表中包含cnt
我知道如何在VHDL中使用变量,以及我能用它做什么,但我不知道硬件中的变量是什么?
在硬件中信号和变量之间的区别是什么?变量的值存储在哪里?它是电线还是取决于我的代码?
根据"QuantumRipple“的评论,我扩展了这个问题:
我用ISE (Xilinx综合工具)合成了以下简单代码,并将变量(var)合成成D触发器?
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY test IS
port(
clk : in std_logic;
input : in std_logic;
我是VHDL的初学者,我遇到了以下代码
process
variable F: integer:=1; variable A: integer:=0;
begin
wait on E;
A :=1;
F :=A+5;
B <= F + 1 after 5ns;
C <= B + 2 after 10ns;
D <= C +5 after 15ns;
A :=A +5;
end process;
所有变量和信号都被初始化。
如果E在时间为20 to时从“0”更改为“1”,我如何为上面的源代码制作一个测试平台代码?
谢谢大家,我在这里修改了这篇文章。我已经写了一个简单的代码陷阱过滤器的VHDL使用不同的组件为每个任务。下面是示例代码,其中使用了不同的组件,除了累加器组件(Acc1)之外,所有其他组件都工作正常,输出信号保持为零。在acc1组件中,我试图制作两个累加器,其中第一个acc1 (第一个累加器的输出)是acc2的输入。由于其他组件可以正常工作,所以在这里我只在测试平台上的代码中显示了acc1组件的端口映射。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use IEEE.std_logic_unsigned
我是个VHDL新手。我目前正在处理一个FSM,我希望我的状态机只在我的输入改变时才改变状态。我应该在以下代码中进行哪些更改?
entity fsm is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
x_in : in STD_LOGIC; -- input Bitstream
y_out : out STD_LOGIC_VECTOR (1 downto 0)); -- Encoded output
end fsm;
我想锁存一个信号,但是当我尝试这样做时,我得到了一个周期的延迟,我如何避免这种情况?
myLatch: process(wclk, we) -- Can I ommit the we in the sensitivity list?
begin
if wclk'event and wclk = '1' then
lwe <= we;
end if;
end process;
但是,如果我尝试这样做,并在模拟过程中查看波,lwe会延迟一个wclk周期。我想要实现的就是在wclk的上升沿采样we,并使其保持稳定,直到下一个上升
我正在尝试得到18*18乘法的部分和。我想将它们保存在一个多维数组(18*36)中,其中数组的每个索引都包含一个部分和。我尝试使用std_logic_vector数组。但是我没有结果。我甚至尝试过bit_vector数组和bits数组。这是我的VHDL代码。
entity partial is
port(
A : in bit_vector(17 downto 0);
B : in bit_vector(17 downto 0);
C : out bit_vector(35 downto 0);
D : out bit
);
end partial;
architec
我试着用Peter的书“设计师VHDL指南”来学习VHDL,但我似乎无法摆脱这样一种感觉:我错过了一个与敏感性列表相关的基本项目。
例如,一个问题是“编写一个表示具有整数输入和输出的简单ALU的模型,以及一个函数选择bit.类型的输入。如果函数选择为'0',则ALU输出应该是输入的和,否则输出应该是输入的差。”
我的解决办法是
entity ALU is
port (
a : in integer; -- A port
b : in integer; -- B port
以下代码-1和代码-2在Verilog中是等效的,这是真的吗?
代码1
always@(posedge Clock or B or C)
begin
if (B)
A <= 0;
else if (C)
A <= 1;
end
代码2
always@(posedge Clock or B or C)
begin
if (B)
A <= 0;
else if (C)
A <= 1;
else
A <= A;
end
同样的事情在VHDL中也是如此吗?
代码-3
process
我不知道怎么准确地描述它,但也许是这样的?
void monitor_thread(void)
{
for(;;){
if (data==10){
data=0;
data2++;
}
}
}
对我来说,在VHDL中,我会意识到这一点:
signal data,data2:std_logic_vector(3 downto 0);
...
process(data)
begin
case data is:
when "0101" => data2<
我必须实现一个循环,在VHDL上更新循环中的变量(或信号)。换句话说,我必须实现这个伪代码。
res = 1
while condition:
res = res * val #for example, but it could be another operation
return res
我知道在VHDL中不可能更新信号的值,所以我不知道如何继续。
例如,我尝试创建一个nb_iterations元素数组,其中将更新后的值放在数组的相应示例中。但有时我的迭代次数可能很大,所以在内存中保留这么大的数组是不有效的。
是否有任何方法来更新或覆盖VHDL上的信号,从而使实现这样的循环成为
当信号包含在灵敏度列表中时,每次该信号改变时都会执行该过程。例如,
-- State Memory
-- Synchronous Reset
process (clk)
begin
if (rst = '1') then
p_state <= initialization;
elsif (rising_edge(clk)) then
p_state <= n_state;
end if;
end process;
但是,如果rst包含在灵敏度列表中,它将变为异步复位。我现在的问题是,什么时候断言rst。该进程将
我正在用VHDL编写一个指定的UART组件。
send: process(send_start)
variable bit_index : integer range 0 to 2 := 0;
begin
if (falling_edge(send_start)) then
if (start = '0' and transceiver_start = '1') then
bit_index := 0;
end if;
transceiver_start <=
关于难-简单的问题,我知道这很普遍,但这正是我问的原因……
如果我用vhdl写一段代码,我使用的进程是这样开始的:
Process(clk,x,y,x)
begin
...
end process
有没有什么方法可以让我不必保存x,y,z值?我对此的理解是,如果我不能拯救它们,我就不能说其中一个改变了,这意味着我必须拯救它们。
我正在和一个朋友一起写大学作业,我们有不同的意见。非常感谢你的帮助!