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

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

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

always組合邏輯塊的講解和譯碼器的實現(xiàn)

冬至子 ? 來源:小小研究生 ? 作者:xxyjs2020 ? 2023-05-22 15:13 ? 次閱讀

always 語句

always 語句是重復(fù)執(zhí)行的。always 語句塊從 0 時刻開始執(zhí)行其中的行為語句;當(dāng)執(zhí)行完最后一條語句后,便再次執(zhí)行語句塊中的第一條語句,如此循環(huán)反復(fù)。多用于 仿真時鐘的產(chǎn)生 ,信號行為的檢測等。

always語句的格式:

always @(posedge clk) begin
    temp    = a ;
    a       = b ;
    b       = temp ;
end

()中可以是*,表示:每當(dāng)任何輸入發(fā)生變化時執(zhí)行begin和end之間的語句。也可以是posedge clk,表示:時鐘上升沿時執(zhí)行begin和end之間的語句。assign語句和always @(*)創(chuàng)建相同的組合邏輯,比如下面代碼中的兩個輸出波形是一致的。

module top_module(
    input a, 
    input b,
    output wire out_assign,
    output reg out_alwaysblock
);
assign out_assign=a&b;
    always @(*) begin
       out_alwaysblock=a&b; 
    end
endmodule

連續(xù)性賦值,過程性賦值 :連續(xù)性賦值總是處于激活狀態(tài),任何操作數(shù)的改變都會影響表達(dá)式的結(jié)果;過程賦值只有在語句執(zhí)行的時候,才會起作用。

阻塞賦值與非阻塞賦值 :是過程賦值的兩種類型。

阻塞賦值 :阻塞賦值屬于順序執(zhí)行,下一條語句執(zhí)行前,當(dāng)前語句一定會執(zhí)行完畢。使用等號 = 作為賦值符。initial語句用阻塞賦值。

非阻塞賦值 :并行執(zhí)行,即下一條語句的執(zhí)行和當(dāng)前語句的執(zhí)行是同時進(jìn)行的,它不會阻塞位于同一個語句塊中后面語句的執(zhí)行。使用 <= 作為賦值符。

使用非阻塞賦值是為了 避免競爭冒險 ,那么實際使用中只需要記住:always 時序邏輯****塊中多用非阻塞賦值<=(后面的時序邏輯電路會另外介紹),always 組合邏輯塊中多用阻塞賦值=;在仿真電路時,initial 塊中一般多用阻塞賦值=。例如下面代碼中,用assign語句,always組合語句,always時鐘語句實現(xiàn)異或:

module top_module(
    input clk,
    input a,
    input b,
    output wire out_assign,
    output reg out_always_comb,
    output reg out_always_ff   );
assign out_assign=a^b;
    always @(*) begin
       out_always_comb=a^b; 
    end
    always @(posedge clk) begin
       out_always_ff<=a^b; 
    end
endmodule

if 語句格式

if (condition1)       true_statement1 ;
else if (condition2)        true_statement2 ;
else if (condition3)        true_statement3 ;
else                      default_statement ;

如果只有兩種情況,就只有if和else。下面用上一節(jié)中MUX2_1做練習(xí),上一節(jié)中采用了assign的三元運算符語句,這里使用always if語句實現(xiàn)2選1的功能:

