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

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

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

FPGA設(shè)計(jì):always組合邏輯塊的講解和譯碼器的實(shí)現(xiàn)

CHANBAEK ? 來源:小小研究生 ? 作者:xxyjs2020 ? 2023-05-12 14:42 ? 次閱讀

always 語(yǔ)句

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

always語(yǔ)句的格式:

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

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

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ù)的改變都會(huì)影響表達(dá)式的結(jié)果;過程賦值只有在語(yǔ)句執(zhí)行的時(shí)候,才會(huì)起作用。

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

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

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

使用非阻塞賦值是為了避免競(jìng)爭(zhēng)冒險(xiǎn),那么實(shí)際使用中只需要記住:always時(shí)序邏輯塊中多用非阻塞賦值<=(后面的時(shí)序邏輯電路會(huì)另外介紹),always組合邏輯塊中多用阻塞賦值=; 在仿真電路時(shí),initial 塊中一般多用阻塞賦值=。 例如下面代碼中,用assign語(yǔ)句,always組合語(yǔ)句,always時(shí)鐘語(yǔ)句實(shí)現(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 語(yǔ)句格式

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的三元運(yùn)算符語(yǔ)句,這里使用always if語(yǔ)句實(shí)現(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...”中只有一個(gè)變量時(shí)不需要加“begin...end".但是為了不遺漏,還是加上
 out = in1; //always塊中的組合邏輯關(guān)系時(shí)使用阻塞賦值“=”進(jìn)行賦值
 else
 out = in2;
 end
 endmodule

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

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

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

這個(gè)示例中,繪制波形圖如圖所示。

編寫代碼

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


 always@(*) begin
 //使用"{}"位拼接符將3個(gè)1bit數(shù)據(jù)按照順序拼成一個(gè)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對(duì)應(yīng)的執(zhí)行語(yǔ)句只有一句,可以不使用begin,end但是由于怕以后復(fù)雜代碼會(huì)遺漏,還是選擇加上。always組合邏輯使用阻塞語(yǔ)句,用=進(jìn)行賦值。

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

編寫testbench

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


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


 //初始化輸入信號(hào)
 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)過兩個(gè)實(shí)例后,testbench已經(jīng)超級(jí)熟悉了吧。

對(duì)比波形

看看波型:

驗(yàn)證了波形的正確性

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

    關(guān)注

    1620

    文章

    21510

    瀏覽量

    598956
  • FPGA設(shè)計(jì)
    +關(guān)注

    關(guān)注

    9

    文章

    428

    瀏覽量

    26423
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    3972

    瀏覽量

    132964
  • 時(shí)鐘
    +關(guān)注

    關(guān)注

    10

    文章

    1673

    瀏覽量

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

    關(guān)注

    4

    文章

    310

    瀏覽量

    50156
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

    怎么實(shí)現(xiàn)BCH譯碼器FPGA硬件設(shè)計(jì)?

    本文通過對(duì)長(zhǎng)BCH碼優(yōu)化方法的研究與討論,針對(duì)標(biāo)準(zhǔn)中二進(jìn)制BCH碼的特性,設(shè)計(jì)了實(shí)現(xiàn)譯碼器FPGA硬件結(jié)構(gòu)。
    發(fā)表于 06-15 09:23

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

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

    譯碼器定義

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

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

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

    基于FPGA的RS碼譯碼器的設(shè)計(jì)

    介紹了符合CCSDS標(biāo)準(zhǔn)的RS(255,223)碼譯碼器的硬件實(shí)現(xiàn)結(jié)構(gòu)。譯碼器采用8位并行時(shí)域譯碼算法,主要包括了修正后的無(wú)逆BM迭代譯碼
    發(fā)表于 01-25 16:43 ?68次下載
    基于<b class='flag-5'>FPGA</b>的RS碼<b class='flag-5'>譯碼器</b>的設(shè)計(jì)

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

    本文首先介紹了譯碼器的定義與譯碼器的分類,其次介紹了譯碼器的作用和譯碼器的工作原理,最后介紹了譯碼器
    發(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)制代碼翻譯成代表某一特定含義的信號(hào)(即電
    的頭像 發(fā)表于 04-04 11:51 ?4.2w次閱讀
    <b class='flag-5'>譯碼器</b>的分類和應(yīng)用

    通過采用FPGA器件設(shè)計(jì)一個(gè)Viterbi譯碼器

    可編程邏輯技術(shù)的不斷發(fā)展,其高密度、低功耗、使用靈活、設(shè)計(jì)快速、成本低廉、現(xiàn)場(chǎng)可編程和反復(fù)可編程等特性,使FPGA逐步成為Viterbi譯碼器設(shè)計(jì)的最佳方法。項(xiàng)目目的是用FPGA
    的頭像 發(fā)表于 04-24 08:29 ?2866次閱讀
    通過采用<b class='flag-5'>FPGA</b>器件設(shè)計(jì)一個(gè)Viterbi<b class='flag-5'>譯碼器</b>

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

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

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

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

    always組合邏輯講解譯碼器實(shí)現(xiàn)

    always 語(yǔ)句是重復(fù)執(zhí)行的。always 語(yǔ)句從 0 時(shí)刻開始執(zhí)行其中的行為語(yǔ)句;當(dāng)執(zhí)行完最后一條語(yǔ)句后,便再次執(zhí)行語(yǔ)句中的第一條語(yǔ)句,如此循環(huán)反復(fù)。
    的頭像 發(fā)表于 05-22 15:13 ?2445次閱讀
    <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'>實(shí)現(xiàn)</b>