91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Verilog寫法:組合邏輯+時(shí)序邏輯

FPGA之家 ? 來(lái)源:FPGA之家 ? 作者:FPGA之家 ? 2022-07-07 09:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

奇技淫巧我不會(huì),但我這有一些我工作后才學(xué)到的一些Verilog寫法。
數(shù)字電路設(shè)計(jì)主要就是,選擇器、全加器、比較器,幾個(gè)常用邏輯門,再加個(gè)D觸發(fā)器,電路基本都能實(shí)現(xiàn)了。寫代碼其實(shí)是個(gè)體力活,電路和時(shí)序圖應(yīng)該在設(shè)計(jì)階段就已經(jīng)到了你的文檔里或在腦子里沒(méi)來(lái)得及寫出來(lái)。組合邏輯+時(shí)序邏輯

		assign或always@(*)always@(posedge clk or negedge rst_n)
有人說(shuō)掌握Verilog 20%的語(yǔ)法就可以描述 90%以上的電路,說(shuō)的對(duì)。

casez



		always @(*)begin casez(code) 8'b1???_???? : data[2:0] = 3'd7; 8'b01??_???? : data[2:0] = 3'd6; 8'b001?_???? : data[2:0] = 3'd5; 8'b0001_???? : data[2:0] = 3'd4; 8'b0000_1??? : data[2:0] = 3'd3; 8'b0000_01?? : data[2:0] = 3'd2; 8'b0000_001? : data[2:0] = 3'd1; 8'b0000_0001 : data[2:0] = 3'd0; default : data[2:0] = 3'd0; endcaseend這樣的case有優(yōu)先級(jí)選擇,可綜合,實(shí)際項(xiàng)目可以使用,不過(guò)我個(gè)人習(xí)慣上還是,有優(yōu)先用if-else,沒(méi)有直接用case。synopsys的EDA工具有關(guān)于full case與parallel case可以查看下面博客鏈接。https://blog.csdn.net/li_hu/article/details/10336511 

generate+for

合理使用generate+for循環(huán)可以提高編碼效率,同樣的賦值語(yǔ)句需要賦值多次。

		generate genvar i; for(i=0;i<16;i=i+1) begin: neg_data assign neg_data_out[i*DATA_WIDTH +:DATA_WIDTH] =  -data_in[i*DATA_WIDTH +:DATA_WIDTH] endendgenerate
?同一個(gè)模塊需要實(shí)例化多次

		generate  genvar i; for(i=0;i<16;i=i+1) begin: mult_12x12 DW02_mult #( .A_WIDTH(12), .B_WIDTH(12) ) u_DW02_mult0( .A(mult_a[i*12 +:12]), .B(mult_b[i*12 +:12]), .TC(1'b0), .PRODUCT(product[i*24 +:24]) ); endendgenerate
當(dāng)然這樣寫debug會(huì)有一些困擾,Verdi會(huì)顯示每一個(gè)generate塊,選中對(duì)應(yīng)的塊,加進(jìn)去的波形就會(huì)是對(duì)應(yīng)的bit信號(hào)。

generate if/case

做一些通用IP的方法,隨便舉個(gè)例子比如要做一個(gè)選擇器通用IP,支持二選一,三選一,四選一。

		generate if(MUX_NUM == 0)begin : mux4_1 always@(*)begin case(sel[1:0]) 2'b00:data_out = data_in0; 2'b01:data_out = data_in1; 2'b10:data_out = data_in2; default:data_out = data_in3; endcase endend else if(MUX_NUM = 1) begin : mux3_1 always@(*)begin case(sel[1:0]) 2'b00:data_out = data_in0; 2'b01:data_out = data_in1; default:data_out = data_in2; endcase endend else begin : mux2_1 always@(*)begin case(sel[1:0]) 2'b00:data_out = data_in0; default:data_out = data_in1; endcase endend endgenerate
