一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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í)現(xiàn)4位加法器功能

電子森林 ? 來(lái)源:電子森林 ? 作者:蘇老師 ? 2021-10-11 09:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在上次的文章 - 淺談“數(shù)字電路”的學(xué)習(xí)(8)- 編碼器、譯碼器、多路復(fù)用器、解復(fù)用器的關(guān)系和應(yīng)用 - 中,我梳理了一下數(shù)字電路教程中組合邏輯部分的一些典型邏輯應(yīng)用和他們之間的關(guān)系,并通過(guò)一個(gè)簡(jiǎn)單的2:4譯碼器、3:8譯碼器來(lái)學(xué)習(xí)了一下用Verilog代碼如何實(shí)現(xiàn)這些邏輯。

作為組合邏輯部分的總結(jié)篇,我們用小腳丫FPGA核心板來(lái)實(shí)現(xiàn)一個(gè)4位加法器的功能,正巧小腳丫板上有:

4個(gè)開(kāi)關(guān) - 可以做加法器的4位二進(jìn)制的加數(shù),可以實(shí)現(xiàn)十進(jìn)制0、1、2.。.15的輸入;

4個(gè)按鍵 - 可以做加法器的4位二進(jìn)制的加數(shù),在組合邏輯部分還沒(méi)有涉及到按鍵的消抖功能,且同時(shí)按多個(gè)鍵相對(duì)于開(kāi)關(guān)困難一些,因此我們至少可以用這4個(gè)按鍵的任意一個(gè)實(shí)現(xiàn)十進(jìn)制的0、1、2、4、8的輸入;

2個(gè)數(shù)碼管 - 即便4個(gè)按鍵同時(shí)按下,最大輸入的值也就15,因此此加法器能夠產(chǎn)生的最大輸出值為30,用一個(gè)數(shù)碼管顯示個(gè)位數(shù),會(huì)顯示0-9;另一個(gè)數(shù)碼管顯示十位數(shù),會(huì)顯示0-3;

8個(gè)分立的LED - 可以選擇其中的4個(gè)作為4位二進(jìn)制加法器的進(jìn)位顯示,發(fā)生進(jìn)位的時(shí)候相應(yīng)的LED就會(huì)亮。

板上的硬件條件齊全,就要用Verilog代碼來(lái)實(shí)現(xiàn)邏輯了。

相對(duì)于前期我們講述的例子,這個(gè)項(xiàng)目復(fù)雜的地方在于它包含了以下幾個(gè)部分的知識(shí)點(diǎn):

加法器 - 如何使用1位的全加器、1位的半加器構(gòu)成一個(gè)4位的二進(jìn)制加法器;

二進(jìn)制轉(zhuǎn)BCD碼的解碼 - 我們用4位二進(jìn)制加法器實(shí)現(xiàn)的結(jié)果,在我們?nèi)祟惖恼J(rèn)知里其實(shí)是十進(jìn)制的,要用數(shù)碼管以十進(jìn)制的方式在兩個(gè)數(shù)碼管上將結(jié)果顯示出來(lái),這就需要我們先將二進(jìn)制的加法結(jié)果(加上進(jìn)位共5位二進(jìn)制數(shù)據(jù))轉(zhuǎn)換為兩個(gè)十進(jìn)制的數(shù)值來(lái)表示;

7段(加上小數(shù)點(diǎn)8段)數(shù)碼管的顯示驅(qū)動(dòng) - 點(diǎn)亮數(shù)碼管上的7根LED,通過(guò)這7根LED的組合生成我們認(rèn)知的數(shù)字0、1、2、3、4、5、6、7、8、9,將要顯示的數(shù)字映射到這7段LED上就需要一個(gè)編碼的過(guò)程,有的文章也說(shuō)是解碼(decoder),總之是碼制的轉(zhuǎn)換過(guò)程

所以,這算是一個(gè)綜合性的項(xiàng)目,用FPGA通過(guò)Verilog編程來(lái)實(shí)現(xiàn)也能體會(huì)到由一個(gè)項(xiàng)目由多個(gè)Module構(gòu)成的方式,并能夠理解我們常說(shuō)的“并行”處理的含義

代碼的架構(gòu)如下面的框圖所示:

d50dfa04-2a06-11ec-82a8-dac502259ad0.png

頂層功能模塊add_4bits調(diào)用其它的幾個(gè)并行執(zhí)行的module,并定義了與外界打交道的輸入輸出管腳。代碼如下:

