VHDL 中的数组/STD_LOGIC_VECTOR

Posted

技术标签:

【中文标题】VHDL 中的数组/STD_LOGIC_VECTOR【英文标题】:Array/STD_LOGIC_VECTOR in VHDL 【发布时间】:2020-12-07 16:19:07 【问题描述】:

在我的 BASYS-3 板上,我想使用 4 个开关并根据这些开关的组合输出不同的东西。例如,如果打开开关 12,我希望为信号分配一个值。我设法将我的代码上传到板上,但是当我轻弹开关时,​​显示屏上什么也没有发生。

以下是这段代码的约束文件的一部分:

#Switches
#SW12
set_property -dict  PACKAGE_PIN W2   iosTANDARD LVCMOS33  [get_ports i_SW[0]]
#SW13
set_property -dict  PACKAGE_PIN U1   IOSTANDARD LVCMOS33  [get_ports i_SW[1]]
#SW14
set_property -dict  PACKAGE_PIN T1   IOSTANDARD LVCMOS33  [get_ports i_SW[2]]
#SW15
set_property -dict  PACKAGE_PIN R2   IOSTANDARD LVCMOS33  [get_ports i_SW[3]] 

这就是我在***实体的端口映射中的写法:

i_SW : in STD_LOGIC_VECTOR (3 downto 0)

然后在一个单独的实体中以这种方式调用:

case i_SW is
    when "1000" => -- data select 0
        --doesn't matter ;
        --doesn't matter ;

此代码应该读取开关值并将其存储在 STD_LOGIC_VECTOR 中,然后为 case 语句读取它。例如,如果 SW12 被轻弹,我希望向量保持“1000”,所以它会进入这种情况。

我想知道我是否以不正确的格式编写了这个,还有其他方法可以做到吗? 我是否应该将它存储在一个数组中并在端口映射中声明该数组以便在其他实体中使用?

谢谢

编辑:当我模拟代码时,它显示 i_SW 是“U”,我认为这意味着未初始化,但这可能只是我的测试台的问题。

【问题讨论】:

看来您走在了正确的轨道上。由于“显示器上没有发生任何事情”,首先尝试将固定模式发送到输出,看看是否有效。如果是,则尝试将输入复制到输出,并查看它们在您更改输入时是否响应。只有在您知道输出和输入都正常工作后才能添加您的处理。 嗨,本,感谢您的回复。我没有这么说,因为我认为这并不重要,但现在我认为它可能很重要。当我打开电路板时,显示屏显示 0000,这是我的最后一个案例陈述(如果其他人 => 0000)。这会改变你的答案吗? 我仍然会遵循相同的步骤,首先使用极其简单的 VHDL,以验证您的端口和引脚映射是否按您期望的方式工作。 【参考方案1】:

向量用downto声明,所以元素的顺序是3,2,1,0,"1000"对应的是SW15,不是SW12。

另外,开关可能处于低激活状态,很多开发板都是这样接线的——那么你也必须反转这些值。

【讨论】:

嗨,西蒙,感谢您的回复。您说“1000”对应于 SW15,但是当我插入电路板并一个接一个地打开所有开关以查看是否有任何错误表示时,SW15 对我的显示器的作用与轻弹 SW12 一样。我不相信开关处于低激活状态,但再次感谢您的回复。 The switches are SPDT。无论如何,都有一个“1”的位置和一个“0”的位置。一个更有趣的问题可能是“代码是否模拟?”

以上是关于VHDL 中的数组/STD_LOGIC_VECTOR的主要内容,如果未能解决你的问题,请参考以下文章

将压缩图像转换为 VHDL RGB 数组

在 VHDL 中,如何将输出端口列表分配给数组?

verilog比vhdl的优势是啥?

vhdl如何将vector赋值给logic

VHDL 中的通用时钟分频器

VHDL 中的“std_logic”枚举类型的目的是啥?