generate case可以寫更多的分支

		generate case(MUX_NUM) 0:begin:mux_2 end 1:begin: mux_3 end 2:begin: mux_4 end default:begin end endcaseend endgenerate
調(diào)用的時(shí)候只需要

		mux #( .MUX_NUM(0))u_mux( ...);

參數(shù)化定義

模塊化設(shè)計(jì),功能模塊的劃分盡可能細(xì),差別不大的代碼通過(guò)參數(shù)化達(dá)到重復(fù)使用的目的。

		always @(*)begin case(sel) CASE0:data_out = data_in0; CASE1:data_out = data_in1; CASE2。。。 default:; endcase end
實(shí)例化

		mux #( .CASE0(8'd11), .CASE1(8'd44) ...)u_mux( ...);

移位操作

對(duì)于移位操作直接用位拼接

		assign data_shift[6:0] = data[4:0] << 2;assign data_shift[7:0] = data[4:0] << shift[1:0];
寫成

		assign data_shift[6:0] = {data[4:0], 2'b0};always @(*)begin case(shift[1:0]) 2'b00: data_shift[7:0] = {3'b0, data[4:0]}; 2'b01: data_shift[7:0] = {2'b0, data[4:0], 1'b0}; 2'b10: data_shift[7:0] = {1'b0, data[4:0], 2'b0}; default:data_shift[7:0] = {data[4:0], 3'b0}; endcaseend
如果是有符號(hào)數(shù),高位要補(bǔ)符號(hào)位。也就是算術(shù)移位。

		always @(*)begin case(shift[1:0]) 2'b00: data_shift[7:0] = {{3{data[4]}}, data[4:0]}; 2'b01: data_shift[7:0] = {{2{data[4]}}, data[4:0], 1'b0}; 2'b10: data_shift[7:0] = {data[4], data[4:0], 2'b0}; default:data_shift[7:0] = {data[4:0], 3'b0}; endcaseend
shift也可能是有符號(hào)數(shù),正數(shù)左移,負(fù)數(shù)右移。右移方法同理。

$clog2系統(tǒng)函數(shù)

Verilog-2005引入了$clog2系統(tǒng)函數(shù),為了方便計(jì)算數(shù)據(jù)位寬,避免位浪費(fèi)。(這個(gè)是拿來(lái)湊字?jǐn)?shù)的)

		parameter DATA_WIDTH = 4,parameter CNT_WIDTH = log2(DATA_WIDTH)parameter CNT_WIDTH = clog2(DATA_WIDTH-1)parameter CNT_WIDTH = $clog2(DATA_WIDTH) reg [DATA_WIDTH-1:0] data_r0; reg [CNT_WIDTH-1:0] cnt; //-------------------------------------------------------//以下兩個(gè)函數(shù)任用一個(gè)//求2的對(duì)數(shù)函數(shù)function integer log2; input integer value; begin value = value-1; for (log2=0; value>0; log2=log2+1) value = value>>1; endendfunction //求2的對(duì)數(shù)函數(shù)function integer clogb2 (input integer bit_depth);begin for(clogb2=0; bit_depth>0; clogb2=clogb2+1) bit_depth = bit_depth>>1;endendfunction

對(duì)齊

tab鍵還是空格鍵?留言區(qū)說(shuō)出你的故事。我把編輯器設(shè)置成tab自動(dòng)替換成4個(gè)空格。 用空格對(duì)齊代碼,提高代碼觀賞性。

		assign signal_b = signal_a;assign data_b = data_a;assign cs_en = 1'b1; assign signal_b = signal_a;assign data_b = data_a;assign cs_en = 1'b1;
第二種寫法更美觀,always塊里面的語(yǔ)句也應(yīng)該對(duì)齊。

命名

給模塊起名字,給信號(hào)起名字,真的很難,但是不管怎樣都不要用拼音,會(huì)遭人鄙視。是的,我見過(guò)!

