我刚开始使用各种不同的模块创建 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 新手,正在使用 VIvado 2017.1。
我正在尝试使用包来定义常量和其他此类枚举类型以包含在多个模型中。但是现在,我无法在我的模型中使用该包。我不断得到
Error: Cannot find <PACKAGE NAME> in library <xil_defaultlib>. Please ensure that the library was compiled, and that a library and a use clause are present in the VHDL file
然而,有问题的包位于 xil_defaultlib 文件夹中,我很确定它已编译,因为我没有看到错误[如此处所示][1]。
我的每个代码是
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_unsigned.all;
use work.Specs_Package.all;
entity Freq_Divider is
Port ( En,clk, reset : in std_logic; clock_out: out std_logic);
end Freq_Divider;
architecture bhv of Freq_Divider is
signal count: std_logic_vector(7 downto 0);
signal tmp : std_logic := '0';
begin
if …Run Code Online (Sandbox Code Playgroud)写测试台的时候,写的有没有问题
wait for 1 ns ; wait until rising_edge( clock ) ;
Run Code Online (Sandbox Code Playgroud)
每次我想等待下一个上升沿?
我想将此序列放入一个过程中,然后始终使用它。
我想等待 1 ns 的原因是,如果我只有 swait until并且其中两个之间没有信号分配,它们将合并为一个。
时钟周期时间为 10ns,因此 1 ns 应该不成问题。我真正想做的是等待一个增量,但我不知道该怎么做。是否可以?
这种方法是否存在隐藏的陷阱?
我们使用 VHDL 93 和 ISIM 模拟器。
我想理解并改进我得到的 VHDL 代码。
在VHDL实现中有以下部分:
m1(000) <= MetricA(000) + BrMet(3);
m1(001) <= MetricA(001) + BrMet(1);
m1(002) <= MetricA(002) + BrMet(0);
m1(003) <= MetricA(003) + BrMet(2);
m1(004) <= MetricA(004) + BrMet(0);
m1(005) <= MetricA(005) + BrMet(2);
m1(006) <= MetricA(006) + BrMet(3);
m1(007) <= MetricA(007) + BrMet(1);
m1(008) <= MetricA(008) + BrMet(2);
m1(009) <= MetricA(009) + BrMet(0);
m1(010) <= MetricA(010) + BrMet(1);
m1(011) <= MetricA(011) + BrMet(3);
m1(012) <= MetricA(012) + BrMet(1);
m1(013) <= MetricA(013) + BrMet(3);
m1(014) <= MetricA(014) + BrMet(2);
m1(015) …Run Code Online (Sandbox Code Playgroud) 我需要编写一个函数将数据转移到输入向量中。输入的类型可以是有符号或无符号的。为了使函数更加稳健,我需要知道输入向量的方向,即使用 downto 与 to 声明的范围。此信息将用于确定哪个索引具有最低有效位。
如何查明范围是如何声明的,并根据该信息选择正确的最低有效位和最高有效位?
如何从rom_type读取数据?
entity my_rom is
port(
addr: in std_logic_vector(3 downto 0);
data: out std_logic_vector(0 to 7)
);
end my_rom;
architecture a of my_rom is
type rom_type is array (0 to 7) of std_logic_vector(0 to 7);
constant R1_ROM: rom_type :=
(
-- data
);
begin
data <= R1_rom(conv_integer(addr));
end a;
Run Code Online (Sandbox Code Playgroud) 我试图在VHDL中将'1'添加到N长度STD_LOGIC_VECTOR
这是我第一次使用VHDL,所以我完全不确定如何添加这个1,而不需要添加一个看似有点冗余的Full-Adder
我们不允许在代码中使用任何更多的库,然后使用一个.
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cnt IS
GENERIC (n: natural :=3);
PORT( clk: IN std_logic; -- clock
rst: IN std_logic; -- reset
cntNum: IN std_logic_vector(n-1 DOWNTO 0); -- # of counting cycles
cntOut: OUT std_logic_vector(n-1 DOWNTO 0) -- count result
);
END cnt;
architecture CntBhvArc OF cnt IS
signal counta : std_logic_vector(n-1 DOWNTO 0);
begin
process (clk, rst)
begin
if rst='1' then
counta<="0";
elsif (clk'event) and (clk='0') then
counta<= counta+'1';
end if;
cntOut<=counta;
end …Run Code Online (Sandbox Code Playgroud) 我是电子工程系的学生,去年我们研究过VHDL基础知识,我希望提高我在这个领域和数字设计领域的经验,我想成为这个领域的专家.我怎样才能做到这一点?我在网上搜索了很多,没有找到任何东西.请帮忙.非常感谢.
我不熟悉verilog.我尽力尝试转换它.
虽然模拟时钟从'0'变为'x',这很奇怪.我怀疑这部分是问题所在
repeat(9) @(posedge clk);
DataIn_i <= 1'b1;
DataIn_q <= 1'b1;
@(posedge clk);
FillSel <= 1'b0;
DataIn_i <= 1'b0;
DataIn_q <= 1'b0;
Run Code Online (Sandbox Code Playgroud)
这里有两个长椅的链接.
Verilog工作台 - http://a.pomf.se/fvamqd.v Vhdl工作台 - http://a.pomf.se/riolvf.vhd
欢迎任何意见,提前谢谢.
编辑:任何人都可以解释上面给出的verilog代码?
我从一个块输出16位std_logic_vector.但是在后期我只需要使用低8位std_logic_vector.it创建综合问题...请告诉我如何避免这种情况..
我已经实现了一个4 FIFO队列和一个搜索FIFO索引的块,当发现一个非空的FIFO将提取数据结束时,它将串行发送它.
这是代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Serialize is
port
(
TX : out std_logic_vector(1 downto 0);
RESET, CLK, We1, We2, We3, We4 : in std_logic;
--
DATA_IN_A, DATA_IN_B, DATA_IN_C, DATA_IN_D : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
fifo_full1, fifo_full2, fifo_full3, fifo_full4 : out std_logic;
--
SendPackage : out std_logic
);
end Serialize;
architecture rtl of Serialize is
signal step, nr : integer:=0;
signal enl : std_logic := '0';
signal temp : std_logic_vector(31 downto 0);
--signal txx …Run Code Online (Sandbox Code Playgroud)