module mux2_1 
(
input wire in1, 
input wire in2, 
input wire sel, 
output reg out 
 ); 
 
 always@(*) begin
 if(sel == 1'b1)//當(dāng)“if...else...”中只有一個變量時不需要加“begin...end".但是為了不遺漏,還是加上
 out = in1; //always塊中的組合邏輯關(guān)系時使用阻塞賦值“=”進(jìn)行賦值
 else
 out = in2;
 end
 endmodule

3-8譯碼器的實現(xiàn)

從真值表看譯碼器功能:A2A1A0=000-111共8種輸入,對應(yīng)輸出Y的下標(biāo),對應(yīng)下標(biāo)的輸出為1(高電平),其他輸出為0(低電平)。3-8譯碼器的作用:按照之前點亮LED燈的思路,如果一個I/O端口控制一個LED燈,那么I/O端口很有可能不夠用,這時候聰明人就想出用3-8譯碼器的方式,3個I/O口就可以控制8個LED。

圖片

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

這個示例中,繪制波形圖如圖所示。

圖片

圖片

編寫代碼

module decoder3_8
(
input wire in1 , 
input wire in2 , 
input wire in3 , 
output reg [7:0] out 
);


 always@(*) begin
 //使用"{}"位拼接符將31bit數(shù)據(jù)按照順序拼成一個3bit數(shù)據(jù)
 if({in1, in2, in3} == 3'b000)
 out = 8'b0000_0001;
 else if({in1, in2, in3} == 3'b001)
 out = 8'b0000_0010;
 else if({in1, in2, in3} == 3'b010)
 out = 8'b0000_0100;
 else if({in1, in2, in3} == 3'b011)
 out = 8'b0000_1000;
 else if({in1, in2, in3} == 3'b100)
 out = 8'b0001_0000;
 else if({in1, in2, in3} == 3'b101)
 out = 8'b0010_0000;
 else if({in1, in2, in3} == 3'b110)
 out = 8'b0100_0000;
 else if({in1, in2, in3} == 3'b111)
 out = 8'b1000_0000;
 else
 out = 8'b0000_0001;
end
 endmodule

代碼中使用always組合邏輯塊。由于if對應(yīng)的執(zhí)行語句只有一句,可以不使用begin,end但是由于怕以后復(fù)雜代碼會遺漏,還是選擇加上。always組合邏輯使用阻塞語句,用=進(jìn)行賦值。

上面RTL代碼綜合出的RTL視圖:

圖片

編寫testbench

`timescale 1ns/1ns
module tb_decoder3_8();


//reg define
reg in1;
reg in2;
reg in3;
wire [7:0] out;


 //初始化輸入信號
 initial begin
 in1 <= 1'b0;
 in2 <= 1'b0;
 in3 <= 1'b0;
 end


 always #10 in1 <= {$random} % 2;
 always #10 in2 <= {$random} % 2;
 always #10 in3 <= {$random} % 2;
 //-------------decoder3_8_inst----------------
 decoder3_8 decoder3_8_ins
 (
 .in1(in1), 
 .in2(in2), 
 .in3(in3), 
 .out(out) 
 );


 endmodule

經(jīng)過兩個實例后,testbench已經(jīng)超級熟悉了吧。

對比波形

看看波型:

圖片

驗證了波形的正確性。

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

    關(guān)注

    9

    文章

    428

    瀏覽量

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

    關(guān)注

    22

    文章

    1588

    瀏覽量

    107403
  • 譯碼器
    +關(guān)注

    關(guān)注

    4

    文章

    310

    瀏覽量

    50156
  • 仿真電路
    +關(guān)注

    關(guān)注

    5

    文章

    82

    瀏覽量

    33179
收藏 人收藏

    評論

    相關(guān)推薦

    譯碼器邏輯功能和使用方法

    譯碼器是一個多輸入、多輸出的組合邏輯電路。它的作用是把給定的代碼進(jìn)行“翻譯”,變成相應(yīng)的狀態(tài),使輸出通道中相應(yīng)的一路有信號輸出。
    的頭像 發(fā)表于 10-11 12:51 ?7642次閱讀
    <b class='flag-5'>譯碼器</b>的<b class='flag-5'>邏輯</b>功能和使用方法

    組合邏輯3-8譯碼器的設(shè)計及實驗

    組合邏輯3-8譯碼器的設(shè)計及實驗  說明:本書將以實驗一為例詳細(xì)介紹Altera公司MaxplusII 10.1版本軟件的基本應(yīng)用,其它實驗將不再贅述。讀者在通過本實驗后將對
    發(fā)表于 10-09 18:22

    FPGA基礎(chǔ)學(xué)習(xí)筆記--組合邏輯電路-編碼譯碼器

    `FPGA基礎(chǔ)學(xué)習(xí)筆記--組合邏輯電路-編碼譯碼器編碼4輸入2輸出編碼代碼如下modul
    發(fā)表于 02-20 15:36

    第二章_組合邏輯電路之譯碼器

    本帖最后由 芯航線跑堂 于 2016-12-23 21:02 編輯 組合邏輯電路設(shè)計之譯碼器課程目標(biāo): 1. 再次熟悉Quartus II工程的建立以及完整的FPGA開發(fā)流程 2. 以
    發(fā)表于 12-20 18:45

    第二章 組合邏輯電路之譯碼器

    組合邏輯電路設(shè)計之譯碼器課程目標(biāo): 1. 再次熟悉Quartus II工程的建立以及完整的FPGA開發(fā)流程 2. 以譯碼器為例學(xué)會簡單組合
    發(fā)表于 12-20 18:54

    如何利用譯碼器進(jìn)行組合邏輯電路的設(shè)計呢

    集成電路編碼譯碼器的工作原理即邏輯功能是什么?如何利用邏輯門去實現(xiàn)一種集成電路編碼呢?如何
    發(fā)表于 11-03 06:55

    譯碼器定義

    譯碼器1. 譯碼器定義譯碼器是一種用以檢測輸入位(碼)的特定組合是否存在,并以特定的輸出電平來指示這種特定碼的存在的數(shù)字電路?!稊?shù)字電子技術(shù)基礎(chǔ)系統(tǒng)方法》
    發(fā)表于 12-07 09:37

    138譯碼器怎么用

    138譯碼器的設(shè)置目的是為了實現(xiàn)IO復(fù)用,單片機上IO資源緊張,掛載的外設(shè)較多,為了解決這一矛盾,引入了138譯碼器單個138譯碼器能夠利用3個IO
    發(fā)表于 01-12 07:25

    譯碼器

    譯碼器 譯碼是編碼的逆過程,即將某個二進(jìn)制翻譯成電路的某種狀態(tài)。實現(xiàn)譯碼操作的電路稱為譯碼器。
    發(fā)表于 09-27 12:59 ?1.3w次閱讀
    <b class='flag-5'>譯碼器</b>

    譯碼器,譯碼器是什么意思

    譯碼器,譯碼器是什么意思 譯碼器組合邏輯電路的一個重要的器件,其可以分為:變量譯碼和顯示
    發(fā)表于 03-08 16:32 ?5456次閱讀

    譯碼器邏輯功能_譯碼器的作用及工作原理

    本文首先介紹了譯碼器的定義與譯碼器的分類,其次介紹了譯碼器的作用和譯碼器的工作原理,最后介紹了譯碼器
    發(fā)表于 02-08 14:04 ?11.3w次閱讀
    <b class='flag-5'>譯碼器</b>的<b class='flag-5'>邏輯</b>功能_<b class='flag-5'>譯碼器</b>的作用及工作原理

    譯碼器的分類和應(yīng)用

    本文主要介紹了譯碼器的分類和應(yīng)用。譯碼器指的是具有譯碼功能的邏輯電路,譯碼是編碼的逆過程,它能將二進(jìn)制代碼翻譯成代表某一特定含義的信號(即電
    的頭像 發(fā)表于 04-04 11:51 ?4.2w次閱讀
    <b class='flag-5'>譯碼器</b>的分類和應(yīng)用

    集成譯碼器邏輯功能和使用方法

    譯碼器是一個多輸入、多輸出的組合邏輯電路。它的作用是把給定的代碼進(jìn)行“翻譯”,變成相應(yīng)的狀態(tài),使輸出通道中相應(yīng)的一路有信號輸出。譯碼器在數(shù)字系統(tǒng)中有廣泛的用途,不僅用于代碼的轉(zhuǎn)換、終端
    的頭像 發(fā)表于 04-26 14:34 ?4037次閱讀
    集成<b class='flag-5'>譯碼器</b>的<b class='flag-5'>邏輯</b>功能和使用方法

    組合邏輯電路中的譯碼器介紹

    譯碼器定義 邏輯功能:將每個輸入的二進(jìn)制代碼對應(yīng)輸出為高、低電平信號。 譯碼是編碼的反操作。
    的頭像 發(fā)表于 04-30 16:19 ?1847次閱讀
    <b class='flag-5'>組合</b><b class='flag-5'>邏輯</b>電路中的<b class='flag-5'>譯碼器</b>介紹

    FPGA設(shè)計:always組合邏輯講解譯碼器實現(xiàn)

    always 語句是重復(fù)執(zhí)行的。always 語句從 0 時刻開始執(zhí)行其中的行為語句;當(dāng)執(zhí)行完最后一條語句后,便再次執(zhí)行語句中的第一條語句,如此循環(huán)反復(fù)。多用于仿真時鐘的產(chǎn)生,信號
    的頭像 發(fā)表于 05-12 14:42 ?3698次閱讀
    FPGA設(shè)計:<b class='flag-5'>always</b><b class='flag-5'>組合</b><b class='flag-5'>邏輯</b><b class='flag-5'>塊</b>的<b class='flag-5'>講解</b>和<b class='flag-5'>譯碼器</b>的<b class='flag-5'>實現(xiàn)</b>