module adder_4bits(sw,key,seg_led_1,seg_led_2,led_carry);input [3:0] sw;input [3:0] key;output [8:0] seg_led_1;output [8:0] seg_led_2;output [3:0] led_carry;

wire [3:0] input1;wire [3:0] input2;wire [3:0] answer;

wire carry_out;wire [3:0] carry; assign input1 = sw;assign input2 = ~key; genvar i;generate for(i=0;i《4;i=i+1) begin: generate_N_bit_Adder if(i==0) half_adder f(input1[0],input2[0],answer[0],carry[0]);

else full_adder f(input1[i],input2[i],carry[i-1],answer[i],carry[i]); end assign carry_out = carry[3];

endgenerate assign led_carry = ~carry; wire [4:0] sum;assign sum = {carry_out,answer};

wire [3:0] seg1_input;

wire [3:0] seg2_input; binary2bcd b2b(sum,seg1_input,seg2_input); LED display_answer(seg1_input,seg2_input,seg_led_1,seg_led_2); endmodule module half_adder(x,y,s,c);input x,y;output s,c;

assign s=x^y;assign c=x&y;endmodule // half adder module full_adder(x,y,c_in,s,c_out);input x,y,c_in;output s,c_out;

assign s = (x^y) ^ c_in;assign c_out = (y&c_in)| (x&y) | (x&c_in);endmodule // full_adder

要注意的是,在小腳丫FPGA板上,出于讓同學(xué)們遇到問(wèn)題才能學(xué)習(xí)的考慮,我們特別將開(kāi)關(guān)和按鍵的缺省狀態(tài)設(shè)置成了兩種不同的方式,4個(gè)開(kāi)關(guān)缺省狀態(tài)為低電平,開(kāi)關(guān)閉合時(shí)該管腳電平拉高;4個(gè)按鍵缺省狀態(tài)為高電平,按下時(shí)該管腳電平為低;故在代碼中做了取反~的處理(體會(huì)開(kāi)關(guān)的狀態(tài)以及Verilog對(duì)反相信號(hào)的處理方式,在使用中體會(huì)開(kāi)關(guān)和按鍵的不同)。

二進(jìn)制轉(zhuǎn)BCD碼在網(wǎng)上有很多文章介紹,常用的方法為移位3的方式,只需要短短幾行代碼就可以實(shí)現(xiàn),關(guān)于其原理大家可以自行搜索一下,我也在下面的代碼的注釋部分附上了這部分代碼供同學(xué)們參考??紤]到兩個(gè)4位加法輸出的結(jié)果只有5位二進(jìn)制、對(duì)應(yīng)的最多31種結(jié)果,我們要做的就是將這5位二進(jìn)制映射到2個(gè)10進(jìn)制的數(shù)字上,有點(diǎn)類似5-32的譯碼操作,在這里我們使用查找表的方式來(lái)構(gòu)建,主要也是讓同學(xué)們體會(huì)查找表的靈活性、構(gòu)建方法和Verilog的語(yǔ)法。要知道的是FPGA內(nèi)部的邏輯都是基于查找表的方式來(lái)實(shí)現(xiàn)的。

module binary2bcd(binary_data,tens,ones);input [4:0] binary_data;output reg [3:0] tens;output reg [3:0] ones; always @*case(binary_data) 5‘d0: begin tens = 4’d0; ones = 4‘d0; end 5’d1:

begin tens = 4‘d0; ones = 4’d1; end 5‘d2: begin tens = 4’d0; ones = 4‘d2; end 5’d3:

begin tens = 4‘d0; ones = 4’d3; end 5‘d4: begin tens = 4’d0; ones = 4‘d4; end 5’d5: begin tens = 4‘d0;

ones = 4’d5; end 5‘d6: begin tens = 4’d0; ones = 4‘d6; end 5’d7: begin tens = 4‘d0; ones = 4’d7; end 5‘d8: begin tens = 4’d0; ones = 4‘d8; end 5’d9: begin tens = 4‘d0; ones = 4’d9; end 5‘d10: begin tens = 4’d1; ones = 4‘d0; end 5’d11: begin tens = 4‘d1; ones = 4’d1;

end 5‘d12: begin tens = 4’d1; ones = 4‘d2; end 5’d13: begin tens = 4‘d1; ones = 4’d3;

end 5‘d14: begin tens = 4’d1; ones = 4‘d4; end 5’d15: begin tens = 4‘d1; ones = 4’d5; end 5‘d16: begin tens = 4’d1; ones = 4‘d6; end 5’d17: begin tens = 4‘d1; ones = 4’d7; end 5‘d18: begin tens = 4’d1; ones = 4‘d8; end 5’d19: begin tens = 4‘d1; ones = 4’d9; end 5‘d20: begin tens = 4’d2; ones = 4‘d0; end 5’d21: begin tens = 4‘d2; ones = 4’d1; end 5

