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

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

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

層次化設(shè)計(jì)構(gòu)成全加器

冬至子 ? 來(lái)源:小小研究生 ? 作者:xxyjs2020 ? 2023-05-22 15:26 ? 次閱讀

全加器可看作兩個(gè)半加器和一個(gè)或門組成。

首先半加器是A+B構(gòu)成了{(lán)C,S}。由于全加器多了一個(gè)低位的進(jìn)位,就是將{C,S}再加上Ci-1。此時(shí)再使用一個(gè)半加器將S與Ci-1相加,結(jié)果的低位就是全加器的低位Si。全加器的高位Ci來(lái)自于兩個(gè)半加器的高位,如果有一個(gè)高位為1,結(jié)果就為1。

圖片

設(shè)計(jì)規(guī)劃

圖片

本例中將采用3個(gè)按鍵作為輸入in1,in2和進(jìn)位信號(hào)cin,并采用兩個(gè)LED燈作為信號(hào)輸出count和sum。根據(jù)上一節(jié)中全加器真值表,可以畫出波形圖:

圖片

編寫代碼

module full_adder
(
input wire in1 , 
input wire in2 , 
input wire cin , 
output wire sum , 
output wire cout 
);


 //wire define
 wire h0_sum ;
 wire h0_cout;
 wire h1_cout;


 //------------------------half_adder_inst0------------------------
 half_adder half_adder_inst0
 (
 .in1 (in1 ), 
 .in2 (in2 ), 
 .sum (h0_sum ), 
 .cout (h0_cout) 
 );


 //------------------------half_adder_inst1------------------------
 half_adder half_adder_inst1
 (
 .in1 (h0_sum ), 
 .in2 (cin ), 
 .sum (sum ), 
 .cout (h1_cout) 
 );


 assign cout = h0_cout|h1_cout;
 endmodule

還記得FPGA從入門到精通(一)中的移位寄存器的實(shí)例化練習(xí)嗎?以module模塊名(輸入,輸出)開頭,以endmodule結(jié)尾。

上一節(jié)中已經(jīng)封裝好了half_adder函數(shù),內(nèi)部的邏輯就不用再次寫了,只需要將外部端口和full_adder的端口對(duì)應(yīng)好就可以直接調(diào)用。這就是verilog的方便之處,否則完成這個(gè)程序,需要將半加器的代碼寫兩次。

再上面的全加器結(jié)構(gòu)圖中可以看到端口的對(duì)應(yīng),其中除了全加器的5個(gè)端口外,還需要引入三根連線。需要定義wire變量h0_count,h1_count和h0_sum。

下面完成兩次實(shí)例化,上一節(jié)中的半加器有in1,in2,cout,sum四個(gè)端口,第一個(gè)半加器分別對(duì)應(yīng)著全加器的輸入端口in1,in2,h0_count,h0_sum,第二個(gè)半加器分別對(duì)應(yīng)著上一個(gè)半加器的結(jié)果的低位h0_sum和低位進(jìn)位cin,h1_count1,全加器的結(jié)果的低位sum。全加器的結(jié)果的高位count是h0_count和h1_count的或。

現(xiàn)在將.v文件綜合一定會(huì)報(bào)錯(cuò),因?yàn)檫€沒有將half_adder模塊添加進(jìn)來(lái)。所以調(diào)用時(shí)找不到半加器的函數(shù)。因此需要將half_adder.v復(fù)制到文件夾中并添加到Files中:

圖片

看RTL視圖,兩個(gè)half_adder模塊是可以展開的:

圖片

圖片

編寫testbench