階梯式assign


		assign data_out[5:0] = data_vld0 ? data0[5:0] : data_vld1 ? data1[5:0] :  data_vld2 ? data2[5:0] :  data_vld3 ? data3[5:0] : 6'b0;
由于if-else和case不能傳播不定態(tài),有的EDA工具有X態(tài)傳播選項(xiàng),可以強(qiáng)行傳播,但是并不是所有的EDA工具都有這個(gè)功能,所以有些書上建議都用組合邏輯用assign。 這種寫法沒(méi)什么問(wèn)題,但是有一點(diǎn),覆蓋率不好收,如果一些情況沒(méi)跑到需要一個(gè)個(gè)分析。覆蓋率會(huì)把數(shù)據(jù)信號(hào)當(dāng)作一個(gè)情況列出來(lái),比如數(shù)據(jù)信號(hào)data沒(méi)出現(xiàn)過(guò)0 的情況,實(shí)際上數(shù)據(jù)信號(hào)沒(méi)出現(xiàn)0的情況是正常的,這就要你一個(gè)一個(gè)的exclude掉。 所以不要寫很長(zhǎng)的assign做選擇器,有優(yōu)先級(jí)用if-else,或根據(jù)具體情況用case。這樣哪一行哪一種情況沒(méi)跑到會(huì)一目了然。當(dāng)然if中的條件太多,覆蓋率也不好收,條件太多組合的情況多,分析起來(lái)繁瑣。如果上述信號(hào)的vld不同時(shí)出現(xiàn)也可以采用這種寫法,減少cell的使用數(shù)量。這樣也是有覆蓋率的問(wèn)題,這只是一種特殊情況,很長(zhǎng)的assign選擇器盡量不要寫。

		assign data_out[5:0] = ({6{data_vld0}} & data0[5:0]) | ({6{data_vld1}} & data1[5:0]) | ({6{data_vld2}} & data2[5:0]) | ({6{data_vld0}} & data3[5:0]);
關(guān)于X態(tài)傳播,一定要注意,帶有reset的寄存器面積和時(shí)序會(huì)稍微差一些,控制通路的寄存器必須帶有復(fù)位,數(shù)據(jù)通路的寄存器可以不帶復(fù)位,但是要注意使用時(shí)如果使用數(shù)據(jù)通路的數(shù)據(jù)去做了控制條件,就必須要復(fù)位,否則如果X態(tài)沒(méi)有查出來(lái),事情就大了。

布線太密的原因

寄存器位寬太大。

		reg [10000-1:0] data;
		這樣寫在功能上沒(méi)什么問(wèn)題,但是如果你之后有對(duì)這個(gè)數(shù)據(jù)做了很多邏輯,可能會(huì)造成后端布線太密,從后端的角度看到其實(shí)cell數(shù)量并不多,就是線比較密,比如說(shuō)這個(gè)數(shù)據(jù)后面再放個(gè)選擇器,或者輸出給其他模塊,就相當(dāng)于一萬(wàn)根線連到很多地方,布線很緊張,如果時(shí)序有問(wèn)題需要繞線,或者需要ECO,做成的可能性很小。
		盡量不要這樣做邏輯,除非對(duì)面積沒(méi)限制,要么最后只能改架構(gòu)。
		第二個(gè)原因是負(fù)載太大。同一個(gè)信號(hào)在很多地方使用,布線也會(huì)變復(fù)雜,比如最常見的是參數(shù)信號(hào),在很多模塊都會(huì)有用到的情況,用寄存器復(fù)制的方法。

		always @(posedge clk or negedge rst_n)begin if(!rst_n)begin data_para0 <= 4'b0; data_para1 <= 4'b0; data_para2 <= 4'b0; end else begin data_para0 <= data_para; data_para1 <= data_para; data_para2 <= data_para;  endend
畫倆圖大概意思一下。這樣每個(gè)寄存器的驅(qū)動(dòng)變少。74509010-fd90-11ec-ba43-dac502259ad0.png745b09be-fd90-11ec-ba43-dac502259ad0.png

有網(wǎng)友提到這樣子寫被綜合掉的概率也是很大。所以就只能在設(shè)計(jì)時(shí)盡量注意負(fù)載的問(wèn)題。

加比選

面積:加法器 > 比較器 > 選擇器乘法器本質(zhì)上也是全加器。所以就有先選后比,先選后加,先選后乘。

		assign sum[4:0] = enable ? (data_a + data_b) : (data_c + data_d); assign add_a[3:0] = enable ? data_a : data_c;assign add_b[3:0] = enable ? data_b : data_d;assign sum[4:0] = add_a + add_b;

畫個(gè)圖意思一下。

7468a222-fd90-11ec-ba43-dac502259ad0.png747363b0-fd90-11ec-ba43-dac502259ad0.png

數(shù)據(jù)通路與控制通路

數(shù)據(jù)通路打拍可以不帶復(fù)位,帶著使能信號(hào)去打拍,減少信號(hào)翻轉(zhuǎn),減少功耗。保證數(shù)據(jù)用的時(shí)候不是X態(tài), 組合邏輯路徑是否需要插入pipeline,插入pipeline的位置需要注意。寄存器能少用就少用。 盡量不要用除法,首先除法器面積更大,除法也會(huì)有余數(shù),余數(shù)是否需要保留就很麻煩。除以常數(shù)可以做成乘以定點(diǎn)常數(shù)的方法。 乘以常數(shù)用移位加,也可直接用*號(hào)。例如a * 2‘d3,工具會(huì)幫你優(yōu)化成 a << 2’d1 + a。甚至可能優(yōu)化得更好。(杠:不要過(guò)度依賴工具)。關(guān)于用移位加還是*號(hào)的問(wèn)題,博主做過(guò)綜合后的面積對(duì)比,相對(duì)來(lái)說(shuō),工具還是優(yōu)化那么一點(diǎn)點(diǎn)。直接用 * 號(hào)吧。 盡量不要用減法,減法要考慮到減翻的問(wèn)題,盡量用加法。

方案設(shè)計(jì)

方案最重要,一個(gè)好的方案往往事半功倍。 狀態(tài)機(jī)設(shè)計(jì)要狀態(tài)明確,一個(gè)狀態(tài)盡量只做一件事情。狀態(tài)機(jī)大法好。 做成IP化設(shè)計(jì),功能分割盡量獨(dú)立并可復(fù)用性,相同的功能用同一塊IP,保證IP的沒(méi)問(wèn)題,最后像搭積木一樣,搭建起數(shù)字系統(tǒng)。多積累些常用IP,常用的一些寫法的代碼。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5611

    瀏覽量

    130062
  • 比較器
    +關(guān)注

    關(guān)注

    14

    文章

    1936

    瀏覽量

    111957
  • Verilog
    +關(guān)注

    關(guān)注

    30

    文章

    1374

    瀏覽量

    114554

