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編程藝術


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM