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

📄 gollman.v

📁 实现FPGA的加密程序
💻 V
字号:
module gollman( clk,reset,ena,data,done);//,iena),enab,enac,enad );

parameter	keya = 7'b1011011;	//1st LFR key
parameter	keyb = 4'b1001;	//2nd LFR key
parameter	keyc = 3'b011;	//3rd LFR key
parameter	keyd = 12'b011010111010;	//4th LFR key

/*
//test output
output iena;
output enab;
output enac;
output enad;
*/


output data;
output done;

input reset;
input ena;
input clk;

reg	[6:0] sra;	//1st LFR instantiation
reg [3:0] srb;	//2nd
reg [2:0] src;	//3nd
reg [11:0] srd;	//4nd

reg	enab;	//Clock enables for cascade LFRs
reg	enac;
reg	enad;

reg	last_ena;	//Registered 'ena
reg	donei;	//internal 'done' node

reg	iena;	//internal 'single clock' ena
reg	oena;	//registered version of ena - for edge detect

reg done;
reg data;
 
//Process to edge detect enable signal to generate single clock duration enable
always@( posedge clk or negedge reset )
	begin
		if( !reset )
			begin
				iena <= 1'b0;
				oena <= 1'b0;
			end
		else
			begin
				oena <= ena;
				if( ena == 1'b1 & oena == 1'b0 )
					iena <= 1'b1;
				else
					iena <= 1'b0;
			end
	end
	
//Implementation of 1st LFR in this cascade
always@( posedge clk or negedge reset )
	begin
		if( !reset )
			sra <= keya;
		else
			begin
			if( iena == 1'b1 )
				begin
				sra[5:0] <= sra[6:1];	//Perform Shift
				sra[6] <= sra[6] ^ sra[2];
//				xor a1(sra[6],sra[6],sra[2]);	//XOR bits 6,2 for maximal
				end
			else
				begin
				sra <= sra;
				end
			enab <= ~sra[1];
			end
	end

//Implementation of 2nd LFR in this cascade
always@( posedge clk or negedge reset )
	begin
		if( !reset )
			srb <= keyb;
		else
			begin
			if( iena == 1'b1 & enab == 1'b1 )
				begin
				srb[2:0] <= srb[3:1];
				srb[3] <= srb[3] ^ srb[0];
//				xor a2(srb[3], srb[3],srb[0]);
				end
			else
				begin
				srb <= srb;
				end
			enac <= (~sra[1]) ^ srb[1];
//			xor a3(enac,(~sra[1]),srb[1]);
			end
	end

//Implementation of 3rd LFR in cascade
always@( posedge clk or negedge reset )
	begin
		if( !reset )
			src <= keyc;
		else
			begin
			if( iena == 1'b1 & enac == 1'b1 )
				begin
				src[1:0] <= src[2:1];
				src[2] <= src[2] ^ src[0];
//				xor a4(src[2],src[2],src[0]);
				end
			else
				begin
				src <= src;
				end
			enad <= (~sra[1]) ^ srb[1] ^ src[1];
//			xor a5(enad,(~sra[1]),srb[1],src[1]);
			end
	end

//Implementation of 4th LFR in cascade
always@( posedge clk or negedge reset )
	begin
		if( !reset )
			srd <= keyd;
		else
			begin
				if( iena == 1'b1 & enad == 1'b1 )
					begin
					srd[10:0] <= srd[11:1];
					srd[11] <= srd[11] ^ srd[5] ^ srd[3] ^ srd[0];
//					xor a6(srd[11],srd[11],srd[5],srd[3],srd[0]);
//XOR bits 11,5,3,0 for maximal length
					end
				else
					begin
					srd <= srd;
					end
			end
		data <= srd[0];
	end
/*	
-- Simple process to handle DONE signal in this h/w implementation
-- In order to be compatible with a microprocessor-type implementation, this process
-- implements a handshake. Done goes Low after ENA goes high, and then High after
-- ENA goes low. As this is hardware, the result is available immediately, but in a
-- micro, done would go high once the next result is available, ie. many clocks after ENA
-- goes low.
-- The top-level schematic handles the other side of the handshake.
*/
always@( posedge clk or negedge reset )
	begin
		if( !reset )
			donei <= 1'b1;
		else
			begin
			last_ena <= ena;
			if( ena == 1'b1 & last_ena == 1'b0 )
				donei <= 1'b0;
			else
				if( iena == 1'b0 & last_ena == 1'b1 )
					donei <= 1'b1;
				else
					donei <= donei;
			end
		done <= donei;
	end

endmodule

⌨️ 快捷键说明

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