原文標(biāo)題:Verilog有什么奇技淫巧?

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    FPGA 入門必看:Verilog 與 VHDL 編程基礎(chǔ)解析!

    很多開發(fā)者第一次接觸FPGA,都會(huì)有同樣的疑問(wèn):FPGA是硬件,不是軟件,怎么寫程序?答案就是用硬件描述語(yǔ)言(HDL),最常用的就是Verilog和VHDL。今天,我們就帶你入門,搞清楚FPGA編程
    的頭像 發(fā)表于 01-19 09:05 ?498次閱讀
    FPGA 入門必看:<b class='flag-5'>Verilog</b> 與 VHDL 編程基礎(chǔ)解析!

    【「龍芯之光 自主可控處理器設(shè)計(jì)解析」閱讀體驗(yàn)】--LoongArch邏輯綜合、芯片設(shè)計(jì)

    TransferLevel,RTL)描述轉(zhuǎn)換為滿足功能、時(shí)序和面積要求的門級(jí)網(wǎng)表的過(guò)程。 按照流程,邏輯綜合通??煞譃槊嫦驊?yīng)用的專用集成電路(Application-Specific
    發(fā)表于 01-18 14:15

    有源邏輯探頭的具體應(yīng)用

    及典型場(chǎng)景的詳細(xì)拆解: 一、數(shù)字電路研發(fā)與調(diào)試 此為有源邏輯探頭的核心應(yīng)用場(chǎng)景,核心解決復(fù)雜數(shù)字系統(tǒng)中“信號(hào)觀測(cè)無(wú)干擾、多通道信號(hào)同步分析”的關(guān)鍵需求,為電路設(shè)計(jì)驗(yàn)證提供精準(zhǔn)的信號(hào)數(shù)據(jù)支撐。 時(shí)序邏輯驗(yàn)證: 針對(duì)
    的頭像 發(fā)表于 12-16 10:29 ?208次閱讀
    有源<b class='flag-5'>邏輯</b>探頭的具體應(yīng)用

    電能質(zhì)量在線監(jiān)測(cè)裝置的自診斷功能對(duì)通信故障的檢測(cè)邏輯是怎樣的?

    ” 的組合,明確故障觸發(fā)條件,確保檢測(cè)精準(zhǔn)、無(wú)遺漏,具體邏輯如下: 一、物理接口層:硬件直接檢測(cè),判斷 “接口是否可用” 這是最基礎(chǔ)的檢測(cè)環(huán)節(jié),通過(guò)硬件電路直接采集接口物理狀態(tài),快速識(shí)別硬件級(jí)故障,不依賴復(fù)雜軟件: 檢測(cè)邏輯核心
    的頭像 發(fā)表于 11-09 16:49 ?714次閱讀

    長(zhǎng)晶科技邏輯芯片產(chǎn)品矩陣介紹

    邏輯IC是用于實(shí)現(xiàn)基本邏輯運(yùn)算和復(fù)合邏輯運(yùn)算的集成電路, 廣泛應(yīng)用于各種電子設(shè)備和系統(tǒng)中,成為現(xiàn)代電子設(shè)備智能化、高效化的關(guān)鍵所在。
    的頭像 發(fā)表于 11-04 17:47 ?1312次閱讀
    長(zhǎng)晶科技<b class='flag-5'>邏輯</b>芯片產(chǎn)品矩陣介紹

    vivado時(shí)序分析相關(guān)經(jīng)驗(yàn)

    存在不滿足時(shí)序要求的邏輯級(jí)數(shù)。邏輯級(jí)數(shù)過(guò)多一般可以通過(guò)插入寄存器打拍子,分割冗長(zhǎng)的組合邏輯。 線延時(shí)較長(zhǎng)時(shí),一般是因?yàn)樯瘸鲚^大。 ”repo
    發(fā)表于 10-30 06:58

    MDD 邏輯IC的邏輯電平不兼容問(wèn)題與解決方案

    在現(xiàn)代電子系統(tǒng)中,MDD辰達(dá)半導(dǎo)體邏輯IC(集成電路)扮演著至關(guān)重要的角色,廣泛應(yīng)用于數(shù)據(jù)處理、時(shí)序控制、信號(hào)轉(zhuǎn)換等各類電路中。隨著技術(shù)的進(jìn)步,不同邏輯系列的IC(如TTL、CMOS、BiCMOS等
    的頭像 發(fā)表于 10-29 09:39 ?496次閱讀
    MDD <b class='flag-5'>邏輯</b>IC的<b class='flag-5'>邏輯</b>電平不兼容問(wèn)題與解決方案

    時(shí)序約束問(wèn)題的解決辦法

    在使用vivado對(duì) Verilog 代碼進(jìn)行綜合后,點(diǎn)擊“SYNTHESIS”下的“Report Timing Summary”,可以查看綜合后的時(shí)序報(bào)告,查看 Setup Time 和 Hold
    發(fā)表于 10-24 09:55

    ?TPLD2001可編程邏輯器件技術(shù)文檔摘要

    該TPLD2001是 TI 可編程邏輯器件 (TPLD) 系列器件的一部分,該器件具有具有組合邏輯、順序邏輯和模擬模塊的多功能可編程邏輯 I
    的頭像 發(fā)表于 09-28 10:36 ?823次閱讀
    ?TPLD2001可編程<b class='flag-5'>邏輯</b>器件技術(shù)文檔摘要

    ?TPLD801-Q1 可編程邏輯器件技術(shù)文檔總結(jié)

    TPLD801-Q1 是 TI 可編程邏輯器件 (TPLD) 系列器件的一部分,該器件具有具有組合邏輯、順序邏輯和模擬模塊的多功能可編程邏輯
    的頭像 發(fā)表于 09-28 10:03 ?691次閱讀
    ?TPLD801-Q1 可編程<b class='flag-5'>邏輯</b>器件技術(shù)文檔總結(jié)

    咨詢符合國(guó)標(biāo)GB/T 4728.12-2022的邏輯門電路設(shè)計(jì)軟件

    不正確呀。 咨詢 1、開源免費(fèi)的軟件,能夠繪制符合國(guó)家標(biāo)準(zhǔn)GB/T 4728.12-2022的邏輯門電路,繪制和驗(yàn)證簡(jiǎn)單的邏輯電路,最好提供74LS系列等常用的芯片,以及基本門電路芯片連接、組合等功能
    發(fā)表于 09-09 09:46

    如何選擇合適的邏輯芯片

    電工們可能對(duì)放大器頭疼、可能對(duì)ADC/DAC應(yīng)用發(fā)怵,但是對(duì)于小邏輯芯片,那就輕車熟路、信手拿來(lái)對(duì)著真值表就可以放心使用了。但是這小小的邏輯芯片,卻演繹著控制系統(tǒng)的大世界。
    的頭像 發(fā)表于 07-14 17:38 ?1226次閱讀
    如何選擇合適的<b class='flag-5'>邏輯</b>芯片

    實(shí)用電子電路設(shè)計(jì)(全6本)——數(shù)字邏輯電路的ASIC設(shè)計(jì)

    門電路、邏輯壓縮、組合電路、Johnson計(jì)數(shù)器、定序器設(shè)計(jì)及應(yīng)用等,并介紹了實(shí)現(xiàn)最佳設(shè)計(jì)的各種工程設(shè)計(jì)方法。 純分享貼,有需要可以直接下載附件獲取完整資料! (如果內(nèi)容有幫助可以關(guān)注、點(diǎn)贊、評(píng)論支持一下哦~)
    發(fā)表于 05-15 15:22

    長(zhǎng)虹電視;屏幕豎線;邏輯板問(wèn)題么

    電視機(jī)型號(hào):長(zhǎng)虹3D46C2000i. 請(qǐng)大神幫忙看下我得測(cè)試過(guò)程及結(jié)果,是邏輯板故障么? 1,狀態(tài)圖片為開機(jī)顯示畫面; 2,圖片2為分別拆卸邏輯板輸出測(cè)試; 3,圖片3為拆卸右側(cè)(從背面看)邏輯
    發(fā)表于 04-26 22:04

    數(shù)字電路—22、時(shí)序邏輯電路

    時(shí)序電路的邏輯功能可用邏輯表達(dá)式、狀態(tài)表、卡諾圖、狀態(tài)圖、時(shí)序圖和邏輯圖6種方式表示,這些表示方法在本質(zhì)上是相同的,可以互相轉(zhuǎn)換
    發(fā)表于 03-26 15:03