`timescale 1ns/1ns
module tb_full_adder();
reg in1;
reg in2;
reg cin;
wire sum ;
wire cout;


 initial begin
 in1 <= 1'b0;
 in2 <= 1'b0;
 cin <= 1'b0;
 end


 always #10 in1 <= {$random} % 2;
 always #10 in2 <= {$random} % 2;
 always #10 cin <= {$random} % 2;


 //------------------------------------------------------------
 initial begin
 $timeformat(-9, 0, "ns", 6);
 $monitor("@time %t:in1=%b in2=%b cin=%b sum=%b cout=%b",$time,in1,in2,cin,sum,cout);
 end
 //------------------------------------------------------------


 //---------------full_adder_inst------------------
 full_adder full_adder_inst(
 .in1 (in1), 
 .in2 (in2), 
 .cin (cin), 
 .sum (sum), 
 .cout (cout) 
 );


 endmodule

這里testbench依然是先聲明變量,其中輸入是reg類型,輸出是wire類型。初始化令變量都為0,延時(shí)10ns給輸入隨機(jī)賦值0或1,然后實(shí)例化將tb_full_adder模塊和full_adder模塊端口進(jìn)行連接,就可以觀察波形。

需要注意的是?。?!在本例中引入了打印模塊,可以直觀看到隨機(jī)輸入對(duì)應(yīng)輸出的真值表。

$timeformat(units_number, precision_number, suffix_string, minimum_field_wdith);

timefomat的語(yǔ)法:

第一個(gè)參數(shù)units_number表示打印的時(shí)間值的單位,取0 到-15 之間的整數(shù)值:0 表示秒,-3 表示毫秒,-6 表示微秒,-9 表示納秒, -12 表示皮秒, -15 表示飛秒

第二個(gè)參數(shù)precision_number表示打印時(shí)間值時(shí),小數(shù)點(diǎn)后保留的位數(shù)。

第三個(gè)參數(shù)suffix_string在時(shí)間值后面打印時(shí)間單位。其默認(rèn)值為空字符串,如果用ns作為單位可以打印ns。

第四個(gè)參數(shù)MinFieldWidth 是時(shí)間值與單位字符串的最小長(zhǎng)度,不足這個(gè)長(zhǎng)度,則在字符串之前補(bǔ)空格。其默認(rèn)值為20。

monitor的語(yǔ)法:

$monitor (“format_string”, parameter1, parameter2, … );

當(dāng)在monitor調(diào)用時(shí)對(duì)多個(gè)變量進(jìn)行監(jiān)控,當(dāng)monitor監(jiān)控的變量中任何一個(gè)發(fā)生變化時(shí),將會(huì)打印出當(dāng)前仿真時(shí)刻的值;如果$monitor監(jiān)控的所有變量在某一時(shí)刻均不改變,將不會(huì)打印任何信息。本例中會(huì)打印出時(shí)間和5個(gè)端口值。

對(duì)比波形

圖片

當(dāng)端口多了之后,看波形相對(duì)不直觀了,這里可以通過(guò)觀察我們剛才打印的數(shù)據(jù)進(jìn)行判斷。通過(guò)View-transcript可以觀察transcript窗口:

圖片

圖片

表格的方式相對(duì)直觀多了,且輸出和預(yù)期一致。

分配管腳

全編譯后分配引腳,這里的按鍵和LED燈管腳我們已經(jīng)非常熟悉了。在location這一欄分配引腳,不要和fitterlocation弄混了。

圖片

現(xiàn)在cin,in1,in2對(duì)應(yīng)S0,S1,S2,cout對(duì)應(yīng)LED0,sum對(duì)應(yīng)LED1。那么cin,in1,in2按下去表示為0,點(diǎn)亮的LED表示對(duì)應(yīng)為輸出為低電平。都不按下去時(shí),應(yīng)該都熄滅,按下去一個(gè)時(shí),LED0亮,按下兩個(gè)時(shí),LED1亮,按下三個(gè)時(shí),兩個(gè)LED同時(shí)亮。

全編譯后上板驗(yàn)證

一個(gè)都不按下時(shí),都不亮

按下一個(gè)時(shí),LED0亮

按下兩個(gè)時(shí),LED1亮

全部按下時(shí),兩個(gè)都亮

組合邏輯電路的實(shí)例就結(jié)束了,后面是簡(jiǎn)單的時(shí)序邏輯電路實(shí)例。

聲明:本文內(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)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21736

    瀏覽量

    603372
  • led燈
    +關(guān)注

    關(guān)注

    22

    文章

    1592

    瀏覽量

    107999
  • 移位寄存器
    +關(guān)注

    關(guān)注

    3

    文章

    258

    瀏覽量

    22274
  • 全加器
    +關(guān)注

    關(guān)注

    10

    文章

    62

    瀏覽量

    28506
  • 半加器
    +關(guān)注

    關(guān)注

    1

    文章

    29

    瀏覽量

    8793
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Altium如何創(chuàng)建層次的原理圖形式

    多頁(yè)原理圖繪制方法:采用垂直分割,而此處的模塊也可能是由幾個(gè)更基礎(chǔ)的模塊構(gòu)成,一路延續(xù)下去,就形成金字塔型的層次結(jié)構(gòu)。如下圖: 在AltiumDesigner里面的形式如下圖: Sheet2
    發(fā)表于 09-06 15:48

    如何對(duì)全加器進(jìn)行實(shí)驗(yàn)

    多思計(jì)算機(jī)組成原理網(wǎng)絡(luò)虛擬實(shí)驗(yàn)系統(tǒng)計(jì)算機(jī)組成原理實(shí)驗(yàn)一全加器實(shí)驗(yàn)
    發(fā)表于 10-29 08:54

    什么是8位全加器和8為帶超前進(jìn)位的全加器

    Verilog數(shù)字系統(tǒng)設(shè)計(jì)四復(fù)雜組合邏輯實(shí)驗(yàn)2文章目錄Verilog數(shù)字系統(tǒng)設(shè)計(jì)四前言一、什么是8位全加器和8為帶超前進(jìn)位的全加器?二、編程1.要求:2.門級(jí)原語(yǔ)實(shí)現(xiàn)8位全加器:3.門級(jí)原語(yǔ)實(shí)現(xiàn)帶
    發(fā)表于 02-09 07:49

    一種基于單電子晶體管的全加器電路設(shè)計(jì)

    基于單電子晶體管的I-V特性和傳輸晶體管的設(shè)計(jì)思想,用多柵單電子晶體管作為傳輸晶體管,設(shè)計(jì)了一個(gè)由5個(gè)SET構(gòu)成全加器,相對(duì)于靜態(tài)互補(bǔ)邏輯設(shè)計(jì)的全加器,本文設(shè)計(jì)的全加器在器
    發(fā)表于 07-30 16:54 ?18次下載

    全加器

    全加器   全加器能進(jìn)行加數(shù)、被加數(shù)和低位來(lái)的進(jìn)位信號(hào)相加,并根據(jù)求和結(jié)果給出該位的進(jìn)位信號(hào)?! 「鶕?jù)全加器的功能,可列出它的真值表:
    發(fā)表于 04-07 10:34 ?9444次閱讀
    <b class='flag-5'>全加器</b>

    用兩個(gè)全加器構(gòu)成二一十進(jìn)制相減器

    用兩個(gè)全加器構(gòu)成二一十進(jìn)制相減器
    發(fā)表于 04-09 10:34 ?900次閱讀
    用兩個(gè)<b class='flag-5'>全加器</b><b class='flag-5'>構(gòu)成</b>二一十進(jìn)制相減器

    用四位全加器構(gòu)成二一十進(jìn)制加法器

    用四位全加器構(gòu)成二一十進(jìn)制加法器
    發(fā)表于 04-09 10:34 ?5962次閱讀
    用四位<b class='flag-5'>全加器</b><b class='flag-5'>構(gòu)成</b>二一十進(jìn)制加法器

    監(jiān)控系統(tǒng)設(shè)備構(gòu)成的分層次結(jié)構(gòu)詳析

    監(jiān)控系統(tǒng)設(shè)備構(gòu)成的分層次結(jié)構(gòu)詳析 在這介召一下監(jiān)控系統(tǒng)中采用的設(shè)備構(gòu)成的分層次結(jié)構(gòu),在計(jì)算機(jī)網(wǎng)絡(luò)中運(yùn)用的拓?fù)浣Y(jié)構(gòu)同樣在監(jiān)控系統(tǒng)中得到廣泛的運(yùn)用,而拓
    發(fā)表于 12-18 09:56 ?1749次閱讀

    全加器,全加器是什么意思

    全加器,全加器是什么意思  full-adder    用門電路實(shí)現(xiàn)兩個(gè)二進(jìn)數(shù)相加并求出和的組合線路,稱為一個(gè)全加器。
    發(fā)表于 03-08 17:04 ?8.4w次閱讀

    全加器是什么?全加器和半加器的區(qū)別?

    加器是能夠計(jì)算低位進(jìn)位的二進(jìn)制加法電路。與半加器相比,全加器不只考慮本位計(jì)算結(jié)果是否有進(jìn)位,也考慮上一位對(duì)本位的進(jìn)位,可以把多個(gè)一位全加器級(jí)聯(lián)后做成多位全加器。
    發(fā)表于 07-25 11:15 ?7.4w次閱讀
    <b class='flag-5'>全加器</b>是什么?<b class='flag-5'>全加器</b>和半加器的區(qū)別?

    什么是全加器 全加器工作原理

    全加器英語(yǔ)名稱為full-adder,是用門電路實(shí)現(xiàn)兩個(gè)二進(jìn)制數(shù)相加并求出和的組合線路,稱為一位全加器。
    的頭像 發(fā)表于 07-25 16:03 ?7.8w次閱讀

    層次設(shè)計(jì)方法講解

      層次設(shè)計(jì)是指在一個(gè)大型設(shè)計(jì)任務(wù)中,將目標(biāo)層分解,在各個(gè)層次上進(jìn)行設(shè)計(jì)的方法。
    的頭像 發(fā)表于 11-19 07:08 ?5707次閱讀

    全加器邏輯表達(dá)式_全加器的邏輯功能

    本文主要介紹了全加器邏輯表達(dá)式及全加器的邏輯功能。
    的頭像 發(fā)表于 04-23 09:51 ?13.1w次閱讀
    <b class='flag-5'>全加器</b>邏輯表達(dá)式_<b class='flag-5'>全加器</b>的邏輯功能

    全加器的真值表

    全加器英語(yǔ)名稱為full-adder,是用門電路實(shí)現(xiàn)兩個(gè)二進(jìn)制數(shù)相加并求出和的組合線路,稱為一位全加器。一位全加器可以處理低位進(jìn)位,并輸出本位加法進(jìn)位,多個(gè)一位全加器進(jìn)行級(jí)聯(lián)可以得到多
    的頭像 發(fā)表于 06-29 09:14 ?6.1w次閱讀
    <b class='flag-5'>全加器</b>的真值表

    基于FPGA層次設(shè)計(jì)構(gòu)成全加器

    在上一節(jié)半加器中,介紹了全加器可看作兩個(gè)半加器和一個(gè)或門組成。
    的頭像 發(fā)表于 05-14 15:07 ?1826次閱讀
    基于FPGA<b class='flag-5'>層次</b><b class='flag-5'>化</b>設(shè)計(jì)<b class='flag-5'>構(gòu)成全加器</b>