在VHDL中使用SB_RGBA_DRV原语
我在使用为Lattice ICE40UP fpga提供的SB_RGBA_DRV原语时遇到问题。 技术库提供了一个我开始使用的verilog示例,但当我尝试在VHDL中使用它时,P&R失败,输出以下消息: 错误:非法连接:类型为“SB_RGBA_DRV”的实例“myrgb”的插脚“RGB2”应仅连接到一个顶部模块端口。它连接到以下端子: LED2_obuf/DOUT0 这是我的.vhdl文件:在VHDL中使用SB_RGBA_DRV原语,vhdl,ice40,Vhdl,Ice40,我在使用为Lattice ICE40UP fpga提供的SB_RGBA_DRV原语时遇到问题。 技术库提供了一个我开始使用的verilog示例,但当我尝试在VHDL中使用它时,P&R失败,输出以下消息: 错误:非法连接:类型为“SB_RGBA_DRV”的实例“myrgb”的插脚“RGB2”应仅连接到一个顶部模块端口。它连接到以下端子: LED2_obuf/DOUT0 这是我的.vhdl文件: library ieee; use ieee.std_logic_1164.all; entity l
library ieee;
use ieee.std_logic_1164.all;
entity led is
port (
LED0 : out std_logic;
LED1 : out std_logic;
LED2 : out std_logic
);
end entity led;
architecture rtl of led is
component SB_HFOSC is
port (
CLKHFEN : in std_logic;
CLKHFPU : in std_logic;
CLKHF : out std_logic
);
end component;
component SB_RGBA_DRV is
generic (
RGB0_CURRENT: string:="0b000000";
RGB1_CURRENT: string:="0b000000";
RGB2_CURRENT: string:="0b000000"
);
port (
RGBPU : in std_logic;
RGBLEDEN : in std_logic;
RGB0PWM : in std_logic;
RGB1PWM : in std_logic;
RGB2PWM : in std_logic;
RGB0 : out std_logic;
RGB1 : out std_logic;
RGB2 : out std_logic
);
end component;
signal int_osc : std_logic;
begin
myosc : SB_HFOSC
PORT MAP (
CLKHFEN => '1',
CLKHFPU => '1',
CLKHF => int_osc
);
myrgb : SB_RGBA_DRV
GENERIC MAP (
RGB0_CURRENT => "0b111111",
RGB1_CURRENT => "0b111111",
RGB2_CURRENT => "0b111111"
)
PORT MAP (
RGBPU => '1',
RGBLEDEN => '1',
RGB0PWM => '1',
RGB1PWM => '1',
RGB2PWM => '1',
RGB0 => LED0,
RGB1 => LED1,
RGB2 => LED2
);
process
begin
wait until int_osc'event;
end process;
end rtl;
你的问题的答案如下: (向下滚动)是的,它是俄语的。关键是在设计文件顶部添加以下声明:
library sb_ice40_components_syn;
use sb_ice40_components_syn.components.all;
Teplofizik提到的其他事情可能有助于了解,但并非完全必要
通过上述添加,您的代码几乎是正确的。我没有尝试构建和运行Teplofizik的示例代码,但我确实修改了您的代码(以实际使用片上振荡器),并且该代码正在“iCE40UP突破”板上愉快地运行:
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
库sb_ice40_组件\u syn;
使用sb_ice40_components_syn.components.all;
实体led是
港口(
LED0:输出标准逻辑;
LED1:输出标准逻辑;
LED2:输出标准逻辑
);
终端实体主导;
led的rtl体系结构
--不需要-在库中声明
--组件SB_HFOSC为
--港口(
--CLKHFEN:标准逻辑;
--CLKHFPU:标准逻辑中;
--CLKHF:输出标准逻辑
-- );
--端部元件;
--
--组件SB_RGBA_DRV为
--一般的(
--RGB0_当前:字符串:=“0b000000”;
--RGB1_当前:字符串:=“0b000000”;
--RGB2_当前:字符串:=“0b000000”
-- );
--港口(
--RGBPU:标准逻辑中;
--RGBLEDEN:标准逻辑;
--RGB0PWM:标准_逻辑中;
--RGB1PWM:标准_逻辑中;
--RGB2PWM:标准_逻辑中;
--RGB0:输出标准逻辑;
--RGB1:输出标准逻辑;
--RGB2:输出标准逻辑
-- );
--端部元件;
信号输入osc:标准逻辑;
信号计数:无符号(25到0);
信号led0_en:std_逻辑;
信号led1_en:标准逻辑;
信号led2_en:标准逻辑;
开始
myosc:SB_HFOSC
通用地图(
CLKHF_DIV=>“0b00”--00=48兆赫,01=24兆赫,10=12兆赫,11=6兆赫
)
港口地图(
CLKHFEN=>“1”,
CLKHFPU=>“1”,
CLKHF=>int_osc
);
myrgb:SB_RGBA_DRV
通用地图(
--RGB0_当前=>“0b111111”,
--RGB1_当前=>“0b111111”,
--RGB2_电流=>“0b111111”
电流模式=>“0b0”,--0=全电流,1=电流减半
RGB0_电流=>“0b000001”--4 mA就足够了
RGB1_电流=>“0b000001”,
RGB2_电流=>“0b000001”
)
港口地图(
--RGBPU=>'1',--这是一个SB_RGB_DRV参数
CURREN=>“1”,
RGBLEDEN=>“1”,
--RGB0PWM=>1',--镗孔
--RGB1PWM=>“1”,
--RGB2PWM=>“1”,
RGB0PWM=>led0_en,
RGB1PWM=>led1_en,
RGB2PWM=>led2_en,
RGB0=>LED0,
RGB1=>LED1,
RGB2=>LED2
);
--无聊的
--过程
--开始
--等待国际osc事件;
--结束过程;
--循环通过LED
这是你的顶级模块吗?您的约束文件中有什么?从随意读取的LED0、LED1、LED2应在引脚约束编辑器中设置为IO标准SB_RGBA_DRV。您应该能够比较Verilog和VHDL版本之间的pin约束。这些物理管脚的默认值为SB_OUT_OD。使用此库(Radiant,Synplify Pro)时,我发现错误(VHDL-1240)“components”未在库“SB_ice40_components_syn”中编译。这篇文章(link已经死了,这里是)提到了一些关于它不能与Synplify一起使用的东西,所以我尝试了与LSE一起使用,没有库,并且它可以工作。振荡器的名称为hsosc
,rgb驱动程序为rgb
(无SB前缀)。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library sb_ice40_components_syn;
use sb_ice40_components_syn.components.all;
entity led is
port (
LED0 : out std_logic;
LED1 : out std_logic;
LED2 : out std_logic
);
end entity led;
architecture rtl of led is
-- not necessary - declared in library
--component SB_HFOSC is
-- port (
-- CLKHFEN : in std_logic;
-- CLKHFPU : in std_logic;
-- CLKHF : out std_logic
-- );
--end component;
--
--component SB_RGBA_DRV is
-- generic (
-- RGB0_CURRENT: string:="0b000000";
-- RGB1_CURRENT: string:="0b000000";
-- RGB2_CURRENT: string:="0b000000"
-- );
-- port (
-- RGBPU : in std_logic;
-- RGBLEDEN : in std_logic;
-- RGB0PWM : in std_logic;
-- RGB1PWM : in std_logic;
-- RGB2PWM : in std_logic;
-- RGB0 : out std_logic;
-- RGB1 : out std_logic;
-- RGB2 : out std_logic
-- );
--end component;
signal int_osc : std_logic;
signal count: unsigned(25 downto 0);
signal led0_en: std_logic;
signal led1_en: std_logic;
signal led2_en: std_logic;
begin
myosc : SB_HFOSC
generic map(
CLKHF_DIV => "0b00" -- 00 = 48 MHz, 01 = 24 MHz, 10 = 12 MHZ, 11 = 6 MHz
)
PORT MAP (
CLKHFEN => '1',
CLKHFPU => '1',
CLKHF => int_osc
);
myrgb : SB_RGBA_DRV
GENERIC MAP (
-- RGB0_CURRENT => "0b111111",
-- RGB1_CURRENT => "0b111111",
-- RGB2_CURRENT => "0b111111"
CURRENT_MODE => "0b0", -- 0 = full current, 1 = halve the current
RGB0_CURRENT => "0b000001", -- 4 mA is more than enough
RGB1_CURRENT => "0b000001",
RGB2_CURRENT => "0b000001"
)
PORT MAP (
-- RGBPU => '1', -- this is an SB_RGB_DRV parameter
CURREN => '1',
RGBLEDEN => '1',
-- RGB0PWM => '1', -- boring
-- RGB1PWM => '1',
-- RGB2PWM => '1',
RGB0PWM => led0_en,
RGB1PWM => led1_en,
RGB2PWM => led2_en,
RGB0 => LED0,
RGB1 => LED1,
RGB2 => LED2
);
-- boring
--process
-- begin
-- wait until int_osc'event;
--end process;
-- cycle through LED's
led0_en <= count(25) and count(24);
led1_en <= count(25) and not count(24);
led2_en <= not count(25) and count(24);
count_proc: process(int_osc)
begin
if rising_edge(int_osc) then
count <= count+1;
end if;
end process;
end rtl;