国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

FPGA實現(xiàn)二進制轉(zhuǎn)BCD碼

這篇具有很好參考價值的文章主要介紹了FPGA實現(xiàn)二進制轉(zhuǎn)BCD碼。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

FPGA實現(xiàn)二進制轉(zhuǎn)BCD碼,FPGA學習,fpga開發(fā),算法,bcd實現(xiàn)

1、簡介

bcd碼:以4bit二進制碼表示一個十進制碼

例如,432(d) = 0100-0011-0010(bcd)
這里具體的判斷方法為:(滿5)加3法
二進制位寬為W,則BCD位寬只需要(W + (W - 4) / 3+1)位

2、參考鏈接

FPGA Verilog實現(xiàn)二進制轉(zhuǎn)BCD碼

二進制數(shù)轉(zhuǎn)換成BCD碼的Verilog實現(xiàn)

3、實現(xiàn)方案

3-1、wiki實現(xiàn)

/*方法1:來自維基百科,可以看出,二進制位寬為W,則BCD位寬只需要(W + (W - 4) / 3+1)位。
如W=8,只需要10位,范圍0-255,百位只需要兩位就可以表示。
*/
module binary2bcd#(parameter WIDTH = 20)(	
	input			[WIDTH-1:00]	bin_data, //
	output	reg 	[WIDTH+(WIDTH-4)/3:00]	bcd_data	
);
//Parameter Declarations
	integer i,j;

	always @(bin_data)begin 
		for(i = 0;i <= WIDTH+(WIDTH-4)/3; i = i + 1) 
			bcd_data[i] = 0;
		bcd_data[WIDTH-1:0] = bin_data;
		for(i = 0;i <= WIDTH-4; i = i + 1) 
			for(j = 0;j <= i / 3; j = j + 1)
				if(bcd_data[WIDTH-i+4*j-:4] > 4)begin
					bcd_data[WIDTH-i+4*j-:4] <= bcd_data[WIDTH-i+4*j-:4] + 4'd3; 
				end 
		
	end //always end

endmodule

3-2、狀態(tài)機實現(xiàn)

方法2:狀態(tài)機實現(xiàn),延遲時間為 (輸入數(shù)據(jù)位寬+2) * Tclk
/* ================================================ *\
		Filename    ﹕ binary2bcd.v
		Author      ﹕ Adolph
		Description ﹕ 實現(xiàn)32bit以內(nèi)的二進制數(shù)據(jù)轉(zhuǎn)換為BCD
		Called by   ﹕ 
Revision History    ﹕ 2023-07-07 11:50:10
					Revision 1.0
			Email﹕ adolph1354238998@gamil.com
			Company﹕ AWCloud...Std 
\* ================================================ */
module binary2bcd #(parameter BIN_W = 32, BCD_W = 40)(
	input  					Clk		, //system clock 50MHz
	input  			 		Rst_n	, //reset, low valid
	
	input					Start	, //
	input 	   [BIN_W-1:00]	Bin_data, //
	output reg				bcd_vld	, //	
	output reg [BCD_W-1:00]	Bcd_data  //
);
//Parameter Declarations
	//狀態(tài)機參數(shù)定義
	parameter	
		IDLE	=	4'b0001, 
		READY	=	4'b0010,
		SHIFT	=	4'b0100,
		DONE	=	4'b1000;

//Internal wire/reg declarations
	reg		[BIN_W-1:00] 	din_r; //
	
	reg		[05:00]	cnt		; //Counter 移位計數(shù)器
	wire			add_cnt ; //Counter Enable
	wire			end_cnt ; //Counter Reset 

	reg		[03:00]	state_c, state_n; //

	reg		[03:00] mem_r  	[09:00]	; //
	wire	[03:00] mem_w	[09:00]	; //
	
	wire	[39:00] bcd_res ; //
	wire 			idle2ready	; //
	wire 			shift2done	; //
	// reg			 	bcd_vld 	; //
	
	
