!! EDIT !!
好的,所以在完成一些教程后,我现在正在尝试创建一个类似的过程,因为我按一个按钮来改变LED闪烁的频率,但这次使用的是多路复用器。现在的问题是标题中的错误,错误(10028):无法解析网络“clk_1hz”的多个常量驱动程序。现在我已经阅读了所有不同的帖子,但我似乎无法识别我做错了什么......我明白它告诉我,我正在为“clk_1hz”和“clk_4hz”分配多个不同的来源,但是它告诉我这是在代码的端口映射中发生的。我的印象是端口映射相当于“焊接”不同组件的输入和输出?
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity blinking_led is
port(
clk_50mhz : in std_logic ;
btn_one : in std_logic;
green_led : out std_logic
);
end entity;
architecture behave of blinking_led is
component MUXii
port(
a : in std_logic;
b : in std_logic;
sel : in std_logic;
z : out std_logic
);
end component;
component PLLii
port(
clk : in std_logic;
y : out std_logic;
x : out std_logic
);
end component;
signal clk_1hz : std_logic ;
signal clk_4hz : std_logic ;
signal scaler : integer range 0 to 25000000 ;
signal scaler_2 : integer range 0 to 12500000 ;
signal LED : std_logic ;
signal a, b, z, sel, y, x : std_logic;
begin
Multiplexer_process : process( a, b, sel, z)
begin
if(sel = '1') then
z <= a;
else
z <= b;
end if;
end process Multiplexer_process;
PLL_1_4_Hz : PLLii port map (
clk => clk_50mhz,
y => clk_1hz,
x => clk_4hz
);
MUX1 : MUXii port map (
a => clk_1hz,
b => clk_4hz,
sel => btn_one,
z => LED
);
green_led <= LED;
clk_1_4_hz_process : process( clk_50mhz )
begin
if(rising_edge(clk_50mhz)) then
if (scaler < 25000000) then
scaler <= scaler + 1 ;
clk_1hz <= '0';
else
scaler <= 0;
clk_1hz <= '1';
end if;
if (scaler_2 < 12500000) then
scaler_2 <= scaler_2 + 1 ;
clk_4hz <= '0';
else
scaler_2 <= 0;
clk_4hz <= '1';
end if;
end if;
end process clk_1_4_hz_process;
end behave;
编辑!!
所以我设法摆脱了我遇到的一些问题,所以代码现在......
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity PLL is port(
clk : in std_logic;
y : out std_logic;
x : out std_logic
);
end PLL;
architecture behaviour of PLL is
signal scaler : integer range 0 to 25000000 ;
signal scaler_2 : integer range 0 to 12500000 ;
signal clk_1hz : std_logic ;
signal clk_4hz : std_logic ;
begin
clk_1_4_hz_process : process( clk )
begin
if(rising_edge(clk)) then
if (scaler < 25000000) then
scaler <= scaler + 1 ;
clk_1hz <= '0';
x <= clk_1hz;
else
scaler <= 0;
clk_1hz <= '1';
x <= clk_1hz;
end if;
if (scaler_2 < 12500000) then
scaler_2 <= scaler_2 + 1 ;
clk_4hz <= '0';
y <= clk_4hz;
else
scaler_2 <= 0;
clk_4hz <= '1';
y <= clk_4hz;
end if;
end if;
end process;
end behaviour;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity MUX2to1 is port(
A : in std_logic;
B : in std_logic;
Sel : in std_logic;
Z : out std_logic
);
end MUX2to1;
architecture behavior of MUX2to1 is
begin
MUX2to1_p : process (Sel, A, B)
begin
if (Sel = '1') then
Z <= A;
else
Z <= B;
end if; -- note that *end if* is two words
end process;
end behavior;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Com_Connect is port(
clk_50mhz : in std_logic;
btn_one : in std_logic;
green_led : out std_logic
);
end Com_Connect;
Architecture behaviour of Com_Connect is
component PLL
port(
clk : in std_logic;
y : out std_logic;
x : out std_logic
);
end component PLL;
component MUX2to1
port(
A : in std_logic;
B : in std_logic;
Sel : in std_logic;
Z : out std_logic
);
end component MUX2to1;
signal wire_one, wire_two : std_logic;
begin
PLL1 :PLL port map (
clk => Clk_50mhz,
y => wire_one,
x => wire_two
);
MUX2to1_1 : MUX2to1 port map (
A => wire_two,
B => wire_one,
Sel => btn_one,
Z => green_led
);
end;
虽然这没有错误,但它不起作用(没有任何反应,没有LED点亮,模拟是空白等),它确实有几个警告,如
警告(15714):某些引脚的I / O分配不完整。有关详细信息,请参阅I / O分配警告报告
严重警告(332148):未达到时间要求
第一个我不明白,因为它指的是我知道我已经在引脚分配模块中映射的LED。 第二个对我来说有点神秘,仍然试图弄明白。有没有人有任何网站推荐或书籍可以帮助我更好地掌握这些基础知识?
干杯!
答案 0 :(得分:1)
每个process
中的第一个语句应为if rising_edge (clk)
,以便该进程中的所有内容都被视为注册。如果没有这个,你就告诉FPGA软件将内容视为组合逻辑或锁存器。
以下概述了FPGA软件用来决定是生成寄存器,锁存器还是组合逻辑的规则:
注册:流程中的每个分配仅在时钟边缘触发(例如if rising_edge (clk)
)。
组合逻辑:进程始终分配给它的所有输出。输入不包括任何时钟信号。
锁存:其他任何东西,例如一个信号并不总是被分配。
通常你应该避免产生锁存器的代码。它们不能很好地工作(如果有的话)。您的LED
输出是由锁存器生成的,因为它并不总是被分配。
答案 1 :(得分:1)
您的修改完全改变了问题。请不要再这样做了。 你现在似乎总体思路正确,但仍然存在一些问题。
首先,你没有展示你的mux和pll组件的实现,虽然我可以根据他们的名字猜测他们做了什么。您看到多个驱动程序的原因是因为您的组件与您的进程执行相同的操作,并且组件和进程都在尝试驱动慢速时钟和LED输出。删除你的组件;仅这些过程就足够了。
多路复用器进程中使用的信号名称与其他地方使用的信号名称不匹配。
你的“1Hz”时钟将以2Hz运行。 慢速时钟的占空比为1:12-25百万,因为在整个慢速时段内,只有慢速时钟在单个50MHz周期内变高。您需要1:1或50%的占空比。您可以通过在计数器到期时切换慢速时钟来实现这一点。请注意,这也将使频率减半,因此1Hz时钟实际上是1Hz,但4Hz将变为2Hz。
如果您更改为切换并希望它在模拟中工作,则需要设置默认值,或定义重置行为并在模拟中重置。你应该模拟你写的一切!
编辑:跟进您的更新:
我也有一些非常错误的错误:
PLL
的组件不是PLL,它只是一个时钟分频器。
更确切地说,它是一个柜台。大多数FPGA,除了实际
锁相环,具有与之类似的时钟分频器
织物内的计数器,但经过加固可以更快地运行并连接到
高速时钟所需的专用时钟路由。 Com_Connect
架构是
虽然你的名字是在结构上写的,但不是行为上的
behaviour
。