不枉初心,砥砺前行

皮皮祥的博客

欢迎留言,评论

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

VHDL与verilog中移位运算

 【4楼】 lishantian
为什么不能被综合啊?

VHDL的类型限定过于强,以至于很多时候出问题都是类型错误……

VHDL语言本身的这几个运算符是对bitvector定义的,而我们一般都用std_logic_vector,
这样就很导致一般不能编译通过。

而更不爽的是ieee.numeric_bit或者numeric_std包中都有重载sll之类,但是很讨厌的是
他们都是对signed/unsigned定义,没办法,
要是想给std_logic_vector用这几个移位运算符(sll, srl, sla, sra, rol, ror)
只得这样:
o <= to_stdlogicvector(to_bitvector(i) sll 1);

呵呵,不想这么麻烦的话,用Verilog吧,尤其是SystemVerilog,用起来舒服多了~

修改:附另一种形式的完成测试程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity test is
        port (
                i: in std_logic_vector (10 downto 0);
                o: out std_logic_vector (10 downto 0)
        );
end entity test;
architecture a of test is begin
        o <= std_logic_vector(unsigned(i) sll 1);
end architecture a;
这个方法的好处是不会丢失X,因为unsigned和signed其实都是std_logic_vector。

 

 

VHDL移位操作符 

VHDL中,移位操作符用来对数据进行移位操作,它们是在VHDL93中引入的。

其语法结构为:

左操作数 移位操作符 右操作数

其中,左操作数必须是BIT_VECTOR类型的,右操作数必须是INTEGER类型(前面可以加正负号)的。

 

VHDL中的移位操作符有以下几种:

sll逻辑左移------数据左移,右端空出来的位置填充'0'

srl逻辑右移------数据右移,左端空出来的位置填充'0'

sla算术左移-------数据左移,同时复制最右端的位,在数据左移操作后填充在右端空出的位置上

sra算术右移-------数据右移,同时复制最左端的位,在数据右移操作后填充在左端空出的位置上

rol循环逻辑左移-----数据左移,同时从左端移出的位依次填充到右端空出的位置上

ror循环逻辑右移------数据右移,同时从右端移出的位依次填充到左端空出的位置上

 

 

 

 

 

博主的微信公众号:FPGA动力联盟

博主的个人微信:fpga_start

博客原文链接:verilog移位与拼接实现

拼接操作的另一个用处就是替代移位操作,它不仅可以代替verilog语言里规定的逻辑移位和算术移位操作,甚至可以完成所谓的循环移位操作,可以说拼接操作用法非常的广泛!

假设被操作数a[7:0]是8bit数据,结果为b,下面给出了一系列的操作例子:

逻辑右移2位

b=(a>>2’d2);//移位操作表示

b={ 2’b00, a[7:2] };//拼接操作表示

逻辑左移2位

b=(a<<2’d2);//移位操作表示

b={ a[5:0], 2’b00 };//拼接操作表示

算术右移2位

b=(a>>>2’d2);//移位操作表示

b={ 2’b00, a[7:2] };//无符号拼接操作表示

b={ { 2{ a[7] } }, a[7:2] };//有符号拼接操作表示

算数左移2位

b=(a<<<2’d2);//移位操作表示

b={ a[5:0], 2’b00 };//拼接操作表示

循环右移2位

移位操作符不可用

b={ a[1:0], a[7:2] };//拼接操作表示

循环左移2位

移位操作符不可用

b={ a[5:0], a[7:6] };//拼接操作表示

参考文献:

1,verilog传奇——从电路出发的HDL代码设计

2,verilog编程艺术

posted on   皮皮祥  阅读(3093)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示