‘d22: begin tens = 4’d2; ones = 4‘d2; end 5’d23: begin tens = 4‘d2; ones = 4’d3; end 5

‘d24: begin tens = 4’d2; ones = 4‘d4; end 5’d25: begin tens = 4‘d2; ones = 4’d5; end 5

‘d26: begin tens = 4’d2; ones = 4‘d6; end 5’d27: begin tens = 4‘d2; ones = 4’d7; end 5

‘d28: begin tens = 4’d2; ones = 4‘d8; end 5’d29: begin tens = 4‘d2; ones = 4’d9; end 5

‘d30: begin tens = 4’d3; ones = 4‘d0; end 5’d31: begin tens = 4‘d3; ones = 4’d1; endendcase /*integer i; always @(binary_data)begin tens = 4‘d0; ones = 4’d0; for (i=7; i 》= 0; i=i-1) begin if (tens》=5) tens = tens +3; if (ones 》= 5) ones = ones +3; tens = tens 《《 1; tens[0] = ones[3]; ones = ones 《《 1; ones[0] = binary_data[i]; endend*/ endmodule

至于2個(gè)7段數(shù)碼管的顯示驅(qū)動(dòng),由于小腳丫FPGA核心板上管腳比較富裕,采用了直接映射的方式,在很多管腳受限的應(yīng)用場(chǎng)景需要用到動(dòng)態(tài)掃描的方式或通過(guò)專用的芯片來(lái)擴(kuò)展,在后面時(shí)序邏輯部分的示例中會(huì)再講。

2個(gè)7段數(shù)碼管的顯示驅(qū)動(dòng)代碼如下:

// ********************************************************************// 》》》》》》》》》》》》》》》》》》》》》》》》》 COPYRIGHT NOTICE 《《《《《《《《《《《《《《《《《《《《《《《《《//

********************************************************************// File name : segment.v// Module name : segment// Author : STEP// Description : segment initial// Web : www.stepfpga.com// // --------------------------------------------------------------------// Code Revision History : // --------------------------------------------------------------------// Version: |Mod. Date: |Changes Made:// V1.0 |2021/10/08 |Initial ver// --------------------------------------------------------------------// Module Function:數(shù)碼管的譯碼模塊初始化

module LED (seg_data_1,seg_data_2,seg_led_1,seg_led_2); input [3:0] seg_data_1; //數(shù)碼管需要顯示0~9十個(gè)數(shù)字,所以最少需要4位輸入做譯碼

input [3:0] seg_data_2; //小腳丫上第二個(gè)數(shù)碼管 output [8:0] seg_led_1; //在小腳丫上控制一個(gè)數(shù)碼管需要9個(gè)信號(hào) MSB~LSB=DIG、DP、G、F、E、D、C、B、A output [8:0] seg_led_2; //在小腳丫上第二個(gè)數(shù)碼管的控制信號(hào) MSB~LSB=DIG、DP、G、F、E、D、C、B、A reg [8:0] seg [9:0]; //定義了一個(gè)reg型的數(shù)組變量,相當(dāng)于一個(gè)10*9的存儲(chǔ)器,存儲(chǔ)器一共有10個(gè)數(shù),每個(gè)數(shù)有9位寬

initial //在過(guò)程塊中只能給reg型變量賦值,Verilog中有兩種過(guò)程塊always和initial //initial和always不同,其中語(yǔ)句只執(zhí)行一次 begin seg[0] = 9‘h3f; //對(duì)存儲(chǔ)器中第一個(gè)數(shù)賦值9’b00_0011_1111,相當(dāng)于共陰極接地,DP點(diǎn)變低不亮,7段顯示數(shù)字 0 seg[1] = 9‘h06; //7段顯示數(shù)字 1 seg[2] = 9’h5b; //7段顯示數(shù)字 2 seg[3] = 9‘h4f;

//7段顯示數(shù)字 3 seg[4] = 9’h66; //7段顯示數(shù)字 4 seg[5] = 9‘h6d; //7段顯示數(shù)字 5 seg[6] = 9’h7d; //7段顯示數(shù)字 6 seg[7] = 9‘h07; //7段顯示數(shù)字

