⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datapadunit.v

📁 hmac的verilog代码, 通过控制字选择进行sha1运算或hmac运算
💻 V
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////    				module describe// name: 			datapadunit// function:	data padding including keypad// writer:		zy// data:			2006/11/08// version:		1.1// feature:		the lenth of the message (by bits)  is //						not obligatory, but it must be the //						multiple of 8.// address: 	0 - ctrl word//						1 - keyin//						2 - lengthin//						3 - datain//						4 - status//						5-9 - digest out//						15 - mask////////////////////////////////////////////////////////module datapadunit(en,clk,reset,wr,padflg,datain,addr,hashover,modsel,md1in,paddata,dataready,expadflgreg,lenerror,procsel,keyreadyreg,digestreadyreg);//general inputinput en,clk,reset,wr;input [31:0] datain;input [3:0]  addr;//intermodule inputinput padflg;input hashover;input modsel;input [159:0] md1in;//outputoutput [511:0] paddata;output dataready;output expadflgreg;output lenerror;output [1:0] procsel;output keyreadyreg;output digestreadyreg;//for the outputreg [511:0] paddata;reg dataready;reg expadflgreg;reg lenerror;reg [1:0] procsel;reg digestreadyreg;//reg keyready; //use for the modulereg [2:0] keycnt;reg [3:0] datacnt;reg [63:0] datalength;reg [159:0] keyreg;//reg lenerror;reg keyreadyreg;reg expadflg;reg fulllengthreg;reg [31:0] datatmp;//ctrl signalreg keyinc;reg keycntclr;reg datainc;reg datacntclr;reg ikeyready;reg okeyready;reg paddataready;reg error;reg md1ready;reg resultready;reg fulllength;reg expadflgclr;//use for the state machinereg [4:0] currentstate;reg [4:0] nextstate;//state defineparameter idle = 0;parameter rxkey = 1;parameter sendikey = 2;parameter waitiv1 = 3;parameter sendokey = 4;parameter waitiv2 = 5;parameter rxlength = 6;parameter rxdata = 7;parameter datapad = 8;parameter lengthpad = 9;parameter senddata = 10;parameter expad = 11;parameter sendmd1 = 12;parameter waitmd2 = 13;parameter digestready = 14;parameter lengtherror =15;parameter hmackeyready = 16;//parameter defineparameter ipad = 8'b00110110;parameter opad = 8'b01011100;//store the inputdata in the datatmp;always @(posedge clk)begin	if (reset)		datatmp <= 0;	else if (en && ((addr == 1) || (addr == 2) || (addr == 3)))		datatmp <= datain;end//expad regalways @(posedge clk)begin	if (reset)		expadflgreg <= 0;	else if (expadflg)		expadflgreg <= 1;	else if (expadflgclr)		expadflgreg <= 0;end//fulllength regalways @(posedge clk)begin	if (reset)		fulllengthreg <= 0;	else if (fulllength)		fulllengthreg <= 1;	else if (resultready)		fulllengthreg <= 0;end//lenerror regalways @(posedge clk)begin	if (reset)		lenerror <= 0;	else		lenerror <= error;end		//count the key blockalways @(posedge clk)begin	if (reset)		keycnt <= 0;	else if (keyinc)		keycnt <= keycnt+1;	else if (keycntclr)		keycnt <= 0;	else		keycnt <= keycnt;end//count the data blockalways @(posedge clk)begin	if (reset)		datacnt <= 0;	else if (datainc)		datacnt <= datacnt+1;	else if (datacntclr)		datacnt <= 0;	else		datacnt <= datacnt;end//control dataready signalalways @(posedge clk)begin	if (reset)		dataready <= 0;	else if (ikeyready || okeyready || paddataready || md1ready)		dataready <= 1;	else		dataready <=0;end//digestready regalways @(posedge clk)begin	if (reset)		digestreadyreg <= 0;	else if (resultready)		digestreadyreg <= 1;	else if (en && wr && addr==9)		digestreadyreg <= 0;end//state machine descriptionalways @(posedge clk)begin	if (reset)		currentstate <= idle;	else		currentstate <= nextstate;endalways @(*)begin		nextstate = idle;	keyinc = 0;	datainc = 0;	ikeyready = 0;	okeyready = 0;	paddataready = 0;	error = 0;	md1ready = 0;	resultready = 0;	expadflg = 0;	keycntclr = 0;	datacntclr = 0;	fulllength = 0;	expadflgclr = 0;	case (currentstate)		idle:			begin				if (en && !wr && (addr == 1) && (modsel == 1))					nextstate = rxkey;				else if (en && !wr && (addr == 2) && !lenerror)					nextstate = rxlength;				else if (en && !wr && (addr == 3))					nextstate = rxdata;				else if (expadflgreg && hashover && padflg)					nextstate = expad;				else if (hashover && modsel && padflg)					nextstate = sendmd1;				else if (hashover && fulllengthreg)					nextstate = expad;				else if (hashover && ((!modsel && padflg && !expadflgreg) || (!padflg)))					nextstate = digestready;				else if ((!padflg && (datalength[8:0]!=0)) || (datalength[2:0] != 0))					nextstate = lengtherror;				else					nextstate = idle;			end		rxkey:			begin				keyinc = 1;				if (keycnt==4)					begin						nextstate = sendikey;					end				else if (en && !wr && (addr == 1))//in case of the writting operation followed clk by clk					nextstate = rxkey;				else 					nextstate = idle;							end		sendikey:			begin				ikeyready = 1;				keycntclr = 1;				nextstate = waitiv1;			end		waitiv1:			begin			keycntclr = 0;			ikeyready = 0;				if (hashover)					begin						nextstate = sendokey;					end				else					nextstate = waitiv1;			end		sendokey:			begin				okeyready = 1;				nextstate = waitiv2;			end		waitiv2:			begin				if (hashover)					begin						nextstate = hmackeyready;					end				else					nextstate = waitiv2;			end		hmackeyready:			begin				nextstate = idle;			end		rxlength:			begin//				if((datain==0) && padflg)//					nextstate = datapad;//				else					nextstate = idle;			end		rxdata:			begin				datainc =1;				if (en && !wr && (addr == 3))					nextstate = rxdata;				else if ((datacnt==15) && !padflg)					nextstate = senddata;				else if (((datacnt == datalength[8:5]-1) && (datalength[4:3]==0) && padflg) || ((datacnt == datalength[8:5]) && (datalength[4:3]!=0  && padflg)))					nextstate = datapad;				else if (padflg && (datacnt == 15))					begin						nextstate = senddata;						fulllength = 1;					end				else					nextstate = idle;			end		datapad:		 	begin		 		datainc = 0;		 		if ((datalength[8:6] == 7) || (datalength[8:0] == 0))		 			begin		 				expadflg = 1;		 				nextstate = senddata;		 			end		 		else		 			nextstate = lengthpad;		 	end		lengthpad:			begin				nextstate = senddata;			end		senddata:			begin				datainc = 0;				datacntclr = 1;				paddataready = 1;				nextstate = idle;			end		expad:			begin				paddataready = 1;				expadflgclr = 1;				nextstate = idle;			end		sendmd1:			begin				md1ready =1;				nextstate = waitmd2;			end		waitmd2:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -