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