7 seg[8] = 9’h7f; //7段顯示數(shù)字 8 seg[9] = 9‘h6f; //7段顯示數(shù)字 9 end assign seg_led_1 = seg[seg_data_1]; //連續(xù)賦值,這樣輸入不同四位數(shù),就能輸出對(duì)于譯碼的9位輸出assign seg_led_2 = seg[seg_data_2]; endmodule

大家看到了這段代碼有詳細(xì)的注釋,是不是感覺(jué)可讀性增加了很多?這是我們Web IDE中的案例代碼,可以直接復(fù)制到你自己的項(xiàng)目中來(lái)使用,作為一種示例,也是希望大家能夠體會(huì)到注釋的重要性,以后在自己的項(xiàng)目中加強(qiáng)這方面的規(guī)范性。

** 由于微信的編輯器對(duì)Verilog代碼的格式識(shí)別和支持不夠,顯示的效果與我們Web IDE上不同。

代碼編寫完畢,在Web IDE中點(diǎn)擊“邏輯綜合”,系統(tǒng)會(huì)根據(jù)你的頂層文件自動(dòng)提取端口的管腳,讓你非常便捷給相應(yīng)的信號(hào)綁定器件的管腳,如下圖示。

綁定完管腳,點(diǎn)擊保存 - -》 FPGA映射,生成可以下載的jed文件,鼠標(biāo)指向下載JED文件的圖標(biāo),右鍵保存到StepFPGA16的盤里,就完成了對(duì)FPGA的編程,你手里的小腳丫FPGA就成了一個(gè)4位的加法器。

搞定!

如果你也能夠獨(dú)立完成這個(gè)項(xiàng)目,那你:

對(duì)數(shù)字電路部分的組合邏輯有了非常深刻的認(rèn)識(shí);

對(duì)FPGA的使用,尤其是管腳的配置、外設(shè)的狀態(tài)、顯示器件的使用有了深刻的認(rèn)識(shí);

對(duì)Verilog的語(yǔ)法使用有了更多、更深入的體會(huì),包括多module的設(shè)計(jì)思路、module之間的接口、并行執(zhí)行等。

來(lái)試一試吧。

責(zé)任編輯:haq

聲明:本文內(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)注

    173

    文章

    6026

    瀏覽量

    174968
  • Verilog
    +關(guān)注

    關(guān)注

    29

    文章

    1367

    瀏覽量

    112216
  • 加法器
    +關(guān)注

    關(guān)注

    6

    文章

    183

    瀏覽量

    30746