//Logic Description
	always @(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)begin  
			cnt <= 'd0; 
		end  
		else if(add_cnt)begin  
			if(end_cnt)begin  
				cnt <= 'd0; 
			end  
			else begin  
				cnt <= cnt + 1'b1; 
			end  
		end  
		else begin  
			cnt <= cnt;  
		end  
	end 
			
	assign add_cnt = state_c == SHIFT; 
	assign end_cnt = add_cnt && cnt >= BIN_W - 1; 

	
	//第一段設置狀態(tài)轉(zhuǎn)移空間
	always @(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)begin
			state_c <= IDLE;
		end
		else begin
			state_c <= state_n;
		end
	end //always end
	//第二段、組合邏輯定義狀態(tài)轉(zhuǎn)移
	always@(*)begin
		case(state_c)
			IDLE:begin
				if(idle2ready)begin
					state_n = READY;
				end
				else begin
					state_n = state_c;
				end
			end
			READY:begin
				state_n = SHIFT;
			end
			SHIFT:begin
				if(shift2done)begin
					state_n = DONE;
				end 
				else begin
					state_n = state_c;	
				end 
			end
			DONE:begin
				state_n = IDLE;
			end 
			default: begin
				state_n = IDLE;
			end
		endcase
	end //always end
			
	assign	idle2ready	=	state_c == IDLE	 && Start;
	assign	shift2done	=	state_c	== SHIFT &&	end_cnt;
			
	//第三段,定義狀態(tài)機輸出情況,可以時序邏輯,也可以組合邏輯
	always @(posedge Clk or negedge Rst_n)begin  
		if(!Rst_n)begin  
			din_r <= 'd0;
		end  
		else if(Start)begin  
			din_r <= Bin_data;
		end  
		else if(state_c == SHIFT)begin //移位狀態(tài)下,每個時鐘周期向左移1位
			din_r <= din_r << 1;
		end
		else begin  
			din_r <= din_r;
		end  
	end //always end

	always @(posedge Clk or negedge Rst_n)begin 
		if(!Rst_n)begin
			mem_r[0] <= 4'd0;		
			mem_r[1] <= 4'd0;	
			mem_r[2] <= 4'd0;	
			mem_r[3] <= 4'd0;	
			mem_r[4] <= 4'd0;	
			mem_r[5] <= 4'd0;	
			mem_r[6] <= 4'd0;	
			mem_r[7] <= 4'd0;	
			mem_r[8] <= 4'd0;	
			mem_r[9] <= 4'd0;		
		end  
		else if(idle2ready)begin
			mem_r[0] <= 4'd0;		
			mem_r[1] <= 4'd0;	
			mem_r[2] <= 4'd0;	
			mem_r[3] <= 4'd0;	
			mem_r[4] <= 4'd0;	
			mem_r[5] <= 4'd0;	
			mem_r[6] <= 4'd0;	
			mem_r[7] <= 4'd0;	
			mem_r[8] <= 4'd0;	
			mem_r[9] <= 4'd0;	
		end  
		else if(state_c == SHIFT)begin
			mem_r[0] <= {mem_w[0][2:0],din_r[BIN_W-1]};		
			mem_r[1] <= {mem_w[1][2:0],mem_w[0][3]   };	
			mem_r[2] <= {mem_w[2][2:0],mem_w[1][3]   };	
			mem_r[3] <= {mem_w[3][2:0],mem_w[2][3]   };	
			mem_r[4] <= {mem_w[4][2:0],mem_w[3][3]   };	
			mem_r[5] <= {mem_w[5][2:0],mem_w[4][3]   };	
			mem_r[6] <= {mem_w[6][2:0],mem_w[5][3]   };	
			mem_r[7] <= {mem_w[7][2:0],mem_w[6][3]   };	
			mem_r[8] <= {mem_w[8][2:0],mem_w[7][3]   };	
			mem_r[9] <= {mem_w[9][2:0],mem_w[8][3]   };	
		end
		else ;
	end //always end
	
	//組合邏輯近乎沒有時延
	assign mem_w[0] = (mem_r[0] > 4'd4) ? (mem_r[0] + 4'd3) : mem_r[0];
	assign mem_w[1] = (mem_r[1] > 4'd4) ? (mem_r[1] + 4'd3) : mem_r[1];
	assign mem_w[2] = (mem_r[2] > 4'd4) ? (mem_r[2] + 4'd3) : mem_r[2];
	assign mem_w[3] = (mem_r[3] > 4'd4) ? (mem_r[3] + 4'd3) : mem_r[3];
	assign mem_w[4] = (mem_r[4] > 4'd4) ? (mem_r[4] + 4'd3) : mem_r[4];
	assign mem_w[5] = (mem_r[5] > 4'd4) ? (mem_r[5] + 4'd3) : mem_r[5];
	assign mem_w[6] = (mem_r[6] > 4'd4) ? (mem_r[6] + 4'd3) : mem_r[6];
	assign mem_w[7] = (mem_r[7] > 4'd4) ? (mem_r[7] + 4'd3) : mem_r[7];
	assign mem_w[8] = (mem_r[8] > 4'd4) ? (mem_r[8] + 4'd3) : mem_r[8];
	assign mem_w[9] = (mem_r[9] > 4'd4) ? (mem_r[9] + 4'd3) : mem_r[9];

	assign bcd_res = {mem_r[9],mem_r[8],mem_r[7],mem_r[6],mem_r[5],mem_r[4],mem_r[3],mem_r[2],mem_r[1],mem_r[0]};

	always @(posedge Clk or negedge Rst_n)begin 
		if(!Rst_n)begin
			bcd_vld <= 1'b0;
		end  
		else begin
			bcd_vld <= (state_c == DONE);
		end
	end //always end
	
	always @(posedge Clk or negedge Rst_n)begin 
		if(!Rst_n)begin
			Bcd_data <= 'd0;
		end  
		else if(state_c == DONE)begin
			Bcd_data <= bcd_res[BCD_W-1:0];
		end  
		else begin
			Bcd_data <= Bcd_data;
		end
	end //always end
	
