verilog拼接符的用法
在Verilog HDL语言有一个特殊的运算符:位拼接运算符{},用这个运算符可以把两个或多个信号的某些位拼接起来进行运算操作。其使用方法如下:
即把某些倍号的某些位详细地列出来,中间用逗号分开,最后用大括号括起来表示一个整体信号,例如:
也可以写成为:
在位拼接表达式中不允许存在没有指明位数的信号。这是因为在计算拼接信号的位宽的大小时必需知道其中每个信号的位宽。
位拼接也可以用重复法来简化表达式,如下所示:
位拼接还可以用嵌套的方式来表达,如下所示:
【拓展资料】
Verilog HDL的语言的运算符的范围很广,按照其功能大概可以分为以下几类:
(1)算术运算符 +,-,*,/,%
(2)赋值运算符 =,<=
(3)关系运算符> ,<,>=,<=
(4)逻辑运算符 &&, ||, !
(5)条件运算符 ?:
(6)位运算符 ~, | , ^ ,& ,^~
(7)移位运算符 << ,>>
(8)拼接运算符 {}
(9)其他。
1)基本的算术运算符:加减乘都比较简单这里不再记录。
在进行整数的除法运算时,结果要略去小数部分,只取整数部分;而进行取模运算时(%,亦称作求余运算符)结果的符号位采用模运算符中第一个操作数的符号。
-10%3 结果 -1 11%-3 结果为2
注意:在进行算术运算时,如果某一个操作数有不确定的值x,则整个结果也为不确定值x。
2)位运算符:
按位取反~ 、按位与 & 、按位或 | 、按位异或 ^ 、按位同或 ^~
在不同长度的数据进行位运算时,系统会自动的将两个数右端对齐,位数少的操作数会在相应的高位补0,一时的两个操作数按位进行操作。
3)逻辑运算符:
逻辑与 &&、逻辑或 ||、逻辑非 !
其中&&和||是双目运算符,其优先级别低于关系运算符,而 !高于算术运算符。
4)关系运算符
< 、 > 、 <= 、 >= 如果关系运算是假的,则返回值是0,如果声明的关系是真的,则返回值是1。 关系运算符的优先级别低于算数运算符。
如: a<size-1 //这种表达方式与下面的表达方式相同
a<(size-1) //
size-1<a //这种表达方式与下面的表达方式不同
size-(1<a) //
5)等式运算符
== 、!= 、===、!== 符号之间不能有空格。
“==”和“!=”称作逻辑等式运算符,其结果由两个操作数的值决定。由于操作数可能是x或z,其结果可能为x;
“===”和“!==”常用于case表达式的判别,又称作cae等式运算符。其结果只为0和1.如果操作数中存在x和z,那么操作数必须完全相同结果才为1,否则为0.
逻辑等式运算符和case等式运算符的区别:
6)移位运算符
<< 、 >> a>>n其中a代表要进行移位的操作数,n代表要移几位。这两种移位运算都用0来填补移出的空位。
如果操作数已经定义了位宽,则进行移位后操作数改变,但是其位宽不变。
/*不懂之处;(夏宇闻第三版,p41)
4'b1001<<1=5'b10010; 4'b1001<<2=6'b100100; (左移会使得位数增加?)
1<<6=32'b1000000; 4'b1001>>1=4'b0100; (右移不会改变位数?)
4‘b1001>>4=4'b0000;
*/
7)位拼接运算符
{信号1的某几位,信号2的某几位,......信号n的某几位} 将某些信号的某些为列出来,中间用逗号分开,最后用大括号括起来表示一个整体的信号。
在位拼接的表达式中不允许存在没有指明位数的信号。
{a,b[3:0],w,3'b101} //等同于{a,b[3],b[2],b[1],b[0],w,1b'1,1'b0,1'b1}
{4{w}} //等同于{w,w,w,w}
{b,{3{a,b}}} //等同于{b,a,b,a,b,a,b} 这里面的3、4必须是常量表达式。
8)缩减运算符
这是单目运算符,也包括与、或、非运算。运算规则与位运算相似,不过是对单个运算符的每一位逐步运算,最后的运算结果是一位的二进制数。
c=&B; //意思同c=((B[0]&B[1]) &B[2] ) & B[3];
绛旓細鍦Verilog HDL璇█鏈変竴涓壒娈婄殑杩愮畻绗︼細浣鎷兼帴杩愮畻绗}锛岀敤杩欎釜杩愮畻绗﹀彲浠ユ妸涓や釜鎴栧涓俊鍙风殑鏌愪簺浣嶆嫾鎺ヨ捣鏉ヨ繘琛岃繍绠楁搷浣溿傚叾浣跨敤鏂规硶濡備笅:鍗虫妸鏌愪簺鍊嶅彿鐨勬煇浜涗綅璇︾粏鍦板垪鍑烘潵锛屼腑闂寸敤閫楀彿鍒嗗紑锛屾渶鍚庣敤澶ф嫭鍙锋嫭璧锋潵琛ㄧず涓涓暣浣撲俊鍙凤紝渚嬪锛氫篃鍙互鍐欐垚涓猴細鍦ㄤ綅鎷兼帴琛ㄨ揪寮忎腑涓嶅厑璁稿瓨鍦ㄦ病鏈夋寚鏄庝綅鏁扮殑淇″彿銆...
绛旓細鎷兼帴鎷兼帴鍢涳紝灏辨槸鎷艰捣鏉ョ敤銆倇cout,sum}鍏跺疄鐩稿綋浜庝竴涓俊鍙稾锛屽畠鐨勪綅瀹芥槸cout鍜宻um鐨勪綅瀹戒箣鍜屻俰na+inb+inc鍜岀殑浣嶅鍏跺疄鏄疿锛屼絾鏄粬涓轰簡鐩磋鐨勯槓杩癤鐨勫惈涔夛紝鎵浠ョ敤cout锛宻um鎷艰捣鏉ワ紝杩欐牱浣犲氨鐭ラ亾浜哫鐨勫惈涔夋槸sum鍜岃繘浣
绛旓細{coef[cwidth-1]}杩欓噷鏄彇浜哻odf鐨勬煇涓浣嶏紝cwidth-1鑳界畻鍑轰竴涓兼潵鍚с倇(mwidth-cwidth){coef[cwidth-1]}}杩欓噷鏄coef涓殑閭d竴浣嶈繘琛屼簡mwidth-cwidth娆$殑閲嶅 鏈鍚庡湪鎷兼帴coef鐨勬墍鏈変綅 鍏跺疄浣犵敤$display鐪嬬湅缁撴灉灏辩煡閬撲簡
绛旓細澶ф嫭鍙锋槸甯歌鐨勬爣鐐圭鍙凤紝鍦ㄦ暟瀛﹂噷琛ㄧず鏌愪簺杩愮畻瑕佷紭鍏堣繘琛岋紝濡傛灉涓涓畻寮忛噷鏃㈡湁灏忔嫭鍙枫佷腑鎷彿锛屽張鏈夊ぇ鎷彿锛屾垜浠緱鍏堢畻灏忔嫭鍙烽噷闈㈢殑锛屽啀绠椾腑鎷彿閲岄潰鐨勶紝鏈鍚庣畻澶ф嫭鍙烽噷闈㈢殑銆傚笇鏈涙垜鑳藉府鍔╀綘瑙g枒閲婃儜銆
绛旓細澶ф嫭鍙锋槸涓涓鎷兼帴杩愮畻绗︼紝鍥犳杩欐潯璇彞鐨勫惈涔夊氨鏄皢1bit鐨0鍜宎杩涜鎷兼帴銆傚亣璁綼鐨勫兼槸4'b1001锛岄偅涔堢粡杩噞1'b0,a}涔嬪悗灏卞彉鎴愪簡5'0_1001锛屼綅瀹藉彉鎴5姣旂壒浜嗐
绛旓細杩欎釜鏄綅鎷兼帴 {a,b}='b1001銆傚嵆鎶婃煇浜涘嶅彿鐨勬煇浜涗綅璇︾粏鍦板垪鍑烘潵锛屼腑闂寸敤閫楀彿鍒嗗紑锛屾渶鍚庣敤澶ф嫭鍙锋嫭璧锋潵琛ㄧず涓涓暣浣撲俊鍙凤紝鍦ㄤ綅鎷兼帴琛ㄨ揪寮忎腑涓嶅厑璁稿瓨鍦ㄦ病鏈夋寚鏄庝綅鏁扮殑淇″彿銆傝繖鏄洜涓哄湪璁$畻鎷兼帴淇″彿鐨勪綅瀹界殑澶у皬鏃跺繀闇鐭ラ亾鍏朵腑姣忎釜淇″彿鐨勪綅瀹姐
绛旓細{ 锛 锛 锛 }锛鎷兼帴绗鍙 {{}}锛氬鍒 锛氭骞 锛燂細 锛氭潯浠堕敊鍋氱 +锛氬姞 -锛氬噺 :涔 /锛氶櫎 锛氬彇妯°傛ā杩愮畻涓紝鍙栫涓涓暟鐨勭鍙枫4.鍏抽敭瀛 module :妯″潡 input锛氳緭鍏ヤ俊鍙 output:杈撳嚭淇″彿 inout锛氬弻鍚戠鍙 begin:璧峰 end:缁撴潫 edge:杈规部 posedge:涓婂崌娌 negedge锛氫笅...
绛旓細鐢鎷兼帴鎿嶄綔绗︼經锛岋綕 姣斿reg锛7:0锛絘;a=锝沘锛3:0锛,a锛7:4锛斤綕 灏辨槸鎶婇珮鍥涗綅鍜屼綆鍦颁綅浜ゆ崲浣嶇疆鍐嶆嫾鎺ヨ捣鏉
绛旓細杩欎釜鐩稿綋浜鎷兼帴 浣嶆暟 鐨勬嫾鎺 渚嬪 7 downto 0 鍙嫾鎺ユ垚 9 downto 0
绛旓細寰堢畝鍗曞晩锛屽ぇ鎷彿鍐呮槸涓涓鎷兼帴鏁版嵁锛屾暟鎹綅鏁版槸鎷彿鍐呮暟鎹綅鏁颁箣鍜岋紝浠庡乏鍒板彸锛屼緷娆′粠楂樹綅鍒颁綆浣嶆帓鍒楋紱涓嬮潰鐨勫紡瀛愯〃绀烘暟鎹殑楂樺叓浣嶅拰浣庡叓浣嶇浉鍔犺祴缁欏叾浠栦俊鍙