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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

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

always 語句

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

always語句的格式:

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

()中可以是*,表示:每當任何輸入發(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ù)的改變都會影響表達式的結(jié)果;過程賦值只有在語句執(zhí)行的時候,才會起作用。

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

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

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

使用非阻塞賦值是為了避免競爭冒險,那么實際使用中只需要記?。篴lways時序邏輯塊中多用非阻塞賦值<=(后面的時序邏輯電路會另外介紹),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做練習,上一節(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)//當“if...else...”中只有一個變量時不需要加“begin...end".但是為了不遺漏,還是加上
 out = in1; //always塊中的組合邏輯關系時使用阻塞賦值“=”進行賦值
 else
 out = in2;
 end
 endmodule

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

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

設計規(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對應的執(zhí)行語句只有一句,可以不使用begin,end但是由于怕以后復雜代碼會遺漏,還是選擇加上。always組合邏輯使用阻塞語句,用=進行賦值。

上面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)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1624

    文章

    21573

    瀏覽量

    600687
  • FPGA設計
    +關注

    關注

    9

    文章

    428

    瀏覽量

    26452
  • 仿真
    +關注

    關注

    50

    文章

    4003

    瀏覽量

    133248
  • 時鐘
    +關注

    關注

    10

    文章

    1703

    瀏覽量

    131196
  • 譯碼器
    +關注

    關注

    4

    文章

    310

    瀏覽量

    50227
收藏 人收藏

    評論

    相關推薦

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

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

    FPGA基礎學習筆記--組合邏輯電路-編碼譯碼器

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

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

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

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

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

    怎么實現(xiàn)BCH譯碼器FPGA硬件設計?

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

    如何利用譯碼器進行組合邏輯電路的設計呢

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

    譯碼器定義

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

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

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

    基于FPGA的RS碼譯碼器的設計

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

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

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

    譯碼器的分類和應用

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

    通過采用FPGA器件設計一個Viterbi譯碼器

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

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

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

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

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

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

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