vhdl - 如何在表达式中将 std_logic 转换为无符号
问题描述
因此,如果想将 std_logic 分配给 1-bit usnigned 我可以写...
signal X : unsigned(0 downto 0);
signal Y : std_logic;
X(0) <= unsigned(Y)
但是,在表达式中使用时,将 std_logic 转换为无符号的最佳方法是什么。也就是说,无需直接对无符号类型的信号进行赋值。
我的情况是这样的。我有两个标志 A 和 B,它们是 std_logic 类型的信号。每个标志都有一个 std_logic 类型的选通脉冲 (A_valid , B_valid),每次它们的标志 (A , B) 有效时断言 1 个时钟周期。我有一个计数器(CNT),它是一个无符号类型的信号,它必须计算任何一个标志为“1”的次数。在任何给定的时钟周期上,我必须将 CNT 增加 0、1 或 2,具体取决于有多少个标志是 1。
这是使用“if”语句的直接方式。
signal A : std_logic;
signal A_valid : std_logic;
signal B : std_logic;
signal B_valid : std_logic;
signal CNT : unsigned;
if rising_edge(clk) then
if (A and A_valid and B and B_valid) = '1' then
CNT <= CNT + 2;
elsif (A and A_valid) = '1' then
CNT <= CNT + 1;
elsif (B and B_valid) = '1' then
CNT <= CNT + 1;
end if;
end if;
上面代码的问题在于它不能很好地概括,因为案例的数量随着标志的数量呈指数增长。例如,如果我有 5 个标志,我将不得不在 IF 语句中写出 32 个分支。
使用聚合和类型标记表示同一事物的一种更紧凑的方式是......这更好,因为我只为每个标志编写一个表达式。
if rising_edge(clk) then
CNT <= CNT + unsigned'(0=> A AND A_valid) + unsigned'(0=> B AND B_valid);
end if;
是否有任何其他内置方法(除了编写函数)将 std_logic 转换为 VHDL 表达式中的无符号?
解决方案
最简单的方法是将 std_logic 与一个空数组连接起来,产生一个长度为 1 的数组。
Cnt <= cnt + ("" & a_valid);
它应该能够从上下文中计算出类型,否则您可能需要使用 unsigned 来限定它
推荐阅读
- php - 管理员用户登录使用 2 个表 PhP
- java - Tensorflow android demo issue using bazel "cannot find symbol class Fill where T is a type-variable: T extends Object declared in class Zeros"
- google-apps-script - How to Update duplicate row in Google Script
- admob - cocos2dx sdkbox:如何为 GDPR 关闭个性化广告
- ios - iOS Push Notification Programming - 有没有办法通过编程禁用 iPhone 上的推送通知
- java - 为什么我打印出来的 int[] 数组被截断了?
- intellij-idea - 无法在 IntelliJ 中使用 PlantUML 渲染组件图
- python - Multi-Groupby(迭代或应用函数)
- html - 我已经使用了 3 个按钮,一个用于一周,一个用于一个月,一个用于一天,如果单击一周按钮,应该禁用日和月
- sql-server - 带有“Go”语句的事务/回滚的 Sql 脚本