endmodule
//仿真測試文件
/* ================================================ *\
		Filename    ﹕ tb_binary2bcd.v
		Author      ﹕ Adolph
		Description ﹕ 
		Called by   ﹕ 
Revision History    ﹕ 2023-07-07 11:50:10
					Revision 1.0
			Email﹕ adolph1354238998@gamil.com
			Company﹕ AWCloud...Std 
\* ================================================ */ 

`timescale 1ns/1ns 		//仿真系統(tǒng)時間尺度定義

`define clk_period 20  	//時鐘周期宏定義	

module tb_binary2bcd; 
//激勵信號定義  
	reg				Clk		; 
	reg				Rst_n	; 
	reg		[31:00] bin_data; //
	reg			 	Start 	; //
	
//響應信號定義	  
// 	wire 	[24:00]	bcd_data;	

//實例化
	binary2bcd #(.BIN_W (32), .BCD_W(40)) BIN2BCD(
		/*input  					*/.Clk		(Clk	 ), //system clock 50MHz
		/*input  			 		*/.Rst_n	(Rst_n	 ), //reset, low valid	
		/*input						*/.Start	(Start	 ), //
		/*input 	   [BIN_W-1:00]	*/.Bin_data (bin_data), //
		/*output reg				*/.bcd_vld	(), //	
		/*output reg [BCD_W-1:00]	*/.Bcd_data ()  //
	);

//產(chǎn)生時鐘							       		 
	initial Clk = 1'b0;		       		 
	always #(`clk_period / 2) Clk = ~Clk;  		 