原文標(biāo)題:淺談“數(shù)字電路”的學(xué)習(xí)(9) - 小腳丫上實(shí)現(xiàn)4位加法器并數(shù)碼管顯示結(jié)果

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    【基于Lattice MXO2的小腳丫FPGA核心板】工程創(chuàng)建和固件燒錄

    基于Lattice MXO2 LPC的小腳丫FPGA核心板 - Type C接口 開(kāi)發(fā)板的硬件規(guī)格如下: 核心器件:Lattice LCMXO2-4000HC-
    發(fā)表于 01-31 21:01

    【基于Lattice MXO2的小腳丫FPGA核心板】03數(shù)碼管顯示控制

    ] seg_led_1;//在小腳丫上控制一個(gè)數(shù)碼管需要9個(gè)信號(hào) MSB~LSB=DIG、DP、G、F、E、D、C、B、A output [8:0] seg_led_2;//在小腳丫上第二個(gè)數(shù)碼管的控制
    發(fā)表于 02-29 09:01

    加法器

    請(qǐng)問(wèn)下大家,,進(jìn)位選擇加法器和進(jìn)位跳躍加法器的區(qū)別是啥啊?我用Verilog實(shí)現(xiàn)16他們的加法器有什么樣的不同???還請(qǐng)知道的大神告訴我一下
    發(fā)表于 10-20 20:23

    4并行的BCD加法器電路圖

       圖二所示為4并行的BCD加法器電路。其中上面加法器的輸入來(lái)自低一級(jí)的BCD數(shù)字。下
    發(fā)表于 03-28 16:35 ?1.4w次閱讀
    <b class='flag-5'>4</b><b class='flag-5'>位</b>并行的BCD<b class='flag-5'>加法器</b>電路圖

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

    加法器,加法器是什么意思 加法器 :  加法器是為了實(shí)現(xiàn)加法的。  即是產(chǎn)生數(shù)的和的裝置。加數(shù)
    發(fā)表于 03-08 16:48 ?5750次閱讀

    FPU加法器的設(shè)計(jì)與實(shí)現(xiàn)

    浮點(diǎn)運(yùn)算器的核心運(yùn)算部件是浮點(diǎn)加法器,它是實(shí)現(xiàn)浮點(diǎn)指令各種運(yùn)算的基礎(chǔ),其設(shè)計(jì)優(yōu)化對(duì)于提高浮點(diǎn)運(yùn)算的速度和精度相當(dāng)關(guān)鍵。文章從浮點(diǎn)加法器算法和電路實(shí)現(xiàn)
    發(fā)表于 07-06 15:05 ?47次下載
    FPU<b class='flag-5'>加法器</b>的設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

    8加法器和減法器設(shè)計(jì)實(shí)習(xí)報(bào)告

    8加法器和減法器設(shè)計(jì)實(shí)習(xí)報(bào)告
    發(fā)表于 09-04 14:53 ?134次下載

    基于選擇進(jìn)位32加法器的硬件電路實(shí)現(xiàn)

    為了縮短加法電路運(yùn)行時(shí)間,提高FPGA運(yùn)行效率,利用選擇進(jìn)位算法和差額分組算法用硬件電路實(shí)現(xiàn)32加法器,差額分組中的
    發(fā)表于 09-18 14:32 ?33次下載
    基于選擇進(jìn)位32<b class='flag-5'>位</b><b class='flag-5'>加法器</b>的硬件電路<b class='flag-5'>實(shí)現(xiàn)</b>

    通過(guò)小腳丫板載的兩個(gè)數(shù)碼管來(lái)顯示字符

    今天我們?nèi)蝿?wù)是通過(guò)小腳丫板載的兩個(gè)數(shù)碼管來(lái)顯示字符,所以首先我們要了解一下數(shù)碼管的基本工作原理,接下來(lái)再研究怎么通過(guò)搗鼓小腳丫把數(shù)碼管給點(diǎn)亮,并且顯示出有效信息。 ? 小腳丫板載的數(shù)碼管是 7 段數(shù)
    的頭像 發(fā)表于 01-06 17:17 ?6175次閱讀
    通過(guò)<b class='flag-5'>小腳丫</b>板載的兩個(gè)數(shù)碼管來(lái)顯示字符

    通過(guò)小腳丫FPGA搭建實(shí)驗(yàn)電路并驗(yàn)證一個(gè)二進(jìn)制比較器

    前一篇文章我們介紹了通過(guò)小腳丫FPGA核心開(kāi)發(fā)板來(lái)進(jìn)行門電路的實(shí)驗(yàn)過(guò)程。當(dāng)然,我們還可以畫出更多復(fù)雜的門電路組合,并且通過(guò)小腳丫FPGA輕松
    的頭像 發(fā)表于 01-06 17:19 ?5775次閱讀

    加法器是如何實(shí)現(xiàn)

     verilog實(shí)現(xiàn)加法器,從底層的門級(jí)電路級(jí)到行為級(jí),本文對(duì)其做出了相應(yīng)的闡述。
    發(fā)表于 02-18 14:53 ?6633次閱讀
    <b class='flag-5'>加法器</b>是如何<b class='flag-5'>實(shí)現(xiàn)</b>的

    4加法器開(kāi)源分享

    電子發(fā)燒友網(wǎng)站提供《4加法器開(kāi)源分享.zip》資料免費(fèi)下載
    發(fā)表于 07-08 09:33 ?3次下載
    <b class='flag-5'>4</b><b class='flag-5'>位</b><b class='flag-5'>加法器</b>開(kāi)源分享

    加法器的原理及采用加法器的原因

    有關(guān)加法器的知識(shí),加法器是用來(lái)做什么的,故名思義,加法器是為了實(shí)現(xiàn)加法的,它是一種產(chǎn)生數(shù)的和的裝置,那么
    的頭像 發(fā)表于 06-09 18:04 ?5747次閱讀

    4加法器的構(gòu)建

    電子發(fā)燒友網(wǎng)站提供《4加法器的構(gòu)建.zip》資料免費(fèi)下載
    發(fā)表于 07-04 11:20 ?0次下載
    <b class='flag-5'>4</b><b class='flag-5'>位</b><b class='flag-5'>加法器</b>的構(gòu)建

    基于FPGA實(shí)現(xiàn)Mem加法器

    前段時(shí)間和幾個(gè)人閑談,看看在FPGA里面實(shí)現(xiàn)一個(gè)Mem加法器怎么玩兒
    的頭像 發(fā)表于 10-17 10:22 ?955次閱讀
    基于<b class='flag-5'>FPGA</b><b class='flag-5'>實(shí)現(xiàn)</b>Mem<b class='flag-5'>加法器</b>