asc_hex_to_nybble.v

来自「本電子檔為 verilog cookbook,包含了通訊,影像,DSP等重要常用」· Verilog 代码 · 共 126 行

V
126
字号
// Copyright 2007 Altera Corporation. All rights reserved.  
// Altera products are protected under numerous U.S. and foreign patents, 
// maskwork rights, copyrights and other intellectual property laws.  
//
// This reference design file, and your use thereof, is subject to and governed
// by the terms and conditions of the applicable Altera Reference Design 
// License Agreement (either as signed by you or found at www.altera.com).  By
// using this reference design file, you indicate your acceptance of such terms
// and conditions between you and Altera Corporation.  In the event that you do
// not agree with such terms and conditions, you may not use the reference 
// design file and please promptly destroy any copies you have made.
//
// This reference design file is being provided on an "as-is" basis and as an 
// accommodation and therefore all warranties, representations or guarantees of 
// any kind (whether express, implied or statutory) including, without 
// limitation, warranties of merchantability, non-infringement, or fitness for
// a particular purpose, are specifically disclaimed.  By making this reference
// design file available, Altera expressly does not recommend, suggest or 
// require that this reference design file be used in combination with any 
// other product not provided by Altera.
/////////////////////////////////////////////////////////////////////////////

// baeckler - 05-01-2006
// Converts upper or lower case hex byte to 4 bit binary

module asc_hex_to_nybble (in,out);
input [7:0] in;

output [3:0] out;
reg [3:0] out;

// method 1 is smaller, faster, and will output garbage for
//		non-hex characters.
//
// method 0 will output 0 for non-hex chars
//
parameter METHOD = 1;

generate
if (METHOD == 0) begin
	
	//////////////////////////////////////
	// METHOD = 0
	// illegal input bytes must output 0
	//////////////////////////////////////
	always @(in) begin
		case (in)
			"0" : out = 4'h0;
			"1" : out = 4'h1;
			"2" : out = 4'h2;
			"3" : out = 4'h3;
			"4" : out = 4'h4;
			"5" : out = 4'h5;
			"6" : out = 4'h6;
			"7" : out = 4'h7;
			"8" : out = 4'h8;
			"9" : out = 4'h9;
			"A", "a" : out = 4'ha;
			"B", "b" : out = 4'hb;
			"C", "c" : out = 4'hc;
			"D", "d" : out = 4'hd;
			"E", "e" : out = 4'he;
			"F", "f" : out = 4'hf;
			default : out = 4'b0;
		endcase
	end
end
else begin
	
	//////////////////////////////////////
	// METHOD = 1
	// illegal input bytes are don't care
	//////////////////////////////////////
	
	// 0:9 30 - 39 hex	
	// A:F 41 - 46 hex
	// a:f 61 - 66 hex
	always @(in) begin
		if (!in[6])	begin
			// numeric
			out = in[3:0];
		end
		else begin
			// Alpha - made these on paper
			// many variants would work			
			out[3] = 1'b1;
			out[2] = in[2] | (in[1] & in[0]);
			out[1] = in[0] ^ in[1];
			out[0] = !in[0];
		end
	end
end
endgenerate

endmodule
 

module asc_hex_to_nybble_tb ();
	
	wire [3:0] ao,bo;
	
	reg [22*8-1:0] test_str = "0123456789ABCDEFabcdef";
	reg [22*4-1:0] test_hex ='h0123456789abcdefabcdef;

	asc_hex_to_nybble a (.in(test_str[7:0]),.out(ao));
		defparam a .METHOD = 0;

	asc_hex_to_nybble b (.in(test_str[7:0]),.out(bo));
		defparam b .METHOD = 1;

	integer stim;
	initial begin
		for (stim = 0; stim<22; stim=stim+1)
		begin
			#10
			if (bo !== ao || bo != test_hex[3:0]) begin
				$display ("Mismatch on case %d",stim);
			end
			#10
			test_hex = test_hex >> 4;
			test_str = test_str >> 8;
		end
		$stop();
	end
	
endmodule

⌨️ 快捷键说明

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