verilog中右移位会自动扩占位数吗 基于verilog 带符号数右移是怎么实现的

verilog\u79fb\u4f4d

<<\u548c<<<\u6ca1\u533a\u522b \u90fd\u662f\u8865\u96f6 \u770b\u8d77\u6765<<<\u6ca1\u6709\u4efb\u4f55\u7528\u5904

>>\u548c>>>\u4e0d\u4e00\u6837 >>\u662f\u903b\u8f91\u53f3\u79fb \u8865\u96f6 >>>\u662f\u7b97\u6570\u53f3\u79fb \u6839\u636e\u6570\u636e\u662f\u6709\u7b26\u53f7\u6216\u65e0\u7b26\u53f7\u7c7b\u578b\u5224\u65ad\u8865\u7b26\u53f7\u4f4d\u6216\u96f6

\u5177\u4f53\u8981\u6c42\u662f\u4ec0\u4e48\uff1f

always @(posedge clk or negedge rst_n)
if (!rst_n)
shift_reg <= {DW{1'b0}}
else if (shift_en)
shift_reg <= {shift_reg[DW-1], shift_reg[DW-1:1]}

看你的代码只能是1bit。如果要扩展到8位 加一个+8‘b0,或者你用concat来做:
value<= {c2>b2, c3>b2, b3>b2, a3>b2, a2>b2, a1>b2, b1>b2, c1>b2};

建议你看看verilog标准关于bit padding和self determined部分的讲解。

其中对于位移运算符的self determined规则是和第一参数相关。
假定a是4个bit的,b是8个bit的。a << b只和a的长度相关,和b无关。这里由a的长度决定最终的位宽,这个规则就叫self determined。

对于加法运算符的bit padding规则则是和最长操作数长度相关,不够长度的补足长度。
假定a是4个bit的,b是8个bit的。a+b结果是8个bit的。要对a做bit padding到8。

那么对于 (a << b) + c怎么判断bit padding呢?

首先确定a的长度,那么a << b的长度就可以确定了等于a的长度。然后确定c的长度。如果c的长度比a的长度小,那么对c做bit padding,扩展到和a一样长。如果c的长度比a的长度大,那么意味着要扩展a<<b的长度,而扩展a<<b的长度就意味着要扩展a的长度,也就意味着要把a扩展到和c一样长。

要特别注意的是,在verilog中对于有符号数和无符号数的扩展方式还有差别。

建议写代码的人还是把位对其来写比较科学。这样的问题一般是做工具的人才需要处理的。

  • Verilog-1995鍜verilog-2001鐨勫尯鍒拰鏀硅繘
    绛旓細10銆佽嚜鍔ㄥ搴︽墿灞 Verilog鈥1995涓浜庝笉鎸囧畾浣嶆暟鐨勪綅瀹借秴杩32涓虹殑鎬荤嚎璧嬮珮闃绘椂锛屽彧浼氬浣32浣嶈祴鍊间负楂橀樆锛岄珮浣嶅皢涓0銆俈erilog鈥2001灏嗛珮闃绘垨涓嶅畾鎬佽祴鍊肩粰鏈寚瀹氫綅瀹界殑淇″彿鏃讹紝鍙互鑷姩鎵╁睍鍒版暣涓綅瀹借寖鍥淬11銆佸父鏁板嚱鏁 Verilog璇硶瑙勫畾蹇呴』浣跨敤鏁板兼垨甯告暟琛ㄨ揪寮忔潵瀹氫箟鍚戦噺鐨勪綅瀹藉拰闃靛垪鐨勮妯°俈erilog鈥1995...
  • verilog涓鐨刱c<={kc[0],kc[3:1]}鎰忔濇槸浠涔
    绛旓細鏄繛鎺c[0]鍜宬c[3:1]锛屼緥濡傦細kc=4鈥榖1110锛岄偅涔堜箣鍚巏c=4'b0111
  • verilog宸绉婧㈠嚭,姣斿璇翠竴涓叓浣鐨瀵勫瓨鍣ㄥ彉閲廰,鎵цa<<8浼氭孩鍑轰箞?
    绛旓細鍗拌薄涓瘡绉讳綅涓娆★紝浣庝綅鑷姩琛0锛屾墍浠ュ乏绉8浣嶅悗锛屽簲璇灏鍙樹负8鈥榖00000000浜嗗惂锛屼竴骞村娌$敤杩verilog浜 鎶辨瓑锛屼笉鑳借偗瀹氬垎鏋愭槸瀵圭殑銆
  • 銆Verilog缂栫▼銆戠嚎鎬у弽棣绉讳綅瀵勫瓨鍣(LFSR)鍘熺悊鍙奦erilog浠g爜瀹炵幇_鐧 ...
    绛旓細鐗瑰緛澶氶」寮忥紝濡俓(f(x)\)锛屽垯鎻ず浜嗘娊澶寸殑璁捐锛屽畠鍦ㄦ帶鍒绉讳綅杩囩▼涓暟鎹殑鍙嶉鏂瑰紡銆傛枑娉㈤偅濂慙FSR鏄竴绉嶇壒娈婄殑LFSR锛屼互钁楀悕鐨勬暟瀛﹀簭鍒楀懡鍚嶏紝鍏剁姸鎬佽浆绉昏寰嬪熀浜庣壒瀹氱殑鎶藉ご椤哄簭銆備緥濡傦紝涓夌骇鏂愭尝閭eLFSR鐨勫弽棣堝嚱鏁颁负011锛岃繖鎰忓懗鐫姣忎釜鏃堕挓鍛ㄦ湡锛屾渶鍙宠竟鐨浣嶄細琚Щ鍑猴紝鐒跺悗鏍规嵁鍙嶉閫昏緫杩涗綅銆傝繖绉峀FSR鐨勫懆鏈熶负7...
  • 鐢Verilog璁捐涓涓绉讳綅瀵勫瓨鍣(涓嬮潰鏄姹) 璺眰浠g爜
    绛旓細50鍒嗚浜虹粰浣犲啓浠g爜銆傚彲鑳藉悧锛熻繖鍦ㄥ闈㈤兘鏄粰閽辫浜哄啓鐨勩傜畻娉曞緢绠鍗曪細4浣嶅瘎瀛樺櫒涓轰緥 锛 data{ data[2:0],1'b0 };涓嶆柇杩唬锛屾湯浣嶈ˉ0鍗冲彲銆
  • 鐢Verilog HDL缂栫▼璁捐8浣嶅乏鍙崇Щ绉讳綅瀵勫瓨鍣ㄧ數璺
    绛旓細module Verilog1(clk,ldn,k,d,q);input clk,ldn,k;input [7:0] d;output [7:0] q;reg[7:0] d_reg,q_reg;always@(negedge ldn)if(!ldn)d_reg <= d;always@(posedge clk )begin if(k)begin//right q_reg[7:0] <= {1'b00,d_reg[7:1]};end else q_reg[7:0] <= ...
  • verilog 鏂版墜鐨勪竴涓枒闂---鍏充簬涓涓畝鍗曠▼搴忕殑RTL鍥
    绛旓細`timescale 1ns / 1ps module shiftreg(input clk,input datai,output datao );reg [0:4]regs;//濡傛灉杩欓噷鏀规垚reg[0:4],閭d綘鐨刣atai鍜宒atao灏辫鏀癸紝涓や釜宸埆鍙槸宸︾Щ鍜鍙崇Щ鐨闂锛屼綘鐨刦or寰幆鎰忔濇槸灏唕eg[楂樹綅]<=reg[浣庝綅],鎵浠ユ鏃朵綘灏卞簲璇ヨregs[4]<=datai;assign datao=regs[0];int...
  • verilog缁勫悎閫昏緫绉讳綅璧嬪16浣,楂8浣嶄涪澶鐨鍘熷洜?
    绛旓細鍦Verilog涓锛岀粍鍚堥昏緫绉讳綅璧嬪兼椂锛屽鏋滀娇鐢ㄧ殑鏄16浣嶇殑璧嬪兼搷浣滅锛堜緥濡"="锛夛紝鑰岀洰鏍囧彉閲忓彧鏈8浣嶇殑瀹藉害锛岄偅涔堥珮8浣嶄細涓㈠け鏄洜涓篤erilog浼氳嚜鍔鎴柇鐩爣鍙橀噺鐨勮祴鍊肩粨鏋滐紝浠ラ傚簲鐩爣鍙橀噺鐨勫搴︺備緥濡傦紝濡傛灉鏈変互涓嬩唬鐮侊細```verilog reg [7:0] target_var;reg [15:0] source_var;assign target_var = ...
  • 甯垜鐪嬬湅杩欐Verilog 缂栫▼閿欒鍦ㄥ摢
    绛旓細棣栧厛, output蹇呴』鏄痳eg绫诲瀷. 涔熷氨鏄, 鍦╫utput [9..0] 閭h涓嬮潰鍔犱笂:reg [9:0] led_eight;
  • 鐢Verilog HDL缂栫▼璁捐8浣嶅乏鍙崇Щ绉讳綅瀵勫瓨鍣ㄧ數璺
    绛旓細module shift_reg8(clk, ldn, d, k, q)input clk;input ldn, k;input [7:0]d;output [7:0]q;always@(posedge clk or ldn)begin if(ldn == 1'b0)q <= d;else if(k == 1'b0)q <= {q[6:0], 1'b0};else q <= {1'b0, q[7:1]};end endmodle ...
  • 扩展阅读:算术移位怎么移 ... 双向移位寄存器verilog ... verilog循环左移 ... verilog循环移位运算符 ... verilog三目运算符 ... verilog中左移 ... 逻辑移位和循环移位的区别 ... d触发器verilog代码 ... 对阶时的移位是算术移位吗 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网