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程式設計藝術