不枉初心,砥砺前行

皮皮祥的博客

欢迎留言,评论

导航

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 2021-11-10 15:24  皮皮祥  阅读(2951)  评论(0编辑  收藏  举报