//產(chǎn)生激勵	 
	initial  begin	 
		Rst_n = 1'b0;	 
		bin_data = 0;
		Start = 1'b0;
		#(`clk_period * 1 + 3);	 
		Rst_n = 1'b1;	 
		repeat(30)begin
			bin_data = {$random} % 99999;
			Start = 1'b1;
			#`clk_period Start = 1'b0;
			@(negedge BIN2BCD.bcd_vld);
			#`clk_period;
		end
		#(`clk_period * 20); 
		$stop(2); 
	end	 

endmodule

3-3、仿真測試

modelsim仿真驗證
FPGA實現(xiàn)二進制轉(zhuǎn)BCD碼,FPGA學習,fpga開發(fā),算法,bcd實現(xiàn)
至此,結(jié)束文章來源地址http://www.zghlxwxcb.cn/news/detail-536388.html

到了這里,關于FPGA實現(xiàn)二進制轉(zhuǎn)BCD碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 基于FPGA的3位二進制的乘法器VHDL代碼Quartus 開發(fā)板

    基于FPGA的3位二進制的乘法器VHDL代碼Quartus 開發(fā)板

    名稱:基于FPGA的3位二進制的乘法器VHDL代碼Quartus? 開發(fā)板(文末獲?。?軟件:Quartus 語言:VHDL 代碼功能: 3位二進制的乘法器 該乘法器實現(xiàn)兩個三位二進制的乘法,二極管LED2~LED0顯示輸入的被乘數(shù),LED5~LED3顯示乘數(shù),數(shù)碼管顯示相應的十進制輸入值和輸出結(jié)果 本代碼已在開

    2024年02月21日
    瀏覽(22)
  • verilog實現(xiàn)二進制轉(zhuǎn)BCD碼-加3移位法

    verilog實現(xiàn)二進制轉(zhuǎn)BCD碼-加3移位法

    BCD碼用4位二進制數(shù)表示一個十進制數(shù),最常用的BCD碼是8421碼,用4’b0000-4’b1001表示十進制數(shù)字0-9,接下來默認BCD碼就是8421碼。 在FPGA中使用數(shù)碼管時,段選信號不好記,所以我們用BCD碼表示一個數(shù)碼管的數(shù)值,將BCD碼轉(zhuǎn)化為段選信號驅(qū)動數(shù)碼管,數(shù)碼管驅(qū)動可以這篇文章:

    2024年02月06日
    瀏覽(28)
  • 【FPGA】Verilog:二進制并行加法器 | 超前進位 | 實現(xiàn) 4 位二進制并行加法器和減法器 | MSI/LSI 運算電路

    【FPGA】Verilog:二進制并行加法器 | 超前進位 | 實現(xiàn) 4 位二進制并行加法器和減法器 | MSI/LSI 運算電路

    0x00 并行加法器和減法器 如果我們要對 4 位加法器和減法器進行關于二進制并行運算功能,可以通過將加法器和減法器以 N 個并行連接的方式,創(chuàng)建一個執(zhí)行 N 位加法和減法運算的電路。 4 位二進制并行加法器 4 位二進制并行減法器

    2024年02月05日
    瀏覽(23)
  • 【FPGA】Verilog:計數(shù)器 | 異步計數(shù)器 | 同步計數(shù)器 | 2位二進制計數(shù)器的實現(xiàn) | 4位十進制計數(shù)器的實現(xiàn)

    【FPGA】Verilog:計數(shù)器 | 異步計數(shù)器 | 同步計數(shù)器 | 2位二進制計數(shù)器的實現(xiàn) | 4位十進制計數(shù)器的實現(xiàn)

    目錄 Ⅰ. 實踐說明 0x00 計數(shù)器(Counter) 0x01 異步計數(shù)器(Asynchronous Counter)

    2024年02月05日
    瀏覽(34)
  • 【FPGA仿真】Matlab生成二進制、十六進制的txt數(shù)據(jù)以及Vivado讀取二進制、十六進制數(shù)據(jù)并將結(jié)果以txt格式保存

    在使用Vivado軟件進行Verilog程序仿真時可能需要對模塊輸入仿真的數(shù)據(jù),因此我們需要一個產(chǎn)生數(shù)據(jù)的方法(二進制或者十六進制的數(shù)據(jù)),Matlab軟件是一個很好的工具,當然你也可以使用VS等工具。 以下分別給出了使用Matlab模擬產(chǎn)生二進制和十六進制數(shù)據(jù)的例子,例子僅供參

    2024年02月01日
    瀏覽(145)
  • [FPGA]用Verilog寫一個簡單三位二進制加法器和減法器

    [FPGA]用Verilog寫一個簡單三位二進制加法器和減法器

    加法器和減法器是數(shù)字電路中的基本組件,它們可以對二進制數(shù)進行算術運算。加法器可以將兩個或多個二進制數(shù)相加,得到一個和和一個進位。減法器可以將兩個二進制數(shù)相減,得到一個差和一個借位。加法器和減法器可以用來實現(xiàn)更高級的運算,例如乘法、除法、移位等

    2024年02月04日
    瀏覽(18)
  • 【FPGA】Verilog:時序電路設計 | 二進制計數(shù)器 | 計數(shù)器 | 分頻器 | 時序約束

    【FPGA】Verilog:時序電路設計 | 二進制計數(shù)器 | 計數(shù)器 | 分頻器 | 時序約束

    前言: 本章內(nèi)容主要是演示Vivado下利用Verilog語言進行電路設計、仿真、綜合和下載 示例:計數(shù)器與分頻器 ? ?? 功能特性:?采用?Xilinx Artix-7 XC7A35T芯片? 配置方式:USB-JTAG/SPI Flash 高達100MHz 的內(nèi)部時鐘速度? 存儲器:2Mbit SRAM ??N25Q064A SPI Flash(樣圖舊款為N25Q032A) 通用

    2024年02月02日
    瀏覽(34)
  • 用74LS73設計四位二進制加法計數(shù)器和8421BCD加法計數(shù)器

    用74LS73設計四位二進制加法計數(shù)器和8421BCD加法計數(shù)器

    ?(1)用2片74LS73實現(xiàn)該電路,由CP端輸入單脈沖,設計并畫出4位異步二進制加法計數(shù)器電路圖。 ?(2)由CP端輸入單脈沖,測試并記錄Q1~Q4端狀態(tài)及波形。 四位二進制加法計數(shù)器狀態(tài)遷移表如下: Q 4n Q 3n Q 2n Q 1n Q 4n+1 Q 3n+1 Q 2n+1 Q 1n+1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0

    2024年02月10日
    瀏覽(70)
  • 二進制安全學習 第一天

    二進制安全學習 第一天

    (僅用作自己學習)XMCVE 2020 CTF Pwn入門課程_嗶哩嗶哩_bilibili ? 屏幕剪輯的捕獲時間: 2024/3/15 17:13 ? ? Terminal:終端 shell:區(qū)別于GUI的提供給系統(tǒng)的用戶接口 ? 為什么c和c++的市場占額會下不去? 很多編譯型語言都存在,Gc:垃圾收集器,例如 go語言,雖然也能編譯成二進制程

    2024年04月17日
    瀏覽(33)
  • 二進制學習(pwn)-shellcode

    二進制學習(pwn)-shellcode

    安裝好了pwntool、ROPgadget、onegadget以及pwngdb,讀懂并手寫腳本復現(xiàn)了上一篇中基于64位有后門的棧溢出漏洞,恭喜你少年,你已經(jīng)完成二進制的筑基啦。接下來,我們要介紹的是棧溢出的第二種利用形式:基于shellcode的棧溢出。 在編程語言中要想獲得系統(tǒng)執(zhí)行權限,可以使用s

    2024年02月08日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包