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。

 

 

 

 

 

 

 

博主的微信公众号: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编程艺术

上一篇:VHDL中信号与变量的区别及赋值的讨论


下一篇:VHDL硬件描述语言学习笔记(三)