Speech Recognition
-
Upload
debolina-ghosh -
Category
Documents
-
view
136 -
download
4
description
Transcript of Speech Recognition
This web page has useful information about speech recognition, including some MATLAB examples for the bank of filters (BOF) and linear predictive coding (LPC) methods.
NEW:For FFT in VHDL, use ieee.math_real.all and ieee.math_complex.all;Saving speech signal to a data file and reading the data into VHDLMATLAB Code (savespeech.m)VHDL Code (readspeech.vhd)MATLAB Code (Examples)
1. MATLAB Code to get time-domain speech signal from microphone and obtain its Fourier Transform (fft_example.m)
2. Bank of Filters (BOF)o NOTE: The following two m-files use bof_feature.m which you will have to code
yourself. This file should take in a speech signal and return the corresponding BOF features for that signal.
b. MATLAB Code for Training (bof_training.m)c. MATLAB Code for Recognition (bof_recognition.m)
Linear Predictive Coding (LPC)
o NOTE: The following two m-files use lpc_feature.m which you will have to code yourself. This file should take in a speech signal and return the corresponding LPC features for that signal.
b. MATLAB Code for Training (lpc_training.m)c. MATLAB Code for Recognition (lpc_recognition.m)
Savespeech.m :
function e=savespeech(filename,y,word)
e=0;fid = fopen(filename,'w');if (fid == -1) e = 1; error('Error writing y to %s\n',filename); returnend
fprintf(fid,'# Speech signal file (%s)\n',filename);fprintf(fid,'%d\n',length(y));for i=1:length(y) fprintf(fid,'%.8e\n',y(i));end
r=fclose(fid);
if (r == -1) e = 1; error('Error closing file %s\n',filename); returnend
readspeech.vhd
library ieee, std, work;use ieee.std_logic_1164.all, std.textio.all, work.all;
entity readspeech is port (speech_length : out integer; speech_read : out std_logic := '0');end readspeech;
architecture only of readspeech is signal N : integer := 10000; -- make sure this number matches the number of samples in your speech data file type speechvector is array (1 to N) of real; signal speech : speechvector; begin READDATA: process
file data_file : text IS IN "down.dat"; variable buf : line; variable speech_length_t : integer := 0; variable real_data : real;
begin
readline(data_file,buf); -- read comment line (ignore) readline(data_file,buf); -- read line read(buf,speech_length_t); -- number of data points for i in 1 to speech_length_t loop readline(data_file,buf); -- read a line read(buf,real_data); -- get the data speech(i) <= real_data; -- store to speech vector end loop; file_close(data_file);
speech_read <= '1'; speech_length <= speech_length_t; wait; end process;end only;
function bof_training
% This code is for creating the library of Bank of Filters (BOF) features.
% get a word from microphoneFs = 10000; % Sampling Frequency (Hz)n = 100; % Number of filters (frequency bands)Nseconds = 1; % Length of speech signal
% List of words (you can add more words to this list but make sure% each word has five characters (if less then pad it with spaces)words = [' up'; ' down'; ' left'; 'right']; % Matrix to store features for each word (rows correspond to words) fw = zeros(size(words,1),n);
fprintf('You will get one second to say each word.\n\n');
% For each word, get the word from microphone and compute its featuresfor i=1:size(words,1) fprintf('Hit enter and say immediately ''%s'':',words(i,:)); % pause for enter key junk=input(''); % get a word from microphone y = wavrecord(Nseconds*Fs, Fs, 'double'); % Calculate the features of the word f = bof_feature(y,n,Fs); % Save them in the features matrix fw(i,:) = f; % abs(f) % plot(1:Fs,fft(y));end
% Save features matrix to a file (this file will be loaded into Matlab during speech recognition)save words_bof.mat Fs n words fw;
function bof_recognition% Speech Recognition using Bank of Filters (BOF)
% load training dataload words_bof.mat;
% ask user to say a wordfprintf('You will get one second to say your word.\n\n');fprintf('Hit enter and say your word immediately:');% pause for enter keyjunk=input('');
% get the word from microphoney = wavrecord(1*Fs, Fs, 'double');
% Calculate the features of the wordf = bof_feature(y,n,Fs);
% Calculate distances between the spoken word and each word in the libraryd = zeros(1,size(words,1));for i=1:size(words,1) d(i) = sqrt(sum((f-fw(i,:)).^2));end
% Print the word with minimum feature distance. This word was spoken.[temp1,indx1] = min(d);fprintf('You said: %s\n',words(indx1,:));
function lpc_training% This code is for creating the library of Linear Predictive Coding (LPC) features.
Fs = 10000; % Sampling Frequency (Hz)n = 20; % LPC orderNseconds = 1; % Length of speech signal
% List of words (you can add more words to this list but make sure% each word has five characters (if less then pad it with spaces)words = [' up'; ' down'; ' left'; 'right'];
% Matrix to store features for each word (rows correspond to words)fw = zeros(size(words,1),n);
fprintf('You will get one second to say each word.\n\n');
% For each word, get the word from microphone and compute its featuresfor i=1:size(words,1) fprintf('Hit enter and say immediately ''%s'':',words(i,:)); % pause for enter key junk=input(''); % get a word from microphone y = wavrecord(Nseconds*Fs, Fs, 'double');
% Calculate the features of the word f = lpc_feature(y,n); % Save them in the features matrix fw(i,:) = f; % abs(f) % plot(1:Fs,fft(y));end
% Save features matrix to a file (this file will be loaded into Matlab during speech recognition)save words_lpc.mat Fs n words fw;
function lpc_recognition% Speech Recognition using Linear Predictive Coding (LPC)
% load training dataload words_lpc.mat;
% ask user to say a wordfprintf('You will get one second to say your word.\n\n');fprintf('Hit enter and say your word immediately:');% pause for enter keyjunk=input('');
% get the word from microphoney = wavrecord(1*Fs, Fs, 'double');
% Calculate the features of the wordf = lpc_feature(y,n);
% Calculate distances between the spoken word and each word in the libraryd = zeros(1,size(words,1));for i=1:size(words,1) d(i) = sqrt(sum((f-fw(i,:)).^2));end
% Print the word with minimum feature distance. This word was spoken.[temp1,indx1] = min(d);fprintf('You said: %s\n',words(indx1,:));
/////////////////////////////////////////////////////////////////////////// modified from the Terasic version:// eliminate all memory references// simplify interface to top-level module// add audio I/O from top-level module// modifed by Bruce Land, Cornell University 2007/////////////////////////////////////////////////////////////////////////
module AUDIO_DAC_ADC ( oAUD_BCK, oAUD_DATA, oAUD_LRCK, oAUD_inL, oAUD_inR, iAUD_ADCDAT, iAUD_extR, iAUD_extL, // Control Signals iCLK_18_4, iRST_N );
parameter REF_CLK = 18432000; // 18.432 MHzparameter SAMPLE_RATE = 32000; // 48 KHzparameter DATA_WIDTH = 16; // 16 Bits
parameter CHANNEL_NUM = 2; // Dual Channel
// audio input FROM top-level moduleinput signed [DATA_WIDTH-1:0] iAUD_extR, iAUD_extL;// audio output TO top-level moduleoutput signed [DATA_WIDTH-1:0] oAUD_inL, oAUD_inR;
// Audio Sideoutput oAUD_DATA;output oAUD_LRCK;output reg oAUD_BCK;input iAUD_ADCDAT;// Control Signalsinput iCLK_18_4;input iRST_N;// Internal Registers and Wiresreg [3:0] BCK_DIV;reg [8:0] LRCK_1X_DIV;reg [7:0] LRCK_2X_DIV;reg [6:0] LRCK_4X_DIV;reg [3:0] SEL_Cont;
// to DAC and from ADCreg signed [DATA_WIDTH-1:0] AUD_outL, AUD_outR;reg signed [DATA_WIDTH-1:0] AUD_inL, AUD_inR;
reg LRCK_1X;reg LRCK_2X;reg LRCK_4X;wire [3:0] bit_in;
////////////////////////////////////////////////////////////// AUD_BCK Generator ///////////////////////////////////////////////////////////////always @ (posedge iCLK_18_4 or negedge iRST_N)begin if(!iRST_N) begin BCK_DIV <= 0; oAUD_BCK <= 0; end else begin if (BCK_DIV >= REF_CLK/(SAMPLE_RATE*DATA_WIDTH*CHANNEL_NUM*2)-1) begin BCK_DIV <= 0; oAUD_BCK <= ~oAUD_BCK; end else
BCK_DIV <= BCK_DIV + 4'd1; endend
////////////////////////////////////////////////////////////// AUD_LRCK Generator ////////////////oAUD_LRCK is high for left and low for right//////////////////////////////////////////////////////
always @ (posedge iCLK_18_4 or negedge iRST_N)begin if(!iRST_N) begin LRCK_1X_DIV <= 0; LRCK_2X_DIV <= 0; LRCK_4X_DIV <= 0; LRCK_1X <= 0; LRCK_2X <= 0; LRCK_4X <= 0; end else begin // LRCK 1X if (LRCK_1X_DIV >= REF_CLK/(SAMPLE_RATE*2)-1) begin LRCK_1X_DIV <= 0; LRCK_1X <= ~LRCK_1X; end else
LRCK_1X_DIV <= LRCK_1X_DIV + 9'd1;
// LRCK 2X if (LRCK_2X_DIV >= REF_CLK/(SAMPLE_RATE*4)-1) begin LRCK_2X_DIV <= 0; LRCK_2X <= ~LRCK_2X; end else
LRCK_2X_DIV <= LRCK_2X_DIV + 8'd1;
// LRCK 4X if (LRCK_4X_DIV >= REF_CLK/(SAMPLE_RATE*8)-1) begin LRCK_4X_DIV <= 0; LRCK_4X <= ~LRCK_4X; end else
LRCK_4X_DIV <= LRCK_4X_DIV + 7'd1; endend
assign oAUD_LRCK = LRCK_1X;
//////////////////////////////////////////////////////////// 16 Bits - MSB First ///////////////////// Clocks in the ADC input/// and sets up the output bit selector/// and clocks out the DAC data//////////////////////////////////////////////////// first the ADCalways @ (negedge oAUD_BCK or negedge iRST_N)begin if (!iRST_N) SEL_Cont <= 0; else begin SEL_Cont <= SEL_Cont + 4'd1; // 4 bit counter, so it wraps at 16
if (LRCK_1X) AUD_inL[~(SEL_Cont)] <= iAUD_ADCDAT; else AUD_inR[~(SEL_Cont)] <= iAUD_ADCDAT; endendassign oAUD_inL = AUD_inL;assign oAUD_inR = AUD_inR;
// now the DAC -- output the DAC bit-stream assign oAUD_DATA = (LRCK_1X) ? AUD_outL[~SEL_Cont] : AUD_outR[~SEL_Cont]; // register the inputs always @ (negedge LRCK_1X)begin AUD_outL <= iAUD_extL; end always @ (posedge LRCK_1X)begin AUD_outR <= iAUD_extR; end
endmodule
module AudioRAM ( input iReset, input iStartLoad, input iWriteClock, input [BITS-1:0] iSample, input iReadClock, input [LBITS-1:0] iReadAddr, input iWindow, output [BITS-1:0] oValue, output reg oLoadComplete, output reg state);
parameter BITS = 16;parameter LBITS = 10;
//reg state;parameter WAIT = 1'b0;parameter WRITE = 1'b1;
reg [LBITS:0] wraddr;reg wren, shot, reshot;
// look for start signalalways @ (posedge iStartLoad or posedge reshot)begin if (iStartLoad) shot <= 1'b1; else shot <= 1'b0;end
// write state machine
always @ (posedge iWriteClock)begin if (iReset) begin state <= WAIT; wraddr <= 0; wren <= 1'b0; oLoadComplete <= 1'b0; end else begin case (state) WAIT: begin wren <= 1'b0; if (shot == 1'b1) begin reshot <= 1'b1; wraddr <= 0; state <= WRITE; end else state <= WAIT; end WRITE: begin reshot <= 1'b0; if (wraddr < 1024) begin wren <= 1'b1; wraddr <= wraddr + 11'b1; state <= WRITE; oLoadComplete <= 1'b0; end else begin wren <= 1'b0; state <= WAIT; oLoadComplete <= 1'b1; end end endcase endend
wire [31:0] hammval, hannval;wire [15:0] hamm, hann, hammtop, hanntop, datain;assign hammval = hamm * iSample;assign hannval = hann * iSample;assign hammtop = {hammval[31], hammval[27:13]};assign hanntop = {hannval[31], hannval[27:13]};assign datain = (iWindow == 1'b1) ? hanntop : hammtop;
hammingrom hammrom ( .iAddress(wraddr), .oHamming(hamm)
);
hanningrom hannrom ( .iAddress(wraddr), .oHanning(hann));
ram1024x16 audsamp ( .data(iSample), .rdaddress(iReadAddr), .rdclock(iReadClock), .wraddress(wraddr), .wrclock(iWriteClock), .wren(wren), .q(oValue));
endmodule
module DE2_TOP (//////////////////////// Clock Input ////////////////////////input CLOCK_27, //27 MHzinput CLOCK_50, //50 MHzinput EXT_CLOCK, //External Clock//////////////////////// Push Button////////////////////////input [3:0] KEY, //Pushbutton[3:0]//////////////////////// DPDT Switch////////////////////////input [17:0] SW, //Toggle Switch[17:0]//////////////////////// 7-SEG Dispaly ////////////////////////output [6:0] HEX0, // Seven
Segment Digit 0output [6:0] HEX1, // Seven
Segment Digit 1output [6:0] HEX2, // Seven
Segment Digit 2output [6:0] HEX3, // Seven
Segment Digit 3output [6:0] HEX4, // Seven
Segment Digit 4output [6:0] HEX5, // Seven
Segment Digit 5output [6:0] HEX6, // Seven
Segment Digit 6output [6:0] HEX7, // Seven
Segment Digit 7//////////////////////////// LED////////////////////////////
output [8:0] LEDG, // LED Green[8:0]
output [17:0] LEDR, // LED Red[17:0]
//////////////////////////// UART ////////////////////////////output UART_TXD, //UART Transmitterinput UART_RXD, //UART Receiver//////////////////////////// IRDA ////////////////////////////output IRDA_TXD, //IRDA Transmitterinput IRDA_RXD, //IRDA Receiver/////////////////////// SDRAM Interface////////////////////////inout [15:0] DRAM_DQ, // SDRAM
Data bus 16 Bitsoutput [11:0] DRAM_ADDR, // SDRAM
Address bus 12 Bitsoutput DRAM_LDQM, //SDRAM Low-byte Data Mask output DRAM_UDQM, //SDRAM High-byte Data Maskoutput DRAM_WE_N, //SDRAM Write Enableoutput DRAM_CAS_N, //SDRAM Column Address Strobeoutput DRAM_RAS_N, //SDRAM Row Address Strobeoutput DRAM_CS_N, //SDRAM Chip Selectoutput DRAM_BA_0, //SDRAM Bank Address 0output DRAM_BA_1, //SDRAM Bank Address 0output DRAM_CLK, //SDRAM Clockoutput DRAM_CKE, //SDRAM Clock Enable//////////////////////// Flash Interface////////////////////////inout [7:0] FL_DQ, // FLASH
Data bus 8 Bitsoutput [21:0] FL_ADDR, // FLASH
Address bus 22 Bitsoutput FL_WE_N, //FLASH Write Enableoutput FL_RST_N, //FLASH Resetoutput FL_OE_N, //FLASH Output Enableoutput FL_CE_N, //FLASH Chip Enable//////////////////////// SRAM Interface ////////////////////////inout [15:0] SRAM_DQ, // SRAM Data
bus 16 Bits
output [17:0] SRAM_ADDR, // SRAM Address bus 18 Bits
output SRAM_UB_N, //SRAM High-byte Data Mask output SRAM_LB_N, //SRAM Low-byte Data Mask output SRAM_WE_N, //SRAM Write Enableoutput SRAM_CE_N, //SRAM Chip Enableoutput SRAM_OE_N, //SRAM Output Enable//////////////////// ISP1362 Interface ////////////////////////inout [15:0] OTG_DATA, // ISP1362
Data bus 16 Bitsoutput [1:0] OTG_ADDR, // ISP1362
Address 2 Bitsoutput OTG_CS_N, //ISP1362 Chip Selectoutput OTG_RD_N, //ISP1362 Writeoutput OTG_WR_N, //ISP1362 Readoutput OTG_RST_N, //ISP1362 Resetoutput OTG_FSPEED, //USB Full Speed,0 = Enable, Z = Disableoutput OTG_LSPEED, //USB Low Speed, 0 = Enable, Z = Disableinput OTG_INT0, //ISP1362 Interrupt 0input OTG_INT1, //ISP1362 Interrupt 1input OTG_DREQ0, //ISP1362 DMA Request 0input OTG_DREQ1, //ISP1362 DMA Request 1output OTG_DACK0_N, // ISP1362
DMA Acknowledge 0output OTG_DACK1_N, // ISP1362
DMA Acknowledge 1//////////////////// LCD Module 16X2////////////////////////////inout [7:0] LCD_DATA, // LCD Data
bus 8 bitsoutput LCD_ON, //LCD Power ON/OFFoutput LCD_BLON, //LCD Back Light ON/OFFoutput LCD_RW, //LCD Read/Write Select, 0 = Write, 1 = Readoutput LCD_EN, //LCD Enableoutput LCD_RS, //LCD Command/Data Select, 0 = Command, 1 = Data//////////////////// SD Card Interface ////////////////////////inout SD_DAT, //SD Card Data
inout SD_DAT3, //SD Card Data 3inout SD_CMD, //SD Card Command Signaloutput SD_CLK, //SD Card Clock//////////////////////// I2C////////////////////////////////inout I2C_SDAT, //I2C Dataoutput I2C_SCLK, //I2C Clock//////////////////////// PS2////////////////////////////////input PS2_DAT, //PS2 Datainput PS2_CLK, //PS2 Clock//////////////////// USB JTAG link ////////////////////////////input TDI, // CPLD -
> FPGA (data in)input TCK, // CPLD -
> FPGA (clk)input TCS, // CPLD -
> FPGA (CS)output TDO, // FPGA -
> CPLD (data out)//////////////////////// VGA////////////////////////////output VGA_CLK, //VGA Clockoutput VGA_HS, //VGA H_SYNCoutput VGA_VS, //VGA V_SYNCoutput VGA_BLANK, //VGA BLANKoutput VGA_SYNC, //VGA SYNCoutput [9:0] VGA_R, // VGA
Red[9:0]output [9:0] VGA_G, // VGA
Green[9:0]output [9:0] VGA_B, // VGA
Blue[9:0]//////////////// Ethernet Interface////////////////////////////inout [15:0] ENET_DATA, // DM9000A
DATA bus 16Bitsoutput ENET_CMD, //DM9000A Command/Data Select, 0 = Command, 1 = Dataoutput ENET_CS_N, //DM9000A Chip Selectoutput ENET_WR_N, //DM9000A Writeoutput ENET_RD_N, //DM9000A Read
output ENET_RST_N, //DM9000A Resetinput ENET_INT, //DM9000A Interruptoutput ENET_CLK, //DM9000A Clock 25 MHz//////////////////// Audio CODEC////////////////////////////inout AUD_ADCLRCK, // Audio
CODEC ADC LR Clockinput AUD_ADCDAT, //Audio CODEC ADC Datainout AUD_DACLRCK, // Audio
CODEC DAC LR Clockoutput AUD_DACDAT, //Audio CODEC DAC Datainout AUD_BCLK, //Audio CODEC Bit-Stream Clockoutput AUD_XCK, //Audio CODEC Chip Clock//////////////////// TV Devoder////////////////////////////input [7:0] TD_DATA, // TV Decoder Data
bus 8 bitsinput TD_HS, //TV Decoder H_SYNCinput TD_VS, //TV Decoder V_SYNCoutput TD_RESET, //TV Decoder Reset//////////////////////// GPIO ////////////////////////////////inout [35:0] GPIO_0, // GPIO
Connection 0inout [35:0] GPIO_1 // GPIO
Connection 1);
// Turn on all displayassign HEX0 = 7'h00;assign HEX1 = 7'h00;assign HEX2 = 7'h00;assign HEX3 = 7'h00;assign HEX4 = 7'h00;assign HEX5 = 7'h00;assign HEX6 = 7'h00;assign HEX7 = 7'h00;assign LCD_ON = 1'b1;assign LCD_BLON = 1'b1;
// All inout port turn to tri-stateassign DRAM_DQ = 16'hzzzz;assign FL_DQ = 8'hzz;assign SRAM_DQ = 16'hzzzz;assign OTG_DATA = 16'hzzzz;assign SD_DAT = 1'bz;assign ENET_DATA = 16'hzzzz;assign GPIO_0 = 36'hzzzzzzzzz;
assign GPIO_1 = 36'hzzzzzzzzz;
//////////////////////////////////////////////////////////////////////// Filter Bank (I/O)//////////////////////////////////////////////////////////////////////
/// audio stuff /////////////////////////////////////////////////// output to audio DACwire signed [15:0] audio_outL, audio_outR;// input from audio ADCwire signed [15:0] audio_inL, audio_inR;
wire AUD_CTRL_CLK;wire DLY_RST;wire I2C_END;wire NIOS_CLK;wire CLK;
// Between NIOS and FFT controllerwire [9:0] fftaddr;wire fftstart;wire fftdone;wire [15:0] fftpower;wire [5:0] fftexp;
// Between NIOS and peak detectorwire peakstart;wire peakdone;wire [LBITS-2:0] peakindex;
assign TD_RESET = 1'b1; // Allow 27 MHzassign AUD_ADCLRCK = CLK;assign AUD_XCK = AUD_CTRL_CLK;assign AUD_DACLRCK = CLK;
Reset_Delay r0 (.iCLK(CLOCK_50),.oRESET(DLY_RST)
);
Audio_PLL p1 (.areset(~DLY_RST),.inclk0(CLOCK_27),.c0(AUD_CTRL_CLK)
);
I2C_AV_Config u3 (// Host Side.iCLK(CLOCK_50),.iRST_N(KEY[0]),//.o_I2C_END(I2C_END),// I2C Side.I2C_SCLK(I2C_SCLK),.I2C_SDAT(I2C_SDAT)
);
AUDIO_DAC_ADC u4 (
// Audio Side.oAUD_BCK(AUD_BCLK),.oAUD_DATA(AUD_DACDAT),.oAUD_LRCK(CLK),.oAUD_inL(audio_inL), // audio data from ADC .oAUD_inR(audio_inR), // audio data from ADC .iAUD_ADCDAT(AUD_ADCDAT),.iAUD_extL(audio_outL), // audio data to DAC.iAUD_extR(audio_outR), // audio data to DAC// Control Signals.iCLK_18_4(AUD_CTRL_CLK),.iRST_N(DLY_RST)
);
NiosMemPLL p2 (.inclk0(CLOCK_50),.c0(NIOS_CLK),.c1(DRAM_CLK)
);
VoiceRecognizer cpu (// 1) global signals:.clk_0(NIOS_CLK),.reset_n(KEY[0]),
// the_FFTAddr.out_port_from_the_FFTAddr(fftaddr),
// the_FFTDone.in_port_to_the_FFTDone(fftdone),
// the_FFTImag.in_port_to_the_FFTPower(fftpower),
// the_FFTStart.out_port_from_the_FFTStart(fftstart),
// the_FFTExp.in_port_to_the_FFTExp(fftexp),
// the_Train.in_port_to_the_Train(~KEY[3]),
// the_AppSwitches.in_port_to_the_AppSwitches(SW[1:0]),
// the_GreenLED.out_port_from_the_GreenLED(LEDG[7]),
// the_RedLED.out_port_from_the_RedLED(LEDR[0]),
// the_VowelID.in_port_to_the_VowelID(SW[17:14]),
// the_VowelLEDs.out_port_from_the_VowelLEDs(LEDR[17:14]),
// the_lcd.LCD_E_from_the_lcd_0(LCD_EN),.LCD_RS_from_the_lcd_0(LCD_RS),.LCD_RW_from_the_lcd_0(LCD_RW),.LCD_data_to_and_from_the_lcd_0(LCD_DATA),
// the_sdram_0.zs_addr_from_the_sdram_0(DRAM_ADDR),.zs_ba_from_the_sdram_0({DRAM_BA_1, DRAM_BA_0}),.zs_cas_n_from_the_sdram_0(DRAM_CAS_N),.zs_cke_from_the_sdram_0(DRAM_CKE),.zs_cs_n_from_the_sdram_0(DRAM_CS_N),.zs_dq_to_and_from_the_sdram_0(DRAM_DQ),.zs_dqm_from_the_sdram_0({DRAM_UDQM, DRAM_LDQM}),.zs_ras_n_from_the_sdram_0(DRAM_RAS_N),.zs_we_n_from_the_sdram_0(DRAM_WE_N)
);
// FFT controller stuffparameter LEN = 1024;parameter LBITS = 10;parameter EBITS = 6;parameter BITS = 16;
wire lc;wire [LBITS-1:0] sampleAddr;wire [BITS-1:0] sample;
FFTController fftc (.iReset(~KEY[0]),.iStart(lc),.iStateClk(NIOS_CLK),.oSampAddr(sampleAddr),.iSamp(sample),.iReadAddr(fftaddr),.iReadClock(NIOS_CLK),.oPower(fftpower),.oExp(fftexp),.oDone(fftdone)
);
AudioRAM audRAM (.iReset(~KEY[0]),.iStartLoad(fftstart),.iWriteClock(CLK),.iSample(audio_inL),.iReadClock(NIOS_CLK),.iReadAddr(sampleAddr),.iWindow(KEY[2]),.oValue(sample),.oLoadComplete(lc)
);
assign LEDG[8] = fftstart;
endmodule
module FFTController ( input iReset, input iStart, input iStateClk, output [LBITS-1:0] oSampAddr, input signed [BITS-1:0] iSamp, input [LBITS-2:0] iReadAddr, input iReadClock, output signed [BITS-1:0] oPower, output reg signed [EBITS-1:0] oExp, output reg oDone, output reg [2:0] instate);
parameter BITS = 16;parameter EBITS = 6;parameter LEN = 1024;parameter LBITS = 10;
reg sink_valid;wire sink_ready;reg sink_sop;reg sink_eop;reg [BITS-1:0] sink_real;wire [BITS-1:0] sink_imag;wire [BITS-1:0] source_real;wire [BITS-1:0] source_imag;wire [EBITS-1:0] source_exp;wire source_ready;wire source_valid;wire source_sop;wire source_eop;wire [1:0] source_error;wire [1:0] sink_error;
// always ready to receive dataassign source_ready = 1'b1;// no input sinkassign sink_error = 2'b00;// no imaginary inputassign sink_imag = 16'b0;
//reg [2:0] instate;reg [LBITS-1:0] incount, outcount;reg inshot, reshot;
assign oSampAddr = incount;
parameter INWAIT = 3'd0;parameter INSOP = 3'd1;parameter INMID = 3'd2;parameter INEOP = 3'd3;
// look for start signal
always @ (posedge iStart or posedge reshot)begin if (iStart) inshot <= 1'b1; else inshot <= 1'b0;end
// Input TO FFT state machinealways @ (posedge iStateClk)begin if (iReset) begin sink_real <= 16'b0; sink_valid <= 1'b0; incount <= 0; instate <= INSOP; end else begin case (instate) INSOP: begin reshot <= 1'b0; // this is the start of a packet sink_sop <= 1'b1; // indicate to FFT that valid data is ready sink_valid <= 1'b1; // load up the first (real, imag) pair sink_real <= iSamp; // initialize index counter incount <= 1; instate <= INMID; end INMID: begin // de-assert sop flag sink_sop <= 1'b0; // load up next (real, imag) pair sink_real <= iSamp; // if this is the second to last pair in the input vector, move to end of packet incount <= incount + 1; if (incount == LEN-2) instate <= INEOP; else instate <= INMID; end INEOP: begin // this is the end of a packet sink_eop <= 1'b1; // load up last (real, imag) pair sink_real <= iSamp; instate <= INWAIT; end
INWAIT: begin sink_real <= 16'b0; sink_eop <= 1'b0; sink_valid <= 1'b0; if (inshot == 1'b1) begin reshot <= 1'b1; incount <= 0; instate <= INSOP; end else instate <= INWAIT; end endcase endend
// Output FROM FFT state machinewire signed [BITS-1:0] power, realAbs, imagAbs;
assign realAbs = (source_real[BITS-1] == 1'b1) ? ~source_real : source_real;assign imagAbs = (source_imag[BITS-1] == 1'b1) ? ~source_imag : source_imag;assign power = (realAbs > imagAbs) ? (realAbs + (imagAbs >> 1)) : (imagAbs + (realAbs >> 1));
reg wren;
always @ (posedge iStateClk)begin if (sink_sop == 1'b1 || iReset == 1'b1) oDone <= 1'b0; else if (source_eop == 1'b1) oDone <= 1'b1; if (source_valid == 1'b1) begin if (outcount < 512) wren <= 1'b1; else wren <= 1'b0; if (source_eop == 1'b1) outcount <= 0; else outcount <= outcount + 1; oExp <= source_exp; end else wren <= 1'b0;end
ram512x16 fftpow ( .data(power), .rdaddress(iReadAddr), .rdclock(iReadClock), .wraddress(outcount),
.wrclock(iStateClk), .wren(wren), .q(oPower));
FFT2 afft ( .clk(iStateClk), .reset_n(~iReset), .inverse(1'b0), .sink_valid(sink_valid), .sink_sop(sink_sop), .sink_eop(sink_eop), .sink_real(sink_real), .sink_imag(sink_imag), .sink_error(sink_error), .source_ready(source_ready), .sink_ready(sink_ready), .source_error(source_error), .source_sop(source_sop), .source_eop(source_eop), .source_valid(source_valid), .source_exp(source_exp), .source_real(source_real), .source_imag(source_imag));
endmodule
// Infer ROM storage for a hamming windowmodule hammingrom ( input [9:0] iAddress, output reg [15:0] oHamming);
always @ (iAddress)begin case (iAddress) 10'h00: oHamming = 16'h28f; 10'h01: oHamming = 16'h28f; 10'h02: oHamming = 16'h28f; 10'h03: oHamming = 16'h28f; 10'h04: oHamming = 16'h290; 10'h05: oHamming = 16'h291; 10'h06: oHamming = 16'h291; 10'h07: oHamming = 16'h292; 10'h08: oHamming = 16'h293; 10'h09: oHamming = 16'h295; 10'h0a: oHamming = 16'h296; 10'h0b: oHamming = 16'h297; 10'h0c: oHamming = 16'h299; 10'h0d: oHamming = 16'h29b; 10'h0e: oHamming = 16'h29d; 10'h0f: oHamming = 16'h29f; 10'h10: oHamming = 16'h2a1; 10'h11: oHamming = 16'h2a3;
10'h12: oHamming = 16'h2a6; 10'h13: oHamming = 16'h2a8; 10'h14: oHamming = 16'h2ab; 10'h15: oHamming = 16'h2ae; 10'h16: oHamming = 16'h2b1; 10'h17: oHamming = 16'h2b4; 10'h18: oHamming = 16'h2b8; 10'h19: oHamming = 16'h2bb; 10'h1a: oHamming = 16'h2bf; 10'h1b: oHamming = 16'h2c3; 10'h1c: oHamming = 16'h2c6; 10'h1d: oHamming = 16'h2ca; 10'h1e: oHamming = 16'h2cf; 10'h1f: oHamming = 16'h2d3; 10'h20: oHamming = 16'h2d7; 10'h21: oHamming = 16'h2dc; 10'h22: oHamming = 16'h2e1; 10'h23: oHamming = 16'h2e6; 10'h24: oHamming = 16'h2eb; 10'h25: oHamming = 16'h2f0; 10'h26: oHamming = 16'h2f5; 10'h27: oHamming = 16'h2fa; 10'h28: oHamming = 16'h300; 10'h29: oHamming = 16'h306; 10'h2a: oHamming = 16'h30c; 10'h2b: oHamming = 16'h312; 10'h2c: oHamming = 16'h318; 10'h2d: oHamming = 16'h31e; 10'h2e: oHamming = 16'h324; 10'h2f: oHamming = 16'h32b; 10'h30: oHamming = 16'h331; 10'h31: oHamming = 16'h338; 10'h32: oHamming = 16'h33f; 10'h33: oHamming = 16'h346; 10'h34: oHamming = 16'h34d; 10'h35: oHamming = 16'h355; 10'h36: oHamming = 16'h35c; 10'h37: oHamming = 16'h364; 10'h38: oHamming = 16'h36c; 10'h39: oHamming = 16'h373; 10'h3a: oHamming = 16'h37b; 10'h3b: oHamming = 16'h384; 10'h3c: oHamming = 16'h38c; 10'h3d: oHamming = 16'h394; 10'h3e: oHamming = 16'h39d; 10'h3f: oHamming = 16'h3a5; 10'h40: oHamming = 16'h3ae; 10'h41: oHamming = 16'h3b7; 10'h42: oHamming = 16'h3c0; 10'h43: oHamming = 16'h3c9; 10'h44: oHamming = 16'h3d3; 10'h45: oHamming = 16'h3dc; 10'h46: oHamming = 16'h3e6; 10'h47: oHamming = 16'h3f0; 10'h48: oHamming = 16'h3f9; 10'h49: oHamming = 16'h403; 10'h4a: oHamming = 16'h40d;
10'h4b: oHamming = 16'h418; 10'h4c: oHamming = 16'h422; 10'h4d: oHamming = 16'h42c; 10'h4e: oHamming = 16'h437; 10'h4f: oHamming = 16'h442; 10'h50: oHamming = 16'h44d; 10'h51: oHamming = 16'h458; 10'h52: oHamming = 16'h463; 10'h53: oHamming = 16'h46e; 10'h54: oHamming = 16'h479; 10'h55: oHamming = 16'h485; 10'h56: oHamming = 16'h490; 10'h57: oHamming = 16'h49c; 10'h58: oHamming = 16'h4a8; 10'h59: oHamming = 16'h4b4; 10'h5a: oHamming = 16'h4c0; 10'h5b: oHamming = 16'h4cc; 10'h5c: oHamming = 16'h4d9; 10'h5d: oHamming = 16'h4e5; 10'h5e: oHamming = 16'h4f2; 10'h5f: oHamming = 16'h4fe; 10'h60: oHamming = 16'h50b; 10'h61: oHamming = 16'h518; 10'h62: oHamming = 16'h525; 10'h63: oHamming = 16'h532; 10'h64: oHamming = 16'h540; 10'h65: oHamming = 16'h54d; 10'h66: oHamming = 16'h55a; 10'h67: oHamming = 16'h568; 10'h68: oHamming = 16'h576; 10'h69: oHamming = 16'h584; 10'h6a: oHamming = 16'h592; 10'h6b: oHamming = 16'h5a0; 10'h6c: oHamming = 16'h5ae; 10'h6d: oHamming = 16'h5bc; 10'h6e: oHamming = 16'h5cb; 10'h6f: oHamming = 16'h5d9; 10'h70: oHamming = 16'h5e8; 10'h71: oHamming = 16'h5f7; 10'h72: oHamming = 16'h605; 10'h73: oHamming = 16'h614; 10'h74: oHamming = 16'h623; 10'h75: oHamming = 16'h633; 10'h76: oHamming = 16'h642; 10'h77: oHamming = 16'h651; 10'h78: oHamming = 16'h661; 10'h79: oHamming = 16'h670; 10'h7a: oHamming = 16'h680; 10'h7b: oHamming = 16'h690; 10'h7c: oHamming = 16'h6a0; 10'h7d: oHamming = 16'h6b0; 10'h7e: oHamming = 16'h6c0; 10'h7f: oHamming = 16'h6d0; 10'h80: oHamming = 16'h6e1; 10'h81: oHamming = 16'h6f1; 10'h82: oHamming = 16'h702; 10'h83: oHamming = 16'h712;
10'h84: oHamming = 16'h723; 10'h85: oHamming = 16'h734; 10'h86: oHamming = 16'h745; 10'h87: oHamming = 16'h756; 10'h88: oHamming = 16'h767; 10'h89: oHamming = 16'h778; 10'h8a: oHamming = 16'h789; 10'h8b: oHamming = 16'h79b; 10'h8c: oHamming = 16'h7ac; 10'h8d: oHamming = 16'h7be; 10'h8e: oHamming = 16'h7cf; 10'h8f: oHamming = 16'h7e1; 10'h90: oHamming = 16'h7f3; 10'h91: oHamming = 16'h805; 10'h92: oHamming = 16'h817; 10'h93: oHamming = 16'h829; 10'h94: oHamming = 16'h83b; 10'h95: oHamming = 16'h84e; 10'h96: oHamming = 16'h860; 10'h97: oHamming = 16'h873; 10'h98: oHamming = 16'h885; 10'h99: oHamming = 16'h898; 10'h9a: oHamming = 16'h8ab; 10'h9b: oHamming = 16'h8bd; 10'h9c: oHamming = 16'h8d0; 10'h9d: oHamming = 16'h8e3; 10'h9e: oHamming = 16'h8f6; 10'h9f: oHamming = 16'h909; 10'ha0: oHamming = 16'h91d; 10'ha1: oHamming = 16'h930; 10'ha2: oHamming = 16'h943; 10'ha3: oHamming = 16'h957; 10'ha4: oHamming = 16'h96a; 10'ha5: oHamming = 16'h97e; 10'ha6: oHamming = 16'h992; 10'ha7: oHamming = 16'h9a5; 10'ha8: oHamming = 16'h9b9; 10'ha9: oHamming = 16'h9cd; 10'haa: oHamming = 16'h9e1; 10'hab: oHamming = 16'h9f5; 10'hac: oHamming = 16'ha09; 10'had: oHamming = 16'ha1d; 10'hae: oHamming = 16'ha32; 10'haf: oHamming = 16'ha46; 10'hb0: oHamming = 16'ha5a; 10'hb1: oHamming = 16'ha6f; 10'hb2: oHamming = 16'ha83; 10'hb3: oHamming = 16'ha98; 10'hb4: oHamming = 16'haad; 10'hb5: oHamming = 16'hac1; 10'hb6: oHamming = 16'had6; 10'hb7: oHamming = 16'haeb; 10'hb8: oHamming = 16'hb00; 10'hb9: oHamming = 16'hb15; 10'hba: oHamming = 16'hb2a; 10'hbb: oHamming = 16'hb3f; 10'hbc: oHamming = 16'hb54;
10'hbd: oHamming = 16'hb69; 10'hbe: oHamming = 16'hb7e; 10'hbf: oHamming = 16'hb94; 10'hc0: oHamming = 16'hba9; 10'hc1: oHamming = 16'hbbf; 10'hc2: oHamming = 16'hbd4; 10'hc3: oHamming = 16'hbea; 10'hc4: oHamming = 16'hbff; 10'hc5: oHamming = 16'hc15; 10'hc6: oHamming = 16'hc2a; 10'hc7: oHamming = 16'hc40; 10'hc8: oHamming = 16'hc56; 10'hc9: oHamming = 16'hc6c; 10'hca: oHamming = 16'hc82; 10'hcb: oHamming = 16'hc98; 10'hcc: oHamming = 16'hcae; 10'hcd: oHamming = 16'hcc4; 10'hce: oHamming = 16'hcda; 10'hcf: oHamming = 16'hcf0; 10'hd0: oHamming = 16'hd06; 10'hd1: oHamming = 16'hd1c; 10'hd2: oHamming = 16'hd32; 10'hd3: oHamming = 16'hd48; 10'hd4: oHamming = 16'hd5f; 10'hd5: oHamming = 16'hd75; 10'hd6: oHamming = 16'hd8b; 10'hd7: oHamming = 16'hda2; 10'hd8: oHamming = 16'hdb8; 10'hd9: oHamming = 16'hdcf; 10'hda: oHamming = 16'hde5; 10'hdb: oHamming = 16'hdfc; 10'hdc: oHamming = 16'he12; 10'hdd: oHamming = 16'he29; 10'hde: oHamming = 16'he40; 10'hdf: oHamming = 16'he56; 10'he0: oHamming = 16'he6d; 10'he1: oHamming = 16'he84; 10'he2: oHamming = 16'he9a; 10'he3: oHamming = 16'heb1; 10'he4: oHamming = 16'hec8; 10'he5: oHamming = 16'hedf; 10'he6: oHamming = 16'hef6; 10'he7: oHamming = 16'hf0d; 10'he8: oHamming = 16'hf23; 10'he9: oHamming = 16'hf3a; 10'hea: oHamming = 16'hf51; 10'heb: oHamming = 16'hf68; 10'hec: oHamming = 16'hf7f; 10'hed: oHamming = 16'hf96; 10'hee: oHamming = 16'hfad; 10'hef: oHamming = 16'hfc4; 10'hf0: oHamming = 16'hfdb; 10'hf1: oHamming = 16'hff2; 10'hf2: oHamming = 16'h1009; 10'hf3: oHamming = 16'h1020; 10'hf4: oHamming = 16'h1037; 10'hf5: oHamming = 16'h104f;
10'hf6: oHamming = 16'h1066; 10'hf7: oHamming = 16'h107d; 10'hf8: oHamming = 16'h1094; 10'hf9: oHamming = 16'h10ab; 10'hfa: oHamming = 16'h10c2; 10'hfb: oHamming = 16'h10d9; 10'hfc: oHamming = 16'h10f0; 10'hfd: oHamming = 16'h1108; 10'hfe: oHamming = 16'h111f; 10'hff: oHamming = 16'h1136; 10'h100: oHamming = 16'h114d; 10'h101: oHamming = 16'h1164; 10'h102: oHamming = 16'h117b; 10'h103: oHamming = 16'h1192; 10'h104: oHamming = 16'h11aa; 10'h105: oHamming = 16'h11c1; 10'h106: oHamming = 16'h11d8; 10'h107: oHamming = 16'h11ef; 10'h108: oHamming = 16'h1206; 10'h109: oHamming = 16'h121d; 10'h10a: oHamming = 16'h1234; 10'h10b: oHamming = 16'h124b; 10'h10c: oHamming = 16'h1262; 10'h10d: oHamming = 16'h127a; 10'h10e: oHamming = 16'h1291; 10'h10f: oHamming = 16'h12a8; 10'h110: oHamming = 16'h12bf; 10'h111: oHamming = 16'h12d6; 10'h112: oHamming = 16'h12ed; 10'h113: oHamming = 16'h1304; 10'h114: oHamming = 16'h131b; 10'h115: oHamming = 16'h1332; 10'h116: oHamming = 16'h1349; 10'h117: oHamming = 16'h135f; 10'h118: oHamming = 16'h1376; 10'h119: oHamming = 16'h138d; 10'h11a: oHamming = 16'h13a4; 10'h11b: oHamming = 16'h13bb; 10'h11c: oHamming = 16'h13d2; 10'h11d: oHamming = 16'h13e9; 10'h11e: oHamming = 16'h13ff; 10'h11f: oHamming = 16'h1416; 10'h120: oHamming = 16'h142d; 10'h121: oHamming = 16'h1443; 10'h122: oHamming = 16'h145a; 10'h123: oHamming = 16'h1471; 10'h124: oHamming = 16'h1487; 10'h125: oHamming = 16'h149e; 10'h126: oHamming = 16'h14b4; 10'h127: oHamming = 16'h14cb; 10'h128: oHamming = 16'h14e1; 10'h129: oHamming = 16'h14f8; 10'h12a: oHamming = 16'h150e; 10'h12b: oHamming = 16'h1524; 10'h12c: oHamming = 16'h153b; 10'h12d: oHamming = 16'h1551; 10'h12e: oHamming = 16'h1567;
10'h12f: oHamming = 16'h157d; 10'h130: oHamming = 16'h1594; 10'h131: oHamming = 16'h15aa; 10'h132: oHamming = 16'h15c0; 10'h133: oHamming = 16'h15d6; 10'h134: oHamming = 16'h15ec; 10'h135: oHamming = 16'h1602; 10'h136: oHamming = 16'h1618; 10'h137: oHamming = 16'h162e; 10'h138: oHamming = 16'h1643; 10'h139: oHamming = 16'h1659; 10'h13a: oHamming = 16'h166f; 10'h13b: oHamming = 16'h1684; 10'h13c: oHamming = 16'h169a; 10'h13d: oHamming = 16'h16b0; 10'h13e: oHamming = 16'h16c5; 10'h13f: oHamming = 16'h16db; 10'h140: oHamming = 16'h16f0; 10'h141: oHamming = 16'h1705; 10'h142: oHamming = 16'h171b; 10'h143: oHamming = 16'h1730; 10'h144: oHamming = 16'h1745; 10'h145: oHamming = 16'h175a; 10'h146: oHamming = 16'h176f; 10'h147: oHamming = 16'h1784; 10'h148: oHamming = 16'h1799; 10'h149: oHamming = 16'h17ae; 10'h14a: oHamming = 16'h17c3; 10'h14b: oHamming = 16'h17d7; 10'h14c: oHamming = 16'h17ec; 10'h14d: oHamming = 16'h1801; 10'h14e: oHamming = 16'h1815; 10'h14f: oHamming = 16'h182a; 10'h150: oHamming = 16'h183e; 10'h151: oHamming = 16'h1853; 10'h152: oHamming = 16'h1867; 10'h153: oHamming = 16'h187b; 10'h154: oHamming = 16'h188f; 10'h155: oHamming = 16'h18a3; 10'h156: oHamming = 16'h18b7; 10'h157: oHamming = 16'h18cb; 10'h158: oHamming = 16'h18df; 10'h159: oHamming = 16'h18f3; 10'h15a: oHamming = 16'h1907; 10'h15b: oHamming = 16'h191a; 10'h15c: oHamming = 16'h192e; 10'h15d: oHamming = 16'h1941; 10'h15e: oHamming = 16'h1955; 10'h15f: oHamming = 16'h1968; 10'h160: oHamming = 16'h197b; 10'h161: oHamming = 16'h198f; 10'h162: oHamming = 16'h19a2; 10'h163: oHamming = 16'h19b5; 10'h164: oHamming = 16'h19c8; 10'h165: oHamming = 16'h19da; 10'h166: oHamming = 16'h19ed; 10'h167: oHamming = 16'h1a00;
10'h168: oHamming = 16'h1a12; 10'h169: oHamming = 16'h1a25; 10'h16a: oHamming = 16'h1a37; 10'h16b: oHamming = 16'h1a4a; 10'h16c: oHamming = 16'h1a5c; 10'h16d: oHamming = 16'h1a6e; 10'h16e: oHamming = 16'h1a80; 10'h16f: oHamming = 16'h1a92; 10'h170: oHamming = 16'h1aa4; 10'h171: oHamming = 16'h1ab6; 10'h172: oHamming = 16'h1ac8; 10'h173: oHamming = 16'h1ad9; 10'h174: oHamming = 16'h1aeb; 10'h175: oHamming = 16'h1afc; 10'h176: oHamming = 16'h1b0e; 10'h177: oHamming = 16'h1b1f; 10'h178: oHamming = 16'h1b30; 10'h179: oHamming = 16'h1b41; 10'h17a: oHamming = 16'h1b52; 10'h17b: oHamming = 16'h1b63; 10'h17c: oHamming = 16'h1b74; 10'h17d: oHamming = 16'h1b84; 10'h17e: oHamming = 16'h1b95; 10'h17f: oHamming = 16'h1ba6; 10'h180: oHamming = 16'h1bb6; 10'h181: oHamming = 16'h1bc6; 10'h182: oHamming = 16'h1bd6; 10'h183: oHamming = 16'h1be6; 10'h184: oHamming = 16'h1bf6; 10'h185: oHamming = 16'h1c06; 10'h186: oHamming = 16'h1c16; 10'h187: oHamming = 16'h1c26; 10'h188: oHamming = 16'h1c35; 10'h189: oHamming = 16'h1c45; 10'h18a: oHamming = 16'h1c54; 10'h18b: oHamming = 16'h1c63; 10'h18c: oHamming = 16'h1c72; 10'h18d: oHamming = 16'h1c81; 10'h18e: oHamming = 16'h1c90; 10'h18f: oHamming = 16'h1c9f; 10'h190: oHamming = 16'h1cae; 10'h191: oHamming = 16'h1cbc; 10'h192: oHamming = 16'h1ccb; 10'h193: oHamming = 16'h1cd9; 10'h194: oHamming = 16'h1ce8; 10'h195: oHamming = 16'h1cf6; 10'h196: oHamming = 16'h1d04; 10'h197: oHamming = 16'h1d12; 10'h198: oHamming = 16'h1d1f; 10'h199: oHamming = 16'h1d2d; 10'h19a: oHamming = 16'h1d3b; 10'h19b: oHamming = 16'h1d48; 10'h19c: oHamming = 16'h1d55; 10'h19d: oHamming = 16'h1d63; 10'h19e: oHamming = 16'h1d70; 10'h19f: oHamming = 16'h1d7d; 10'h1a0: oHamming = 16'h1d8a;
10'h1a1: oHamming = 16'h1d96; 10'h1a2: oHamming = 16'h1da3; 10'h1a3: oHamming = 16'h1db0; 10'h1a4: oHamming = 16'h1dbc; 10'h1a5: oHamming = 16'h1dc8; 10'h1a6: oHamming = 16'h1dd4; 10'h1a7: oHamming = 16'h1de0; 10'h1a8: oHamming = 16'h1dec; 10'h1a9: oHamming = 16'h1df8; 10'h1aa: oHamming = 16'h1e04; 10'h1ab: oHamming = 16'h1e0f; 10'h1ac: oHamming = 16'h1e1b; 10'h1ad: oHamming = 16'h1e26; 10'h1ae: oHamming = 16'h1e31; 10'h1af: oHamming = 16'h1e3c; 10'h1b0: oHamming = 16'h1e47; 10'h1b1: oHamming = 16'h1e52; 10'h1b2: oHamming = 16'h1e5d; 10'h1b3: oHamming = 16'h1e67; 10'h1b4: oHamming = 16'h1e72; 10'h1b5: oHamming = 16'h1e7c; 10'h1b6: oHamming = 16'h1e86; 10'h1b7: oHamming = 16'h1e90; 10'h1b8: oHamming = 16'h1e9a; 10'h1b9: oHamming = 16'h1ea4; 10'h1ba: oHamming = 16'h1ead; 10'h1bb: oHamming = 16'h1eb7; 10'h1bc: oHamming = 16'h1ec0; 10'h1bd: oHamming = 16'h1eca; 10'h1be: oHamming = 16'h1ed3; 10'h1bf: oHamming = 16'h1edc; 10'h1c0: oHamming = 16'h1ee5; 10'h1c1: oHamming = 16'h1eed; 10'h1c2: oHamming = 16'h1ef6; 10'h1c3: oHamming = 16'h1efe; 10'h1c4: oHamming = 16'h1f07; 10'h1c5: oHamming = 16'h1f0f; 10'h1c6: oHamming = 16'h1f17; 10'h1c7: oHamming = 16'h1f1f; 10'h1c8: oHamming = 16'h1f27; 10'h1c9: oHamming = 16'h1f2e; 10'h1ca: oHamming = 16'h1f36; 10'h1cb: oHamming = 16'h1f3d; 10'h1cc: oHamming = 16'h1f45; 10'h1cd: oHamming = 16'h1f4c; 10'h1ce: oHamming = 16'h1f53; 10'h1cf: oHamming = 16'h1f5a; 10'h1d0: oHamming = 16'h1f60; 10'h1d1: oHamming = 16'h1f67; 10'h1d2: oHamming = 16'h1f6d; 10'h1d3: oHamming = 16'h1f74; 10'h1d4: oHamming = 16'h1f7a; 10'h1d5: oHamming = 16'h1f80; 10'h1d6: oHamming = 16'h1f86; 10'h1d7: oHamming = 16'h1f8c; 10'h1d8: oHamming = 16'h1f91; 10'h1d9: oHamming = 16'h1f97;
10'h1da: oHamming = 16'h1f9c; 10'h1db: oHamming = 16'h1fa1; 10'h1dc: oHamming = 16'h1fa6; 10'h1dd: oHamming = 16'h1fab; 10'h1de: oHamming = 16'h1fb0; 10'h1df: oHamming = 16'h1fb5; 10'h1e0: oHamming = 16'h1fb9; 10'h1e1: oHamming = 16'h1fbe; 10'h1e2: oHamming = 16'h1fc2; 10'h1e3: oHamming = 16'h1fc6; 10'h1e4: oHamming = 16'h1fca; 10'h1e5: oHamming = 16'h1fce; 10'h1e6: oHamming = 16'h1fd1; 10'h1e7: oHamming = 16'h1fd5; 10'h1e8: oHamming = 16'h1fd8; 10'h1e9: oHamming = 16'h1fdc; 10'h1ea: oHamming = 16'h1fdf; 10'h1eb: oHamming = 16'h1fe2; 10'h1ec: oHamming = 16'h1fe5; 10'h1ed: oHamming = 16'h1fe7; 10'h1ee: oHamming = 16'h1fea; 10'h1ef: oHamming = 16'h1fec; 10'h1f0: oHamming = 16'h1fee; 10'h1f1: oHamming = 16'h1ff1; 10'h1f2: oHamming = 16'h1ff3; 10'h1f3: oHamming = 16'h1ff4; 10'h1f4: oHamming = 16'h1ff6; 10'h1f5: oHamming = 16'h1ff8; 10'h1f6: oHamming = 16'h1ff9; 10'h1f7: oHamming = 16'h1ffa; 10'h1f8: oHamming = 16'h1ffc; 10'h1f9: oHamming = 16'h1ffc; 10'h1fa: oHamming = 16'h1ffd; 10'h1fb: oHamming = 16'h1ffe; 10'h1fc: oHamming = 16'h1fff; 10'h1fd: oHamming = 16'h1fff; 10'h1fe: oHamming = 16'h1fff; 10'h1ff: oHamming = 16'h1fff; 10'h200: oHamming = 16'h1fff; 10'h201: oHamming = 16'h1fff; 10'h202: oHamming = 16'h1fff; 10'h203: oHamming = 16'h1fff; 10'h204: oHamming = 16'h1ffe; 10'h205: oHamming = 16'h1ffd; 10'h206: oHamming = 16'h1ffc; 10'h207: oHamming = 16'h1ffc; 10'h208: oHamming = 16'h1ffa; 10'h209: oHamming = 16'h1ff9; 10'h20a: oHamming = 16'h1ff8; 10'h20b: oHamming = 16'h1ff6; 10'h20c: oHamming = 16'h1ff4; 10'h20d: oHamming = 16'h1ff3; 10'h20e: oHamming = 16'h1ff1; 10'h20f: oHamming = 16'h1fee; 10'h210: oHamming = 16'h1fec; 10'h211: oHamming = 16'h1fea; 10'h212: oHamming = 16'h1fe7;
10'h213: oHamming = 16'h1fe5; 10'h214: oHamming = 16'h1fe2; 10'h215: oHamming = 16'h1fdf; 10'h216: oHamming = 16'h1fdc; 10'h217: oHamming = 16'h1fd8; 10'h218: oHamming = 16'h1fd5; 10'h219: oHamming = 16'h1fd1; 10'h21a: oHamming = 16'h1fce; 10'h21b: oHamming = 16'h1fca; 10'h21c: oHamming = 16'h1fc6; 10'h21d: oHamming = 16'h1fc2; 10'h21e: oHamming = 16'h1fbe; 10'h21f: oHamming = 16'h1fb9; 10'h220: oHamming = 16'h1fb5; 10'h221: oHamming = 16'h1fb0; 10'h222: oHamming = 16'h1fab; 10'h223: oHamming = 16'h1fa6; 10'h224: oHamming = 16'h1fa1; 10'h225: oHamming = 16'h1f9c; 10'h226: oHamming = 16'h1f97; 10'h227: oHamming = 16'h1f91; 10'h228: oHamming = 16'h1f8c; 10'h229: oHamming = 16'h1f86; 10'h22a: oHamming = 16'h1f80; 10'h22b: oHamming = 16'h1f7a; 10'h22c: oHamming = 16'h1f74; 10'h22d: oHamming = 16'h1f6d; 10'h22e: oHamming = 16'h1f67; 10'h22f: oHamming = 16'h1f60; 10'h230: oHamming = 16'h1f5a; 10'h231: oHamming = 16'h1f53; 10'h232: oHamming = 16'h1f4c; 10'h233: oHamming = 16'h1f45; 10'h234: oHamming = 16'h1f3d; 10'h235: oHamming = 16'h1f36; 10'h236: oHamming = 16'h1f2e; 10'h237: oHamming = 16'h1f27; 10'h238: oHamming = 16'h1f1f; 10'h239: oHamming = 16'h1f17; 10'h23a: oHamming = 16'h1f0f; 10'h23b: oHamming = 16'h1f07; 10'h23c: oHamming = 16'h1efe; 10'h23d: oHamming = 16'h1ef6; 10'h23e: oHamming = 16'h1eed; 10'h23f: oHamming = 16'h1ee5; 10'h240: oHamming = 16'h1edc; 10'h241: oHamming = 16'h1ed3; 10'h242: oHamming = 16'h1eca; 10'h243: oHamming = 16'h1ec0; 10'h244: oHamming = 16'h1eb7; 10'h245: oHamming = 16'h1ead; 10'h246: oHamming = 16'h1ea4; 10'h247: oHamming = 16'h1e9a; 10'h248: oHamming = 16'h1e90; 10'h249: oHamming = 16'h1e86; 10'h24a: oHamming = 16'h1e7c; 10'h24b: oHamming = 16'h1e72;
10'h24c: oHamming = 16'h1e67; 10'h24d: oHamming = 16'h1e5d; 10'h24e: oHamming = 16'h1e52; 10'h24f: oHamming = 16'h1e47; 10'h250: oHamming = 16'h1e3c; 10'h251: oHamming = 16'h1e31; 10'h252: oHamming = 16'h1e26; 10'h253: oHamming = 16'h1e1b; 10'h254: oHamming = 16'h1e0f; 10'h255: oHamming = 16'h1e04; 10'h256: oHamming = 16'h1df8; 10'h257: oHamming = 16'h1dec; 10'h258: oHamming = 16'h1de0; 10'h259: oHamming = 16'h1dd4; 10'h25a: oHamming = 16'h1dc8; 10'h25b: oHamming = 16'h1dbc; 10'h25c: oHamming = 16'h1db0; 10'h25d: oHamming = 16'h1da3; 10'h25e: oHamming = 16'h1d96; 10'h25f: oHamming = 16'h1d8a; 10'h260: oHamming = 16'h1d7d; 10'h261: oHamming = 16'h1d70; 10'h262: oHamming = 16'h1d63; 10'h263: oHamming = 16'h1d55; 10'h264: oHamming = 16'h1d48; 10'h265: oHamming = 16'h1d3b; 10'h266: oHamming = 16'h1d2d; 10'h267: oHamming = 16'h1d1f; 10'h268: oHamming = 16'h1d12; 10'h269: oHamming = 16'h1d04; 10'h26a: oHamming = 16'h1cf6; 10'h26b: oHamming = 16'h1ce8; 10'h26c: oHamming = 16'h1cd9; 10'h26d: oHamming = 16'h1ccb; 10'h26e: oHamming = 16'h1cbc; 10'h26f: oHamming = 16'h1cae; 10'h270: oHamming = 16'h1c9f; 10'h271: oHamming = 16'h1c90; 10'h272: oHamming = 16'h1c81; 10'h273: oHamming = 16'h1c72; 10'h274: oHamming = 16'h1c63; 10'h275: oHamming = 16'h1c54; 10'h276: oHamming = 16'h1c45; 10'h277: oHamming = 16'h1c35; 10'h278: oHamming = 16'h1c26; 10'h279: oHamming = 16'h1c16; 10'h27a: oHamming = 16'h1c06; 10'h27b: oHamming = 16'h1bf6; 10'h27c: oHamming = 16'h1be6; 10'h27d: oHamming = 16'h1bd6; 10'h27e: oHamming = 16'h1bc6; 10'h27f: oHamming = 16'h1bb6; 10'h280: oHamming = 16'h1ba6; 10'h281: oHamming = 16'h1b95; 10'h282: oHamming = 16'h1b84; 10'h283: oHamming = 16'h1b74; 10'h284: oHamming = 16'h1b63;
10'h285: oHamming = 16'h1b52; 10'h286: oHamming = 16'h1b41; 10'h287: oHamming = 16'h1b30; 10'h288: oHamming = 16'h1b1f; 10'h289: oHamming = 16'h1b0e; 10'h28a: oHamming = 16'h1afc; 10'h28b: oHamming = 16'h1aeb; 10'h28c: oHamming = 16'h1ad9; 10'h28d: oHamming = 16'h1ac8; 10'h28e: oHamming = 16'h1ab6; 10'h28f: oHamming = 16'h1aa4; 10'h290: oHamming = 16'h1a92; 10'h291: oHamming = 16'h1a80; 10'h292: oHamming = 16'h1a6e; 10'h293: oHamming = 16'h1a5c; 10'h294: oHamming = 16'h1a4a; 10'h295: oHamming = 16'h1a37; 10'h296: oHamming = 16'h1a25; 10'h297: oHamming = 16'h1a12; 10'h298: oHamming = 16'h1a00; 10'h299: oHamming = 16'h19ed; 10'h29a: oHamming = 16'h19da; 10'h29b: oHamming = 16'h19c8; 10'h29c: oHamming = 16'h19b5; 10'h29d: oHamming = 16'h19a2; 10'h29e: oHamming = 16'h198f; 10'h29f: oHamming = 16'h197b; 10'h2a0: oHamming = 16'h1968; 10'h2a1: oHamming = 16'h1955; 10'h2a2: oHamming = 16'h1941; 10'h2a3: oHamming = 16'h192e; 10'h2a4: oHamming = 16'h191a; 10'h2a5: oHamming = 16'h1907; 10'h2a6: oHamming = 16'h18f3; 10'h2a7: oHamming = 16'h18df; 10'h2a8: oHamming = 16'h18cb; 10'h2a9: oHamming = 16'h18b7; 10'h2aa: oHamming = 16'h18a3; 10'h2ab: oHamming = 16'h188f; 10'h2ac: oHamming = 16'h187b; 10'h2ad: oHamming = 16'h1867; 10'h2ae: oHamming = 16'h1853; 10'h2af: oHamming = 16'h183e; 10'h2b0: oHamming = 16'h182a; 10'h2b1: oHamming = 16'h1815; 10'h2b2: oHamming = 16'h1801; 10'h2b3: oHamming = 16'h17ec; 10'h2b4: oHamming = 16'h17d7; 10'h2b5: oHamming = 16'h17c3; 10'h2b6: oHamming = 16'h17ae; 10'h2b7: oHamming = 16'h1799; 10'h2b8: oHamming = 16'h1784; 10'h2b9: oHamming = 16'h176f; 10'h2ba: oHamming = 16'h175a; 10'h2bb: oHamming = 16'h1745; 10'h2bc: oHamming = 16'h1730; 10'h2bd: oHamming = 16'h171b;
10'h2be: oHamming = 16'h1705; 10'h2bf: oHamming = 16'h16f0; 10'h2c0: oHamming = 16'h16db; 10'h2c1: oHamming = 16'h16c5; 10'h2c2: oHamming = 16'h16b0; 10'h2c3: oHamming = 16'h169a; 10'h2c4: oHamming = 16'h1684; 10'h2c5: oHamming = 16'h166f; 10'h2c6: oHamming = 16'h1659; 10'h2c7: oHamming = 16'h1643; 10'h2c8: oHamming = 16'h162e; 10'h2c9: oHamming = 16'h1618; 10'h2ca: oHamming = 16'h1602; 10'h2cb: oHamming = 16'h15ec; 10'h2cc: oHamming = 16'h15d6; 10'h2cd: oHamming = 16'h15c0; 10'h2ce: oHamming = 16'h15aa; 10'h2cf: oHamming = 16'h1594; 10'h2d0: oHamming = 16'h157d; 10'h2d1: oHamming = 16'h1567; 10'h2d2: oHamming = 16'h1551; 10'h2d3: oHamming = 16'h153b; 10'h2d4: oHamming = 16'h1524; 10'h2d5: oHamming = 16'h150e; 10'h2d6: oHamming = 16'h14f8; 10'h2d7: oHamming = 16'h14e1; 10'h2d8: oHamming = 16'h14cb; 10'h2d9: oHamming = 16'h14b4; 10'h2da: oHamming = 16'h149e; 10'h2db: oHamming = 16'h1487; 10'h2dc: oHamming = 16'h1471; 10'h2dd: oHamming = 16'h145a; 10'h2de: oHamming = 16'h1443; 10'h2df: oHamming = 16'h142d; 10'h2e0: oHamming = 16'h1416; 10'h2e1: oHamming = 16'h13ff; 10'h2e2: oHamming = 16'h13e9; 10'h2e3: oHamming = 16'h13d2; 10'h2e4: oHamming = 16'h13bb; 10'h2e5: oHamming = 16'h13a4; 10'h2e6: oHamming = 16'h138d; 10'h2e7: oHamming = 16'h1376; 10'h2e8: oHamming = 16'h135f; 10'h2e9: oHamming = 16'h1349; 10'h2ea: oHamming = 16'h1332; 10'h2eb: oHamming = 16'h131b; 10'h2ec: oHamming = 16'h1304; 10'h2ed: oHamming = 16'h12ed; 10'h2ee: oHamming = 16'h12d6; 10'h2ef: oHamming = 16'h12bf; 10'h2f0: oHamming = 16'h12a8; 10'h2f1: oHamming = 16'h1291; 10'h2f2: oHamming = 16'h127a; 10'h2f3: oHamming = 16'h1262; 10'h2f4: oHamming = 16'h124b; 10'h2f5: oHamming = 16'h1234; 10'h2f6: oHamming = 16'h121d;
10'h2f7: oHamming = 16'h1206; 10'h2f8: oHamming = 16'h11ef; 10'h2f9: oHamming = 16'h11d8; 10'h2fa: oHamming = 16'h11c1; 10'h2fb: oHamming = 16'h11aa; 10'h2fc: oHamming = 16'h1192; 10'h2fd: oHamming = 16'h117b; 10'h2fe: oHamming = 16'h1164; 10'h2ff: oHamming = 16'h114d; 10'h300: oHamming = 16'h1136; 10'h301: oHamming = 16'h111f; 10'h302: oHamming = 16'h1108; 10'h303: oHamming = 16'h10f0; 10'h304: oHamming = 16'h10d9; 10'h305: oHamming = 16'h10c2; 10'h306: oHamming = 16'h10ab; 10'h307: oHamming = 16'h1094; 10'h308: oHamming = 16'h107d; 10'h309: oHamming = 16'h1066; 10'h30a: oHamming = 16'h104f; 10'h30b: oHamming = 16'h1037; 10'h30c: oHamming = 16'h1020; 10'h30d: oHamming = 16'h1009; 10'h30e: oHamming = 16'hff2; 10'h30f: oHamming = 16'hfdb; 10'h310: oHamming = 16'hfc4; 10'h311: oHamming = 16'hfad; 10'h312: oHamming = 16'hf96; 10'h313: oHamming = 16'hf7f; 10'h314: oHamming = 16'hf68; 10'h315: oHamming = 16'hf51; 10'h316: oHamming = 16'hf3a; 10'h317: oHamming = 16'hf23; 10'h318: oHamming = 16'hf0d; 10'h319: oHamming = 16'hef6; 10'h31a: oHamming = 16'hedf; 10'h31b: oHamming = 16'hec8; 10'h31c: oHamming = 16'heb1; 10'h31d: oHamming = 16'he9a; 10'h31e: oHamming = 16'he84; 10'h31f: oHamming = 16'he6d; 10'h320: oHamming = 16'he56; 10'h321: oHamming = 16'he40; 10'h322: oHamming = 16'he29; 10'h323: oHamming = 16'he12; 10'h324: oHamming = 16'hdfc; 10'h325: oHamming = 16'hde5; 10'h326: oHamming = 16'hdcf; 10'h327: oHamming = 16'hdb8; 10'h328: oHamming = 16'hda2; 10'h329: oHamming = 16'hd8b; 10'h32a: oHamming = 16'hd75; 10'h32b: oHamming = 16'hd5f; 10'h32c: oHamming = 16'hd48; 10'h32d: oHamming = 16'hd32; 10'h32e: oHamming = 16'hd1c; 10'h32f: oHamming = 16'hd06;
10'h330: oHamming = 16'hcf0; 10'h331: oHamming = 16'hcda; 10'h332: oHamming = 16'hcc4; 10'h333: oHamming = 16'hcae; 10'h334: oHamming = 16'hc98; 10'h335: oHamming = 16'hc82; 10'h336: oHamming = 16'hc6c; 10'h337: oHamming = 16'hc56; 10'h338: oHamming = 16'hc40; 10'h339: oHamming = 16'hc2a; 10'h33a: oHamming = 16'hc15; 10'h33b: oHamming = 16'hbff; 10'h33c: oHamming = 16'hbea; 10'h33d: oHamming = 16'hbd4; 10'h33e: oHamming = 16'hbbf; 10'h33f: oHamming = 16'hba9; 10'h340: oHamming = 16'hb94; 10'h341: oHamming = 16'hb7e; 10'h342: oHamming = 16'hb69; 10'h343: oHamming = 16'hb54; 10'h344: oHamming = 16'hb3f; 10'h345: oHamming = 16'hb2a; 10'h346: oHamming = 16'hb15; 10'h347: oHamming = 16'hb00; 10'h348: oHamming = 16'haeb; 10'h349: oHamming = 16'had6; 10'h34a: oHamming = 16'hac1; 10'h34b: oHamming = 16'haad; 10'h34c: oHamming = 16'ha98; 10'h34d: oHamming = 16'ha83; 10'h34e: oHamming = 16'ha6f; 10'h34f: oHamming = 16'ha5a; 10'h350: oHamming = 16'ha46; 10'h351: oHamming = 16'ha32; 10'h352: oHamming = 16'ha1d; 10'h353: oHamming = 16'ha09; 10'h354: oHamming = 16'h9f5; 10'h355: oHamming = 16'h9e1; 10'h356: oHamming = 16'h9cd; 10'h357: oHamming = 16'h9b9; 10'h358: oHamming = 16'h9a5; 10'h359: oHamming = 16'h992; 10'h35a: oHamming = 16'h97e; 10'h35b: oHamming = 16'h96a; 10'h35c: oHamming = 16'h957; 10'h35d: oHamming = 16'h943; 10'h35e: oHamming = 16'h930; 10'h35f: oHamming = 16'h91d; 10'h360: oHamming = 16'h909; 10'h361: oHamming = 16'h8f6; 10'h362: oHamming = 16'h8e3; 10'h363: oHamming = 16'h8d0; 10'h364: oHamming = 16'h8bd; 10'h365: oHamming = 16'h8ab; 10'h366: oHamming = 16'h898; 10'h367: oHamming = 16'h885; 10'h368: oHamming = 16'h873;
10'h369: oHamming = 16'h860; 10'h36a: oHamming = 16'h84e; 10'h36b: oHamming = 16'h83b; 10'h36c: oHamming = 16'h829; 10'h36d: oHamming = 16'h817; 10'h36e: oHamming = 16'h805; 10'h36f: oHamming = 16'h7f3; 10'h370: oHamming = 16'h7e1; 10'h371: oHamming = 16'h7cf; 10'h372: oHamming = 16'h7be; 10'h373: oHamming = 16'h7ac; 10'h374: oHamming = 16'h79b; 10'h375: oHamming = 16'h789; 10'h376: oHamming = 16'h778; 10'h377: oHamming = 16'h767; 10'h378: oHamming = 16'h756; 10'h379: oHamming = 16'h745; 10'h37a: oHamming = 16'h734; 10'h37b: oHamming = 16'h723; 10'h37c: oHamming = 16'h712; 10'h37d: oHamming = 16'h702; 10'h37e: oHamming = 16'h6f1; 10'h37f: oHamming = 16'h6e1; 10'h380: oHamming = 16'h6d0; 10'h381: oHamming = 16'h6c0; 10'h382: oHamming = 16'h6b0; 10'h383: oHamming = 16'h6a0; 10'h384: oHamming = 16'h690; 10'h385: oHamming = 16'h680; 10'h386: oHamming = 16'h670; 10'h387: oHamming = 16'h661; 10'h388: oHamming = 16'h651; 10'h389: oHamming = 16'h642; 10'h38a: oHamming = 16'h633; 10'h38b: oHamming = 16'h623; 10'h38c: oHamming = 16'h614; 10'h38d: oHamming = 16'h605; 10'h38e: oHamming = 16'h5f7; 10'h38f: oHamming = 16'h5e8; 10'h390: oHamming = 16'h5d9; 10'h391: oHamming = 16'h5cb; 10'h392: oHamming = 16'h5bc; 10'h393: oHamming = 16'h5ae; 10'h394: oHamming = 16'h5a0; 10'h395: oHamming = 16'h592; 10'h396: oHamming = 16'h584; 10'h397: oHamming = 16'h576; 10'h398: oHamming = 16'h568; 10'h399: oHamming = 16'h55a; 10'h39a: oHamming = 16'h54d; 10'h39b: oHamming = 16'h540; 10'h39c: oHamming = 16'h532; 10'h39d: oHamming = 16'h525; 10'h39e: oHamming = 16'h518; 10'h39f: oHamming = 16'h50b; 10'h3a0: oHamming = 16'h4fe; 10'h3a1: oHamming = 16'h4f2;
10'h3a2: oHamming = 16'h4e5; 10'h3a3: oHamming = 16'h4d9; 10'h3a4: oHamming = 16'h4cc; 10'h3a5: oHamming = 16'h4c0; 10'h3a6: oHamming = 16'h4b4; 10'h3a7: oHamming = 16'h4a8; 10'h3a8: oHamming = 16'h49c; 10'h3a9: oHamming = 16'h490; 10'h3aa: oHamming = 16'h485; 10'h3ab: oHamming = 16'h479; 10'h3ac: oHamming = 16'h46e; 10'h3ad: oHamming = 16'h463; 10'h3ae: oHamming = 16'h458; 10'h3af: oHamming = 16'h44d; 10'h3b0: oHamming = 16'h442; 10'h3b1: oHamming = 16'h437; 10'h3b2: oHamming = 16'h42c; 10'h3b3: oHamming = 16'h422; 10'h3b4: oHamming = 16'h418; 10'h3b5: oHamming = 16'h40d; 10'h3b6: oHamming = 16'h403; 10'h3b7: oHamming = 16'h3f9; 10'h3b8: oHamming = 16'h3f0; 10'h3b9: oHamming = 16'h3e6; 10'h3ba: oHamming = 16'h3dc; 10'h3bb: oHamming = 16'h3d3; 10'h3bc: oHamming = 16'h3c9; 10'h3bd: oHamming = 16'h3c0; 10'h3be: oHamming = 16'h3b7; 10'h3bf: oHamming = 16'h3ae; 10'h3c0: oHamming = 16'h3a5; 10'h3c1: oHamming = 16'h39d; 10'h3c2: oHamming = 16'h394; 10'h3c3: oHamming = 16'h38c; 10'h3c4: oHamming = 16'h384; 10'h3c5: oHamming = 16'h37b; 10'h3c6: oHamming = 16'h373; 10'h3c7: oHamming = 16'h36c; 10'h3c8: oHamming = 16'h364; 10'h3c9: oHamming = 16'h35c; 10'h3ca: oHamming = 16'h355; 10'h3cb: oHamming = 16'h34d; 10'h3cc: oHamming = 16'h346; 10'h3cd: oHamming = 16'h33f; 10'h3ce: oHamming = 16'h338; 10'h3cf: oHamming = 16'h331; 10'h3d0: oHamming = 16'h32b; 10'h3d1: oHamming = 16'h324; 10'h3d2: oHamming = 16'h31e; 10'h3d3: oHamming = 16'h318; 10'h3d4: oHamming = 16'h312; 10'h3d5: oHamming = 16'h30c; 10'h3d6: oHamming = 16'h306; 10'h3d7: oHamming = 16'h300; 10'h3d8: oHamming = 16'h2fa; 10'h3d9: oHamming = 16'h2f5; 10'h3da: oHamming = 16'h2f0;
10'h3db: oHamming = 16'h2eb; 10'h3dc: oHamming = 16'h2e6; 10'h3dd: oHamming = 16'h2e1; 10'h3de: oHamming = 16'h2dc; 10'h3df: oHamming = 16'h2d7; 10'h3e0: oHamming = 16'h2d3; 10'h3e1: oHamming = 16'h2cf; 10'h3e2: oHamming = 16'h2ca; 10'h3e3: oHamming = 16'h2c6; 10'h3e4: oHamming = 16'h2c3; 10'h3e5: oHamming = 16'h2bf; 10'h3e6: oHamming = 16'h2bb; 10'h3e7: oHamming = 16'h2b8; 10'h3e8: oHamming = 16'h2b4; 10'h3e9: oHamming = 16'h2b1; 10'h3ea: oHamming = 16'h2ae; 10'h3eb: oHamming = 16'h2ab; 10'h3ec: oHamming = 16'h2a8; 10'h3ed: oHamming = 16'h2a6; 10'h3ee: oHamming = 16'h2a3; 10'h3ef: oHamming = 16'h2a1; 10'h3f0: oHamming = 16'h29f; 10'h3f1: oHamming = 16'h29d; 10'h3f2: oHamming = 16'h29b; 10'h3f3: oHamming = 16'h299; 10'h3f4: oHamming = 16'h297; 10'h3f5: oHamming = 16'h296; 10'h3f6: oHamming = 16'h295; 10'h3f7: oHamming = 16'h293; 10'h3f8: oHamming = 16'h292; 10'h3f9: oHamming = 16'h291; 10'h3fa: oHamming = 16'h291; 10'h3fb: oHamming = 16'h290; 10'h3fc: oHamming = 16'h28f; 10'h3fd: oHamming = 16'h28f; 10'h3fe: oHamming = 16'h28f; 10'h3ff: oHamming = 16'h28f; endcaseend
endmodule
// Infer ROM storage for a hanning windowmodule hanningrom ( input [9:0] iAddress, output reg [15:0] oHanning);
always @ (iAddress)begin case (iAddress) 10'h00: oHanning = 16'h000; 10'h01: oHanning = 16'h000; 10'h02: oHanning = 16'h000; 10'h03: oHanning = 16'h001;
10'h04: oHanning = 16'h001; 10'h05: oHanning = 16'h002; 10'h06: oHanning = 16'h003; 10'h07: oHanning = 16'h004; 10'h08: oHanning = 16'h006; 10'h09: oHanning = 16'h007; 10'h0a: oHanning = 16'h009; 10'h0b: oHanning = 16'h00b; 10'h0c: oHanning = 16'h00c; 10'h0d: oHanning = 16'h00f; 10'h0e: oHanning = 16'h011; 10'h0f: oHanning = 16'h013; 10'h10: oHanning = 16'h016; 10'h11: oHanning = 16'h018; 10'h12: oHanning = 16'h01b; 10'h13: oHanning = 16'h01e; 10'h14: oHanning = 16'h021; 10'h15: oHanning = 16'h025; 10'h16: oHanning = 16'h028; 10'h17: oHanning = 16'h02c; 10'h18: oHanning = 16'h030; 10'h19: oHanning = 16'h033; 10'h1a: oHanning = 16'h037; 10'h1b: oHanning = 16'h03c; 10'h1c: oHanning = 16'h040; 10'h1d: oHanning = 16'h045; 10'h1e: oHanning = 16'h049; 10'h1f: oHanning = 16'h04e; 10'h20: oHanning = 16'h053; 10'h21: oHanning = 16'h058; 10'h22: oHanning = 16'h05d; 10'h23: oHanning = 16'h063; 10'h24: oHanning = 16'h068; 10'h25: oHanning = 16'h06e; 10'h26: oHanning = 16'h074; 10'h27: oHanning = 16'h07a; 10'h28: oHanning = 16'h080; 10'h29: oHanning = 16'h087; 10'h2a: oHanning = 16'h08d; 10'h2b: oHanning = 16'h094; 10'h2c: oHanning = 16'h09a; 10'h2d: oHanning = 16'h0a1; 10'h2e: oHanning = 16'h0a8; 10'h2f: oHanning = 16'h0b0; 10'h30: oHanning = 16'h0b7; 10'h31: oHanning = 16'h0be; 10'h32: oHanning = 16'h0c6; 10'h33: oHanning = 16'h0ce; 10'h34: oHanning = 16'h0d6; 10'h35: oHanning = 16'h0de; 10'h36: oHanning = 16'h0e6; 10'h37: oHanning = 16'h0ee; 10'h38: oHanning = 16'h0f7; 10'h39: oHanning = 16'h100; 10'h3a: oHanning = 16'h108; 10'h3b: oHanning = 16'h111; 10'h3c: oHanning = 16'h11b;
10'h3d: oHanning = 16'h124; 10'h3e: oHanning = 16'h12d; 10'h3f: oHanning = 16'h137; 10'h40: oHanning = 16'h140; 10'h41: oHanning = 16'h14a; 10'h42: oHanning = 16'h154; 10'h43: oHanning = 16'h15e; 10'h44: oHanning = 16'h168; 10'h45: oHanning = 16'h173; 10'h46: oHanning = 16'h17d; 10'h47: oHanning = 16'h188; 10'h48: oHanning = 16'h193; 10'h49: oHanning = 16'h19e; 10'h4a: oHanning = 16'h1a9; 10'h4b: oHanning = 16'h1b4; 10'h4c: oHanning = 16'h1bf; 10'h4d: oHanning = 16'h1cb; 10'h4e: oHanning = 16'h1d6; 10'h4f: oHanning = 16'h1e2; 10'h50: oHanning = 16'h1ee; 10'h51: oHanning = 16'h1fa; 10'h52: oHanning = 16'h206; 10'h53: oHanning = 16'h213; 10'h54: oHanning = 16'h21f; 10'h55: oHanning = 16'h22c; 10'h56: oHanning = 16'h238; 10'h57: oHanning = 16'h245; 10'h58: oHanning = 16'h252; 10'h59: oHanning = 16'h25f; 10'h5a: oHanning = 16'h26c; 10'h5b: oHanning = 16'h27a; 10'h5c: oHanning = 16'h287; 10'h5d: oHanning = 16'h295; 10'h5e: oHanning = 16'h2a3; 10'h5f: oHanning = 16'h2b0; 10'h60: oHanning = 16'h2be; 10'h61: oHanning = 16'h2cd; 10'h62: oHanning = 16'h2db; 10'h63: oHanning = 16'h2e9; 10'h64: oHanning = 16'h2f8; 10'h65: oHanning = 16'h306; 10'h66: oHanning = 16'h315; 10'h67: oHanning = 16'h324; 10'h68: oHanning = 16'h333; 10'h69: oHanning = 16'h342; 10'h6a: oHanning = 16'h351; 10'h6b: oHanning = 16'h361; 10'h6c: oHanning = 16'h370; 10'h6d: oHanning = 16'h380; 10'h6e: oHanning = 16'h390; 10'h6f: oHanning = 16'h3a0; 10'h70: oHanning = 16'h3af; 10'h71: oHanning = 16'h3c0; 10'h72: oHanning = 16'h3d0; 10'h73: oHanning = 16'h3e0; 10'h74: oHanning = 16'h3f1; 10'h75: oHanning = 16'h401;
10'h76: oHanning = 16'h412; 10'h77: oHanning = 16'h423; 10'h78: oHanning = 16'h433; 10'h79: oHanning = 16'h445; 10'h7a: oHanning = 16'h456; 10'h7b: oHanning = 16'h467; 10'h7c: oHanning = 16'h478; 10'h7d: oHanning = 16'h48a; 10'h7e: oHanning = 16'h49b; 10'h7f: oHanning = 16'h4ad; 10'h80: oHanning = 16'h4bf; 10'h81: oHanning = 16'h4d1; 10'h82: oHanning = 16'h4e3; 10'h83: oHanning = 16'h4f5; 10'h84: oHanning = 16'h507; 10'h85: oHanning = 16'h519; 10'h86: oHanning = 16'h52c; 10'h87: oHanning = 16'h53e; 10'h88: oHanning = 16'h551; 10'h89: oHanning = 16'h564; 10'h8a: oHanning = 16'h577; 10'h8b: oHanning = 16'h58a; 10'h8c: oHanning = 16'h59d; 10'h8d: oHanning = 16'h5b0; 10'h8e: oHanning = 16'h5c3; 10'h8f: oHanning = 16'h5d6; 10'h90: oHanning = 16'h5ea; 10'h91: oHanning = 16'h5fd; 10'h92: oHanning = 16'h611; 10'h93: oHanning = 16'h625; 10'h94: oHanning = 16'h638; 10'h95: oHanning = 16'h64c; 10'h96: oHanning = 16'h660; 10'h97: oHanning = 16'h675; 10'h98: oHanning = 16'h689; 10'h99: oHanning = 16'h69d; 10'h9a: oHanning = 16'h6b1; 10'h9b: oHanning = 16'h6c6; 10'h9c: oHanning = 16'h6da; 10'h9d: oHanning = 16'h6ef; 10'h9e: oHanning = 16'h704; 10'h9f: oHanning = 16'h719; 10'ha0: oHanning = 16'h72e; 10'ha1: oHanning = 16'h743; 10'ha2: oHanning = 16'h758; 10'ha3: oHanning = 16'h76d; 10'ha4: oHanning = 16'h782; 10'ha5: oHanning = 16'h797; 10'ha6: oHanning = 16'h7ad; 10'ha7: oHanning = 16'h7c2; 10'ha8: oHanning = 16'h7d8; 10'ha9: oHanning = 16'h7ed; 10'haa: oHanning = 16'h803; 10'hab: oHanning = 16'h819; 10'hac: oHanning = 16'h82f; 10'had: oHanning = 16'h845; 10'hae: oHanning = 16'h85b;
10'haf: oHanning = 16'h871; 10'hb0: oHanning = 16'h887; 10'hb1: oHanning = 16'h89d; 10'hb2: oHanning = 16'h8b4; 10'hb3: oHanning = 16'h8ca; 10'hb4: oHanning = 16'h8e0; 10'hb5: oHanning = 16'h8f7; 10'hb6: oHanning = 16'h90e; 10'hb7: oHanning = 16'h924; 10'hb8: oHanning = 16'h93b; 10'hb9: oHanning = 16'h952; 10'hba: oHanning = 16'h969; 10'hbb: oHanning = 16'h97f; 10'hbc: oHanning = 16'h996; 10'hbd: oHanning = 16'h9ad; 10'hbe: oHanning = 16'h9c5; 10'hbf: oHanning = 16'h9dc; 10'hc0: oHanning = 16'h9f3; 10'hc1: oHanning = 16'ha0a; 10'hc2: oHanning = 16'ha21; 10'hc3: oHanning = 16'ha39; 10'hc4: oHanning = 16'ha50; 10'hc5: oHanning = 16'ha68; 10'hc6: oHanning = 16'ha7f; 10'hc7: oHanning = 16'ha97; 10'hc8: oHanning = 16'haaf; 10'hc9: oHanning = 16'hac6; 10'hca: oHanning = 16'hade; 10'hcb: oHanning = 16'haf6; 10'hcc: oHanning = 16'hb0e; 10'hcd: oHanning = 16'hb26; 10'hce: oHanning = 16'hb3e; 10'hcf: oHanning = 16'hb56; 10'hd0: oHanning = 16'hb6e; 10'hd1: oHanning = 16'hb86; 10'hd2: oHanning = 16'hb9e; 10'hd3: oHanning = 16'hbb6; 10'hd4: oHanning = 16'hbce; 10'hd5: oHanning = 16'hbe6; 10'hd6: oHanning = 16'hbff; 10'hd7: oHanning = 16'hc17; 10'hd8: oHanning = 16'hc2f; 10'hd9: oHanning = 16'hc48; 10'hda: oHanning = 16'hc60; 10'hdb: oHanning = 16'hc79; 10'hdc: oHanning = 16'hc91; 10'hdd: oHanning = 16'hcaa; 10'hde: oHanning = 16'hcc2; 10'hdf: oHanning = 16'hcdb; 10'he0: oHanning = 16'hcf4; 10'he1: oHanning = 16'hd0c; 10'he2: oHanning = 16'hd25; 10'he3: oHanning = 16'hd3e; 10'he4: oHanning = 16'hd56; 10'he5: oHanning = 16'hd6f; 10'he6: oHanning = 16'hd88; 10'he7: oHanning = 16'hda1;
10'he8: oHanning = 16'hdba; 10'he9: oHanning = 16'hdd3; 10'hea: oHanning = 16'hdeb; 10'heb: oHanning = 16'he04; 10'hec: oHanning = 16'he1d; 10'hed: oHanning = 16'he36; 10'hee: oHanning = 16'he4f; 10'hef: oHanning = 16'he68; 10'hf0: oHanning = 16'he81; 10'hf1: oHanning = 16'he9a; 10'hf2: oHanning = 16'heb3; 10'hf3: oHanning = 16'hecc; 10'hf4: oHanning = 16'hee5; 10'hf5: oHanning = 16'hefe; 10'hf6: oHanning = 16'hf17; 10'hf7: oHanning = 16'hf30; 10'hf8: oHanning = 16'hf4a; 10'hf9: oHanning = 16'hf63; 10'hfa: oHanning = 16'hf7c; 10'hfb: oHanning = 16'hf95; 10'hfc: oHanning = 16'hfae; 10'hfd: oHanning = 16'hfc7; 10'hfe: oHanning = 16'hfe0; 10'hff: oHanning = 16'hff9; 10'h100: oHanning = 16'h1012; 10'h101: oHanning = 16'h102b; 10'h102: oHanning = 16'h1045; 10'h103: oHanning = 16'h105e; 10'h104: oHanning = 16'h1077; 10'h105: oHanning = 16'h1090; 10'h106: oHanning = 16'h10a9; 10'h107: oHanning = 16'h10c2; 10'h108: oHanning = 16'h10db; 10'h109: oHanning = 16'h10f4; 10'h10a: oHanning = 16'h110d; 10'h10b: oHanning = 16'h1126; 10'h10c: oHanning = 16'h113f; 10'h10d: oHanning = 16'h1158; 10'h10e: oHanning = 16'h1171; 10'h10f: oHanning = 16'h118a; 10'h110: oHanning = 16'h11a3; 10'h111: oHanning = 16'h11bc; 10'h112: oHanning = 16'h11d5; 10'h113: oHanning = 16'h11ee; 10'h114: oHanning = 16'h1207; 10'h115: oHanning = 16'h1220; 10'h116: oHanning = 16'h1239; 10'h117: oHanning = 16'h1252; 10'h118: oHanning = 16'h126b; 10'h119: oHanning = 16'h1283; 10'h11a: oHanning = 16'h129c; 10'h11b: oHanning = 16'h12b5; 10'h11c: oHanning = 16'h12ce; 10'h11d: oHanning = 16'h12e6; 10'h11e: oHanning = 16'h12ff; 10'h11f: oHanning = 16'h1318; 10'h120: oHanning = 16'h1330;
10'h121: oHanning = 16'h1349; 10'h122: oHanning = 16'h1361; 10'h123: oHanning = 16'h137a; 10'h124: oHanning = 16'h1392; 10'h125: oHanning = 16'h13ab; 10'h126: oHanning = 16'h13c3; 10'h127: oHanning = 16'h13dc; 10'h128: oHanning = 16'h13f4; 10'h129: oHanning = 16'h140c; 10'h12a: oHanning = 16'h1425; 10'h12b: oHanning = 16'h143d; 10'h12c: oHanning = 16'h1455; 10'h12d: oHanning = 16'h146d; 10'h12e: oHanning = 16'h1485; 10'h12f: oHanning = 16'h149d; 10'h130: oHanning = 16'h14b5; 10'h131: oHanning = 16'h14cd; 10'h132: oHanning = 16'h14e5; 10'h133: oHanning = 16'h14fd; 10'h134: oHanning = 16'h1515; 10'h135: oHanning = 16'h152d; 10'h136: oHanning = 16'h1545; 10'h137: oHanning = 16'h155c; 10'h138: oHanning = 16'h1574; 10'h139: oHanning = 16'h158b; 10'h13a: oHanning = 16'h15a3; 10'h13b: oHanning = 16'h15ba; 10'h13c: oHanning = 16'h15d2; 10'h13d: oHanning = 16'h15e9; 10'h13e: oHanning = 16'h1600; 10'h13f: oHanning = 16'h1618; 10'h140: oHanning = 16'h162f; 10'h141: oHanning = 16'h1646; 10'h142: oHanning = 16'h165d; 10'h143: oHanning = 16'h1674; 10'h144: oHanning = 16'h168b; 10'h145: oHanning = 16'h16a2; 10'h146: oHanning = 16'h16b9; 10'h147: oHanning = 16'h16cf; 10'h148: oHanning = 16'h16e6; 10'h149: oHanning = 16'h16fd; 10'h14a: oHanning = 16'h1713; 10'h14b: oHanning = 16'h172a; 10'h14c: oHanning = 16'h1740; 10'h14d: oHanning = 16'h1757; 10'h14e: oHanning = 16'h176d; 10'h14f: oHanning = 16'h1783; 10'h150: oHanning = 16'h1799; 10'h151: oHanning = 16'h17af; 10'h152: oHanning = 16'h17c5; 10'h153: oHanning = 16'h17db; 10'h154: oHanning = 16'h17f1; 10'h155: oHanning = 16'h1807; 10'h156: oHanning = 16'h181c; 10'h157: oHanning = 16'h1832; 10'h158: oHanning = 16'h1848; 10'h159: oHanning = 16'h185d;
10'h15a: oHanning = 16'h1872; 10'h15b: oHanning = 16'h1888; 10'h15c: oHanning = 16'h189d; 10'h15d: oHanning = 16'h18b2; 10'h15e: oHanning = 16'h18c7; 10'h15f: oHanning = 16'h18dc; 10'h160: oHanning = 16'h18f1; 10'h161: oHanning = 16'h1906; 10'h162: oHanning = 16'h191a; 10'h163: oHanning = 16'h192f; 10'h164: oHanning = 16'h1943; 10'h165: oHanning = 16'h1958; 10'h166: oHanning = 16'h196c; 10'h167: oHanning = 16'h1980; 10'h168: oHanning = 16'h1995; 10'h169: oHanning = 16'h19a9; 10'h16a: oHanning = 16'h19bd; 10'h16b: oHanning = 16'h19d0; 10'h16c: oHanning = 16'h19e4; 10'h16d: oHanning = 16'h19f8; 10'h16e: oHanning = 16'h1a0c; 10'h16f: oHanning = 16'h1a1f; 10'h170: oHanning = 16'h1a32; 10'h171: oHanning = 16'h1a46; 10'h172: oHanning = 16'h1a59; 10'h173: oHanning = 16'h1a6c; 10'h174: oHanning = 16'h1a7f; 10'h175: oHanning = 16'h1a92; 10'h176: oHanning = 16'h1aa5; 10'h177: oHanning = 16'h1ab7; 10'h178: oHanning = 16'h1aca; 10'h179: oHanning = 16'h1adc; 10'h17a: oHanning = 16'h1aef; 10'h17b: oHanning = 16'h1b01; 10'h17c: oHanning = 16'h1b13; 10'h17d: oHanning = 16'h1b25; 10'h17e: oHanning = 16'h1b37; 10'h17f: oHanning = 16'h1b49; 10'h180: oHanning = 16'h1b5b; 10'h181: oHanning = 16'h1b6d; 10'h182: oHanning = 16'h1b7e; 10'h183: oHanning = 16'h1b8f; 10'h184: oHanning = 16'h1ba1; 10'h185: oHanning = 16'h1bb2; 10'h186: oHanning = 16'h1bc3; 10'h187: oHanning = 16'h1bd4; 10'h188: oHanning = 16'h1be5; 10'h189: oHanning = 16'h1bf6; 10'h18a: oHanning = 16'h1c06; 10'h18b: oHanning = 16'h1c17; 10'h18c: oHanning = 16'h1c27; 10'h18d: oHanning = 16'h1c37; 10'h18e: oHanning = 16'h1c47; 10'h18f: oHanning = 16'h1c58; 10'h190: oHanning = 16'h1c67; 10'h191: oHanning = 16'h1c77; 10'h192: oHanning = 16'h1c87;
10'h193: oHanning = 16'h1c96; 10'h194: oHanning = 16'h1ca6; 10'h195: oHanning = 16'h1cb5; 10'h196: oHanning = 16'h1cc4; 10'h197: oHanning = 16'h1cd3; 10'h198: oHanning = 16'h1ce2; 10'h199: oHanning = 16'h1cf1; 10'h19a: oHanning = 16'h1d00; 10'h19b: oHanning = 16'h1d0f; 10'h19c: oHanning = 16'h1d1d; 10'h19d: oHanning = 16'h1d2b; 10'h19e: oHanning = 16'h1d39; 10'h19f: oHanning = 16'h1d48; 10'h1a0: oHanning = 16'h1d55; 10'h1a1: oHanning = 16'h1d63; 10'h1a2: oHanning = 16'h1d71; 10'h1a3: oHanning = 16'h1d7e; 10'h1a4: oHanning = 16'h1d8c; 10'h1a5: oHanning = 16'h1d99; 10'h1a6: oHanning = 16'h1da6; 10'h1a7: oHanning = 16'h1db3; 10'h1a8: oHanning = 16'h1dc0; 10'h1a9: oHanning = 16'h1dcd; 10'h1aa: oHanning = 16'h1dda; 10'h1ab: oHanning = 16'h1de6; 10'h1ac: oHanning = 16'h1df3; 10'h1ad: oHanning = 16'h1dff; 10'h1ae: oHanning = 16'h1e0b; 10'h1af: oHanning = 16'h1e17; 10'h1b0: oHanning = 16'h1e23; 10'h1b1: oHanning = 16'h1e2e; 10'h1b2: oHanning = 16'h1e3a; 10'h1b3: oHanning = 16'h1e45; 10'h1b4: oHanning = 16'h1e51; 10'h1b5: oHanning = 16'h1e5c; 10'h1b6: oHanning = 16'h1e67; 10'h1b7: oHanning = 16'h1e72; 10'h1b8: oHanning = 16'h1e7c; 10'h1b9: oHanning = 16'h1e87; 10'h1ba: oHanning = 16'h1e91; 10'h1bb: oHanning = 16'h1e9c; 10'h1bc: oHanning = 16'h1ea6; 10'h1bd: oHanning = 16'h1eb0; 10'h1be: oHanning = 16'h1eba; 10'h1bf: oHanning = 16'h1ec3; 10'h1c0: oHanning = 16'h1ecd; 10'h1c1: oHanning = 16'h1ed7; 10'h1c2: oHanning = 16'h1ee0; 10'h1c3: oHanning = 16'h1ee9; 10'h1c4: oHanning = 16'h1ef2; 10'h1c5: oHanning = 16'h1efb; 10'h1c6: oHanning = 16'h1f04; 10'h1c7: oHanning = 16'h1f0c; 10'h1c8: oHanning = 16'h1f15; 10'h1c9: oHanning = 16'h1f1d; 10'h1ca: oHanning = 16'h1f25; 10'h1cb: oHanning = 16'h1f2d;
10'h1cc: oHanning = 16'h1f35; 10'h1cd: oHanning = 16'h1f3d; 10'h1ce: oHanning = 16'h1f44; 10'h1cf: oHanning = 16'h1f4c; 10'h1d0: oHanning = 16'h1f53; 10'h1d1: oHanning = 16'h1f5a; 10'h1d2: oHanning = 16'h1f61; 10'h1d3: oHanning = 16'h1f68; 10'h1d4: oHanning = 16'h1f6f; 10'h1d5: oHanning = 16'h1f75; 10'h1d6: oHanning = 16'h1f7c; 10'h1d7: oHanning = 16'h1f82; 10'h1d8: oHanning = 16'h1f88; 10'h1d9: oHanning = 16'h1f8e; 10'h1da: oHanning = 16'h1f94; 10'h1db: oHanning = 16'h1f99; 10'h1dc: oHanning = 16'h1f9f; 10'h1dd: oHanning = 16'h1fa4; 10'h1de: oHanning = 16'h1fa9; 10'h1df: oHanning = 16'h1fae; 10'h1e0: oHanning = 16'h1fb3; 10'h1e1: oHanning = 16'h1fb8; 10'h1e2: oHanning = 16'h1fbd; 10'h1e3: oHanning = 16'h1fc1; 10'h1e4: oHanning = 16'h1fc5; 10'h1e5: oHanning = 16'h1fca; 10'h1e6: oHanning = 16'h1fce; 10'h1e7: oHanning = 16'h1fd1; 10'h1e8: oHanning = 16'h1fd5; 10'h1e9: oHanning = 16'h1fd9; 10'h1ea: oHanning = 16'h1fdc; 10'h1eb: oHanning = 16'h1fdf; 10'h1ec: oHanning = 16'h1fe2; 10'h1ed: oHanning = 16'h1fe5; 10'h1ee: oHanning = 16'h1fe8; 10'h1ef: oHanning = 16'h1feb; 10'h1f0: oHanning = 16'h1fed; 10'h1f1: oHanning = 16'h1fef; 10'h1f2: oHanning = 16'h1ff1; 10'h1f3: oHanning = 16'h1ff3; 10'h1f4: oHanning = 16'h1ff5; 10'h1f5: oHanning = 16'h1ff7; 10'h1f6: oHanning = 16'h1ff9; 10'h1f7: oHanning = 16'h1ffa; 10'h1f8: oHanning = 16'h1ffb; 10'h1f9: oHanning = 16'h1ffc; 10'h1fa: oHanning = 16'h1ffd; 10'h1fb: oHanning = 16'h1ffe; 10'h1fc: oHanning = 16'h1fff; 10'h1fd: oHanning = 16'h1fff; 10'h1fe: oHanning = 16'h1fff; 10'h1ff: oHanning = 16'h1fff; 10'h200: oHanning = 16'h1fff; 10'h201: oHanning = 16'h1fff; 10'h202: oHanning = 16'h1fff; 10'h203: oHanning = 16'h1fff; 10'h204: oHanning = 16'h1ffe;
10'h205: oHanning = 16'h1ffd; 10'h206: oHanning = 16'h1ffc; 10'h207: oHanning = 16'h1ffb; 10'h208: oHanning = 16'h1ffa; 10'h209: oHanning = 16'h1ff9; 10'h20a: oHanning = 16'h1ff7; 10'h20b: oHanning = 16'h1ff5; 10'h20c: oHanning = 16'h1ff3; 10'h20d: oHanning = 16'h1ff1; 10'h20e: oHanning = 16'h1fef; 10'h20f: oHanning = 16'h1fed; 10'h210: oHanning = 16'h1feb; 10'h211: oHanning = 16'h1fe8; 10'h212: oHanning = 16'h1fe5; 10'h213: oHanning = 16'h1fe2; 10'h214: oHanning = 16'h1fdf; 10'h215: oHanning = 16'h1fdc; 10'h216: oHanning = 16'h1fd9; 10'h217: oHanning = 16'h1fd5; 10'h218: oHanning = 16'h1fd1; 10'h219: oHanning = 16'h1fce; 10'h21a: oHanning = 16'h1fca; 10'h21b: oHanning = 16'h1fc5; 10'h21c: oHanning = 16'h1fc1; 10'h21d: oHanning = 16'h1fbd; 10'h21e: oHanning = 16'h1fb8; 10'h21f: oHanning = 16'h1fb3; 10'h220: oHanning = 16'h1fae; 10'h221: oHanning = 16'h1fa9; 10'h222: oHanning = 16'h1fa4; 10'h223: oHanning = 16'h1f9f; 10'h224: oHanning = 16'h1f99; 10'h225: oHanning = 16'h1f94; 10'h226: oHanning = 16'h1f8e; 10'h227: oHanning = 16'h1f88; 10'h228: oHanning = 16'h1f82; 10'h229: oHanning = 16'h1f7c; 10'h22a: oHanning = 16'h1f75; 10'h22b: oHanning = 16'h1f6f; 10'h22c: oHanning = 16'h1f68; 10'h22d: oHanning = 16'h1f61; 10'h22e: oHanning = 16'h1f5a; 10'h22f: oHanning = 16'h1f53; 10'h230: oHanning = 16'h1f4c; 10'h231: oHanning = 16'h1f44; 10'h232: oHanning = 16'h1f3d; 10'h233: oHanning = 16'h1f35; 10'h234: oHanning = 16'h1f2d; 10'h235: oHanning = 16'h1f25; 10'h236: oHanning = 16'h1f1d; 10'h237: oHanning = 16'h1f15; 10'h238: oHanning = 16'h1f0c; 10'h239: oHanning = 16'h1f04; 10'h23a: oHanning = 16'h1efb; 10'h23b: oHanning = 16'h1ef2; 10'h23c: oHanning = 16'h1ee9; 10'h23d: oHanning = 16'h1ee0;
10'h23e: oHanning = 16'h1ed7; 10'h23f: oHanning = 16'h1ecd; 10'h240: oHanning = 16'h1ec3; 10'h241: oHanning = 16'h1eba; 10'h242: oHanning = 16'h1eb0; 10'h243: oHanning = 16'h1ea6; 10'h244: oHanning = 16'h1e9c; 10'h245: oHanning = 16'h1e91; 10'h246: oHanning = 16'h1e87; 10'h247: oHanning = 16'h1e7c; 10'h248: oHanning = 16'h1e72; 10'h249: oHanning = 16'h1e67; 10'h24a: oHanning = 16'h1e5c; 10'h24b: oHanning = 16'h1e51; 10'h24c: oHanning = 16'h1e45; 10'h24d: oHanning = 16'h1e3a; 10'h24e: oHanning = 16'h1e2e; 10'h24f: oHanning = 16'h1e23; 10'h250: oHanning = 16'h1e17; 10'h251: oHanning = 16'h1e0b; 10'h252: oHanning = 16'h1dff; 10'h253: oHanning = 16'h1df3; 10'h254: oHanning = 16'h1de6; 10'h255: oHanning = 16'h1dda; 10'h256: oHanning = 16'h1dcd; 10'h257: oHanning = 16'h1dc0; 10'h258: oHanning = 16'h1db3; 10'h259: oHanning = 16'h1da6; 10'h25a: oHanning = 16'h1d99; 10'h25b: oHanning = 16'h1d8c; 10'h25c: oHanning = 16'h1d7e; 10'h25d: oHanning = 16'h1d71; 10'h25e: oHanning = 16'h1d63; 10'h25f: oHanning = 16'h1d55; 10'h260: oHanning = 16'h1d48; 10'h261: oHanning = 16'h1d39; 10'h262: oHanning = 16'h1d2b; 10'h263: oHanning = 16'h1d1d; 10'h264: oHanning = 16'h1d0f; 10'h265: oHanning = 16'h1d00; 10'h266: oHanning = 16'h1cf1; 10'h267: oHanning = 16'h1ce2; 10'h268: oHanning = 16'h1cd3; 10'h269: oHanning = 16'h1cc4; 10'h26a: oHanning = 16'h1cb5; 10'h26b: oHanning = 16'h1ca6; 10'h26c: oHanning = 16'h1c96; 10'h26d: oHanning = 16'h1c87; 10'h26e: oHanning = 16'h1c77; 10'h26f: oHanning = 16'h1c67; 10'h270: oHanning = 16'h1c58; 10'h271: oHanning = 16'h1c47; 10'h272: oHanning = 16'h1c37; 10'h273: oHanning = 16'h1c27; 10'h274: oHanning = 16'h1c17; 10'h275: oHanning = 16'h1c06; 10'h276: oHanning = 16'h1bf6;
10'h277: oHanning = 16'h1be5; 10'h278: oHanning = 16'h1bd4; 10'h279: oHanning = 16'h1bc3; 10'h27a: oHanning = 16'h1bb2; 10'h27b: oHanning = 16'h1ba1; 10'h27c: oHanning = 16'h1b8f; 10'h27d: oHanning = 16'h1b7e; 10'h27e: oHanning = 16'h1b6d; 10'h27f: oHanning = 16'h1b5b; 10'h280: oHanning = 16'h1b49; 10'h281: oHanning = 16'h1b37; 10'h282: oHanning = 16'h1b25; 10'h283: oHanning = 16'h1b13; 10'h284: oHanning = 16'h1b01; 10'h285: oHanning = 16'h1aef; 10'h286: oHanning = 16'h1adc; 10'h287: oHanning = 16'h1aca; 10'h288: oHanning = 16'h1ab7; 10'h289: oHanning = 16'h1aa5; 10'h28a: oHanning = 16'h1a92; 10'h28b: oHanning = 16'h1a7f; 10'h28c: oHanning = 16'h1a6c; 10'h28d: oHanning = 16'h1a59; 10'h28e: oHanning = 16'h1a46; 10'h28f: oHanning = 16'h1a32; 10'h290: oHanning = 16'h1a1f; 10'h291: oHanning = 16'h1a0c; 10'h292: oHanning = 16'h19f8; 10'h293: oHanning = 16'h19e4; 10'h294: oHanning = 16'h19d0; 10'h295: oHanning = 16'h19bd; 10'h296: oHanning = 16'h19a9; 10'h297: oHanning = 16'h1995; 10'h298: oHanning = 16'h1980; 10'h299: oHanning = 16'h196c; 10'h29a: oHanning = 16'h1958; 10'h29b: oHanning = 16'h1943; 10'h29c: oHanning = 16'h192f; 10'h29d: oHanning = 16'h191a; 10'h29e: oHanning = 16'h1906; 10'h29f: oHanning = 16'h18f1; 10'h2a0: oHanning = 16'h18dc; 10'h2a1: oHanning = 16'h18c7; 10'h2a2: oHanning = 16'h18b2; 10'h2a3: oHanning = 16'h189d; 10'h2a4: oHanning = 16'h1888; 10'h2a5: oHanning = 16'h1872; 10'h2a6: oHanning = 16'h185d; 10'h2a7: oHanning = 16'h1848; 10'h2a8: oHanning = 16'h1832; 10'h2a9: oHanning = 16'h181c; 10'h2aa: oHanning = 16'h1807; 10'h2ab: oHanning = 16'h17f1; 10'h2ac: oHanning = 16'h17db; 10'h2ad: oHanning = 16'h17c5; 10'h2ae: oHanning = 16'h17af; 10'h2af: oHanning = 16'h1799;
10'h2b0: oHanning = 16'h1783; 10'h2b1: oHanning = 16'h176d; 10'h2b2: oHanning = 16'h1757; 10'h2b3: oHanning = 16'h1740; 10'h2b4: oHanning = 16'h172a; 10'h2b5: oHanning = 16'h1713; 10'h2b6: oHanning = 16'h16fd; 10'h2b7: oHanning = 16'h16e6; 10'h2b8: oHanning = 16'h16cf; 10'h2b9: oHanning = 16'h16b9; 10'h2ba: oHanning = 16'h16a2; 10'h2bb: oHanning = 16'h168b; 10'h2bc: oHanning = 16'h1674; 10'h2bd: oHanning = 16'h165d; 10'h2be: oHanning = 16'h1646; 10'h2bf: oHanning = 16'h162f; 10'h2c0: oHanning = 16'h1618; 10'h2c1: oHanning = 16'h1600; 10'h2c2: oHanning = 16'h15e9; 10'h2c3: oHanning = 16'h15d2; 10'h2c4: oHanning = 16'h15ba; 10'h2c5: oHanning = 16'h15a3; 10'h2c6: oHanning = 16'h158b; 10'h2c7: oHanning = 16'h1574; 10'h2c8: oHanning = 16'h155c; 10'h2c9: oHanning = 16'h1545; 10'h2ca: oHanning = 16'h152d; 10'h2cb: oHanning = 16'h1515; 10'h2cc: oHanning = 16'h14fd; 10'h2cd: oHanning = 16'h14e5; 10'h2ce: oHanning = 16'h14cd; 10'h2cf: oHanning = 16'h14b5; 10'h2d0: oHanning = 16'h149d; 10'h2d1: oHanning = 16'h1485; 10'h2d2: oHanning = 16'h146d; 10'h2d3: oHanning = 16'h1455; 10'h2d4: oHanning = 16'h143d; 10'h2d5: oHanning = 16'h1425; 10'h2d6: oHanning = 16'h140c; 10'h2d7: oHanning = 16'h13f4; 10'h2d8: oHanning = 16'h13dc; 10'h2d9: oHanning = 16'h13c3; 10'h2da: oHanning = 16'h13ab; 10'h2db: oHanning = 16'h1392; 10'h2dc: oHanning = 16'h137a; 10'h2dd: oHanning = 16'h1361; 10'h2de: oHanning = 16'h1349; 10'h2df: oHanning = 16'h1330; 10'h2e0: oHanning = 16'h1318; 10'h2e1: oHanning = 16'h12ff; 10'h2e2: oHanning = 16'h12e6; 10'h2e3: oHanning = 16'h12ce; 10'h2e4: oHanning = 16'h12b5; 10'h2e5: oHanning = 16'h129c; 10'h2e6: oHanning = 16'h1283; 10'h2e7: oHanning = 16'h126b; 10'h2e8: oHanning = 16'h1252;
10'h2e9: oHanning = 16'h1239; 10'h2ea: oHanning = 16'h1220; 10'h2eb: oHanning = 16'h1207; 10'h2ec: oHanning = 16'h11ee; 10'h2ed: oHanning = 16'h11d5; 10'h2ee: oHanning = 16'h11bc; 10'h2ef: oHanning = 16'h11a3; 10'h2f0: oHanning = 16'h118a; 10'h2f1: oHanning = 16'h1171; 10'h2f2: oHanning = 16'h1158; 10'h2f3: oHanning = 16'h113f; 10'h2f4: oHanning = 16'h1126; 10'h2f5: oHanning = 16'h110d; 10'h2f6: oHanning = 16'h10f4; 10'h2f7: oHanning = 16'h10db; 10'h2f8: oHanning = 16'h10c2; 10'h2f9: oHanning = 16'h10a9; 10'h2fa: oHanning = 16'h1090; 10'h2fb: oHanning = 16'h1077; 10'h2fc: oHanning = 16'h105e; 10'h2fd: oHanning = 16'h1045; 10'h2fe: oHanning = 16'h102b; 10'h2ff: oHanning = 16'h1012; 10'h300: oHanning = 16'hff9; 10'h301: oHanning = 16'hfe0; 10'h302: oHanning = 16'hfc7; 10'h303: oHanning = 16'hfae; 10'h304: oHanning = 16'hf95; 10'h305: oHanning = 16'hf7c; 10'h306: oHanning = 16'hf63; 10'h307: oHanning = 16'hf4a; 10'h308: oHanning = 16'hf30; 10'h309: oHanning = 16'hf17; 10'h30a: oHanning = 16'hefe; 10'h30b: oHanning = 16'hee5; 10'h30c: oHanning = 16'hecc; 10'h30d: oHanning = 16'heb3; 10'h30e: oHanning = 16'he9a; 10'h30f: oHanning = 16'he81; 10'h310: oHanning = 16'he68; 10'h311: oHanning = 16'he4f; 10'h312: oHanning = 16'he36; 10'h313: oHanning = 16'he1d; 10'h314: oHanning = 16'he04; 10'h315: oHanning = 16'hdeb; 10'h316: oHanning = 16'hdd3; 10'h317: oHanning = 16'hdba; 10'h318: oHanning = 16'hda1; 10'h319: oHanning = 16'hd88; 10'h31a: oHanning = 16'hd6f; 10'h31b: oHanning = 16'hd56; 10'h31c: oHanning = 16'hd3e; 10'h31d: oHanning = 16'hd25; 10'h31e: oHanning = 16'hd0c; 10'h31f: oHanning = 16'hcf4; 10'h320: oHanning = 16'hcdb; 10'h321: oHanning = 16'hcc2;
10'h322: oHanning = 16'hcaa; 10'h323: oHanning = 16'hc91; 10'h324: oHanning = 16'hc79; 10'h325: oHanning = 16'hc60; 10'h326: oHanning = 16'hc48; 10'h327: oHanning = 16'hc2f; 10'h328: oHanning = 16'hc17; 10'h329: oHanning = 16'hbff; 10'h32a: oHanning = 16'hbe6; 10'h32b: oHanning = 16'hbce; 10'h32c: oHanning = 16'hbb6; 10'h32d: oHanning = 16'hb9e; 10'h32e: oHanning = 16'hb86; 10'h32f: oHanning = 16'hb6e; 10'h330: oHanning = 16'hb56; 10'h331: oHanning = 16'hb3e; 10'h332: oHanning = 16'hb26; 10'h333: oHanning = 16'hb0e; 10'h334: oHanning = 16'haf6; 10'h335: oHanning = 16'hade; 10'h336: oHanning = 16'hac6; 10'h337: oHanning = 16'haaf; 10'h338: oHanning = 16'ha97; 10'h339: oHanning = 16'ha7f; 10'h33a: oHanning = 16'ha68; 10'h33b: oHanning = 16'ha50; 10'h33c: oHanning = 16'ha39; 10'h33d: oHanning = 16'ha21; 10'h33e: oHanning = 16'ha0a; 10'h33f: oHanning = 16'h9f3; 10'h340: oHanning = 16'h9dc; 10'h341: oHanning = 16'h9c5; 10'h342: oHanning = 16'h9ad; 10'h343: oHanning = 16'h996; 10'h344: oHanning = 16'h97f; 10'h345: oHanning = 16'h969; 10'h346: oHanning = 16'h952; 10'h347: oHanning = 16'h93b; 10'h348: oHanning = 16'h924; 10'h349: oHanning = 16'h90e; 10'h34a: oHanning = 16'h8f7; 10'h34b: oHanning = 16'h8e0; 10'h34c: oHanning = 16'h8ca; 10'h34d: oHanning = 16'h8b4; 10'h34e: oHanning = 16'h89d; 10'h34f: oHanning = 16'h887; 10'h350: oHanning = 16'h871; 10'h351: oHanning = 16'h85b; 10'h352: oHanning = 16'h845; 10'h353: oHanning = 16'h82f; 10'h354: oHanning = 16'h819; 10'h355: oHanning = 16'h803; 10'h356: oHanning = 16'h7ed; 10'h357: oHanning = 16'h7d8; 10'h358: oHanning = 16'h7c2; 10'h359: oHanning = 16'h7ad; 10'h35a: oHanning = 16'h797;
10'h35b: oHanning = 16'h782; 10'h35c: oHanning = 16'h76d; 10'h35d: oHanning = 16'h758; 10'h35e: oHanning = 16'h743; 10'h35f: oHanning = 16'h72e; 10'h360: oHanning = 16'h719; 10'h361: oHanning = 16'h704; 10'h362: oHanning = 16'h6ef; 10'h363: oHanning = 16'h6da; 10'h364: oHanning = 16'h6c6; 10'h365: oHanning = 16'h6b1; 10'h366: oHanning = 16'h69d; 10'h367: oHanning = 16'h689; 10'h368: oHanning = 16'h675; 10'h369: oHanning = 16'h660; 10'h36a: oHanning = 16'h64c; 10'h36b: oHanning = 16'h638; 10'h36c: oHanning = 16'h625; 10'h36d: oHanning = 16'h611; 10'h36e: oHanning = 16'h5fd; 10'h36f: oHanning = 16'h5ea; 10'h370: oHanning = 16'h5d6; 10'h371: oHanning = 16'h5c3; 10'h372: oHanning = 16'h5b0; 10'h373: oHanning = 16'h59d; 10'h374: oHanning = 16'h58a; 10'h375: oHanning = 16'h577; 10'h376: oHanning = 16'h564; 10'h377: oHanning = 16'h551; 10'h378: oHanning = 16'h53e; 10'h379: oHanning = 16'h52c; 10'h37a: oHanning = 16'h519; 10'h37b: oHanning = 16'h507; 10'h37c: oHanning = 16'h4f5; 10'h37d: oHanning = 16'h4e3; 10'h37e: oHanning = 16'h4d1; 10'h37f: oHanning = 16'h4bf; 10'h380: oHanning = 16'h4ad; 10'h381: oHanning = 16'h49b; 10'h382: oHanning = 16'h48a; 10'h383: oHanning = 16'h478; 10'h384: oHanning = 16'h467; 10'h385: oHanning = 16'h456; 10'h386: oHanning = 16'h445; 10'h387: oHanning = 16'h433; 10'h388: oHanning = 16'h423; 10'h389: oHanning = 16'h412; 10'h38a: oHanning = 16'h401; 10'h38b: oHanning = 16'h3f1; 10'h38c: oHanning = 16'h3e0; 10'h38d: oHanning = 16'h3d0; 10'h38e: oHanning = 16'h3c0; 10'h38f: oHanning = 16'h3af; 10'h390: oHanning = 16'h3a0; 10'h391: oHanning = 16'h390; 10'h392: oHanning = 16'h380; 10'h393: oHanning = 16'h370;
10'h394: oHanning = 16'h361; 10'h395: oHanning = 16'h351; 10'h396: oHanning = 16'h342; 10'h397: oHanning = 16'h333; 10'h398: oHanning = 16'h324; 10'h399: oHanning = 16'h315; 10'h39a: oHanning = 16'h306; 10'h39b: oHanning = 16'h2f8; 10'h39c: oHanning = 16'h2e9; 10'h39d: oHanning = 16'h2db; 10'h39e: oHanning = 16'h2cd; 10'h39f: oHanning = 16'h2be; 10'h3a0: oHanning = 16'h2b0; 10'h3a1: oHanning = 16'h2a3; 10'h3a2: oHanning = 16'h295; 10'h3a3: oHanning = 16'h287; 10'h3a4: oHanning = 16'h27a; 10'h3a5: oHanning = 16'h26c; 10'h3a6: oHanning = 16'h25f; 10'h3a7: oHanning = 16'h252; 10'h3a8: oHanning = 16'h245; 10'h3a9: oHanning = 16'h238; 10'h3aa: oHanning = 16'h22c; 10'h3ab: oHanning = 16'h21f; 10'h3ac: oHanning = 16'h213; 10'h3ad: oHanning = 16'h206; 10'h3ae: oHanning = 16'h1fa; 10'h3af: oHanning = 16'h1ee; 10'h3b0: oHanning = 16'h1e2; 10'h3b1: oHanning = 16'h1d6; 10'h3b2: oHanning = 16'h1cb; 10'h3b3: oHanning = 16'h1bf; 10'h3b4: oHanning = 16'h1b4; 10'h3b5: oHanning = 16'h1a9; 10'h3b6: oHanning = 16'h19e; 10'h3b7: oHanning = 16'h193; 10'h3b8: oHanning = 16'h188; 10'h3b9: oHanning = 16'h17d; 10'h3ba: oHanning = 16'h173; 10'h3bb: oHanning = 16'h168; 10'h3bc: oHanning = 16'h15e; 10'h3bd: oHanning = 16'h154; 10'h3be: oHanning = 16'h14a; 10'h3bf: oHanning = 16'h140; 10'h3c0: oHanning = 16'h137; 10'h3c1: oHanning = 16'h12d; 10'h3c2: oHanning = 16'h124; 10'h3c3: oHanning = 16'h11b; 10'h3c4: oHanning = 16'h111; 10'h3c5: oHanning = 16'h108; 10'h3c6: oHanning = 16'h100; 10'h3c7: oHanning = 16'h0f7; 10'h3c8: oHanning = 16'h0ee; 10'h3c9: oHanning = 16'h0e6; 10'h3ca: oHanning = 16'h0de; 10'h3cb: oHanning = 16'h0d6; 10'h3cc: oHanning = 16'h0ce;
10'h3cd: oHanning = 16'h0c6; 10'h3ce: oHanning = 16'h0be; 10'h3cf: oHanning = 16'h0b7; 10'h3d0: oHanning = 16'h0b0; 10'h3d1: oHanning = 16'h0a8; 10'h3d2: oHanning = 16'h0a1; 10'h3d3: oHanning = 16'h09a; 10'h3d4: oHanning = 16'h094; 10'h3d5: oHanning = 16'h08d; 10'h3d6: oHanning = 16'h087; 10'h3d7: oHanning = 16'h080; 10'h3d8: oHanning = 16'h07a; 10'h3d9: oHanning = 16'h074; 10'h3da: oHanning = 16'h06e; 10'h3db: oHanning = 16'h068; 10'h3dc: oHanning = 16'h063; 10'h3dd: oHanning = 16'h05d; 10'h3de: oHanning = 16'h058; 10'h3df: oHanning = 16'h053; 10'h3e0: oHanning = 16'h04e; 10'h3e1: oHanning = 16'h049; 10'h3e2: oHanning = 16'h045; 10'h3e3: oHanning = 16'h040; 10'h3e4: oHanning = 16'h03c; 10'h3e5: oHanning = 16'h037; 10'h3e6: oHanning = 16'h033; 10'h3e7: oHanning = 16'h030; 10'h3e8: oHanning = 16'h02c; 10'h3e9: oHanning = 16'h028; 10'h3ea: oHanning = 16'h025; 10'h3eb: oHanning = 16'h021; 10'h3ec: oHanning = 16'h01e; 10'h3ed: oHanning = 16'h01b; 10'h3ee: oHanning = 16'h018; 10'h3ef: oHanning = 16'h016; 10'h3f0: oHanning = 16'h013; 10'h3f1: oHanning = 16'h011; 10'h3f2: oHanning = 16'h00f; 10'h3f3: oHanning = 16'h00c; 10'h3f4: oHanning = 16'h00b; 10'h3f5: oHanning = 16'h009; 10'h3f6: oHanning = 16'h007; 10'h3f7: oHanning = 16'h006; 10'h3f8: oHanning = 16'h004; 10'h3f9: oHanning = 16'h003; 10'h3fa: oHanning = 16'h002; 10'h3fb: oHanning = 16'h001; 10'h3fc: oHanning = 16'h001; 10'h3fd: oHanning = 16'h000; 10'h3fe: oHanning = 16'h000; 10'h3ff: oHanning = 16'h000; endcaseend
endmodule
module I2C_AV_Config ( // Host Side input iCLK, input iRST_N, // I2C Side output I2C_SCLK, inout I2C_SDAT);
// Internal Registers/Wiresreg [15:0] mI2C_CLK_DIV;reg [23:0] mI2C_DATA;reg mI2C_CTRL_CLK;reg mI2C_GO;wire mI2C_END;wire mI2C_ACK;reg [15:0] LUT_DATA;reg [5:0] LUT_INDEX;reg [3:0] mSetup_ST;
// Clock Settingparameter CLK_Freq = 50000000; // 50 MHzparameter I2C_Freq = 20000; // 20 KHz// LUT Data Numberparameter LUT_SIZE = 13;// Audio Data Indexparameter Dummy_DATA = 0;parameter SET_LIN_L = 1;parameter SET_LIN_R = 2;parameter SET_HEAD_L = 3;parameter SET_HEAD_R = 4;parameter A_PATH_CTRL = 5;parameter D_PATH_CTRL = 6;parameter POWER_ON = 7;parameter SET_FORMAT = 8;parameter SAMPLE_CTRL = 9;parameter SET_ACTIVE = 10;// Video Data Indexparameter SET_VIDEO = 11;
///////////////////// I2C Control Clock ////////////////////////always@ (posedge iCLK or negedge iRST_N)begin if (!iRST_N) begin mI2C_CTRL_CLK <= 0; mI2C_CLK_DIV <= 0; end else begin if (mI2C_CLK_DIV < (CLK_Freq/I2C_Freq))
mI2C_CLK_DIV <= mI2C_CLK_DIV + 16'd1; else begin mI2C_CLK_DIV <= 0; mI2C_CTRL_CLK <= ~mI2C_CTRL_CLK; end
endend
I2C_Controller u0 ( .CLOCK(mI2C_CTRL_CLK), // Controller Work Clock .I2C_SCLK(I2C_SCLK), // I2C CLOCK .I2C_SDAT(I2C_SDAT), // I2C DATA .I2C_DATA(mI2C_DATA), // DATA:[SLAVE_ADDR,SUB_ADDR,DATA] .GO(mI2C_GO), // GO transfor .END(mI2C_END), // END transfor .ACK(mI2C_ACK), // ACK .RESET(iRST_N)); ////////////////////// Config Control ////////////////////////////always@ (posedge mI2C_CTRL_CLK or negedge iRST_N)begin if(!iRST_N) begin LUT_INDEX <= 0; mSetup_ST <= 0; mI2C_GO <= 0; end else begin if(LUT_INDEX<LUT_SIZE) begin case (mSetup_ST) 0: begin if(LUT_INDEX<SET_VIDEO)
mI2C_DATA <= {8'h34,LUT_DATA}; else mI2C_DATA <= {8'h40,LUT_DATA}; mI2C_GO <= 1; mSetup_ST <= 1; end 1: begin if(mI2C_END) begin if(!mI2C_ACK)
mSetup_ST <= 2; else mSetup_ST <= 0; mI2C_GO <= 0; end end 2: begin LUT_INDEX <= LUT_INDEX + 6'd1; mSetup_ST <= 0; end endcase end endend
///////////////////// Config Data LUT //////////////////////////// Experimentation shows that high gain on input (1f) and unity gain
// on output (79) yields overall unity gain (I don't know why)alwaysbegin case (LUT_INDEX) // Audio Config Data Dummy_DATA : LUT_DATA <= 16'h0000; SET_LIN_L : LUT_DATA <= 16'h001f; // Lline in - high gain SET_LIN_R : LUT_DATA <= 16'h021f; // Rline in - high gain SET_HEAD_L : LUT_DATA <= 16'h0479; // Lphone out - unity gain SET_HEAD_R : LUT_DATA <= 16'h0679; // Rphone out - unity gain A_PATH_CTRL : LUT_DATA <= 16'h0814; // Line->ADC, DAC on, no bypass or sidetone D_PATH_CTRL : LUT_DATA <= 16'h0A02; // deemph to 32kHz POWER_ON : LUT_DATA <= 16'h0C00; // all on SET_FORMAT : LUT_DATA <= 16'h0E01; // MSB first left-justified, slave mode SAMPLE_CTRL : LUT_DATA <= 16'h101A; // normal-mode, 384fs oversamp 16'h1002 (32KHz) SET_ACTIVE : LUT_DATA <= 16'h1201; // activate default: LUT_DATA <= 16'hxxxx; endcaseend
endmodule
--------------------------------------------------------------------// Copyright (c) 2005 by Terasic Technologies Inc. // --------------------------------------------------------------------//// Permission://// Terasic grants permission to use and modify this code for use// in synthesis for all Terasic Development Boards and Altrea Development // Kits made by Terasic. Other use of this code, including the selling // ,duplication, or modification of any portion is strictly prohibited.//// Disclaimer://// This VHDL or Verilog source code is intended as a design reference// which illustrates how these types of functions can be implemented.// It is the user's responsibility to verify their design for// consistency and functionality through the use of formal// verification methods. Terasic provides no warranty regarding the use // or functionality of this code.//// --------------------------------------------------------------------// // Terasic Technologies Inc// 356 Fu-Shin E. Rd Sec. 1. JhuBei City,// HsinChu County, Taiwan// 302//// web: http://www.terasic.com/// email: [email protected]//
// --------------------------------------------------------------------//// Major Functions:i2c controller//// --------------------------------------------------------------------//// Revision History :// --------------------------------------------------------------------// Ver :| Author :| Mod. Date :| Changes Made:// V1.0 :| Joe Yang :| 05/07/10 :| Initial Revision// --------------------------------------------------------------------module I2C_Controller (
CLOCK,I2C_SCLK,//I2C CLOCK
I2C_SDAT,//I2C DATAI2C_DATA,//DATA:[SLAVE_ADDR,SUB_ADDR,DATA]GO, //GO transforEND, //END transfor W_R, //W_RACK, //ACKRESET,//TESTSD_COUNTER,SDO
);input CLOCK;input [23:0]I2C_DATA;input GO;input RESET;input W_R;
inout I2C_SDAT;output I2C_SCLK;output END;output ACK;
//TESToutput [5:0] SD_COUNTER;output SDO;
reg SDO;reg SCLK;reg END;reg [23:0]SD;reg [5:0]SD_COUNTER;
wire I2C_SCLK=SCLK | ( ((SD_COUNTER >= 6'd4) & (SD_COUNTER <=6'd30))? ~CLOCK :1'b0 );wire I2C_SDAT=SDO?1'bz:1'b0 ;
reg ACK1,ACK2,ACK3;wire ACK=ACK1 | ACK2 |ACK3;
//--I2C COUNTERalways @(negedge RESET or posedge CLOCK ) beginif (!RESET) SD_COUNTER=6'b111111;else begin
if (GO==0) SD_COUNTER=0;else if (SD_COUNTER < 6'b111111) SD_COUNTER=SD_COUNTER+6'b1;
endend//----
always @(negedge RESET or posedge CLOCK ) beginif (!RESET) begin SCLK=1;SDO=1; ACK1=0;ACK2=0;ACK3=0; END=1; endelsecase (SD_COUNTER)
6'd0 : begin ACK1=0 ;ACK2=0 ;ACK3=0 ; END=0; SDO=1; SCLK=1;end//start6'd1 : begin SD=I2C_DATA;SDO=0;end6'd2 : SCLK=0;//SLAVE ADDR6'd3 : SDO=SD[23];6'd4 : SDO=SD[22];6'd5 : SDO=SD[21];6'd6 : SDO=SD[20];6'd7 : SDO=SD[19];6'd8 : SDO=SD[18];6'd9 : SDO=SD[17];6'd10 : SDO=SD[16];6'd11 : SDO=1'b1;//ACK
//SUB ADDR6'd12 : begin SDO=SD[15]; ACK1=I2C_SDAT; end6'd13 : SDO=SD[14];6'd14 : SDO=SD[13];6'd15 : SDO=SD[12];6'd16 : SDO=SD[11];6'd17 : SDO=SD[10];6'd18 : SDO=SD[9];6'd19 : SDO=SD[8];6'd20 : SDO=1'b1;//ACK
//DATA6'd21 : begin SDO=SD[7]; ACK2=I2C_SDAT; end6'd22 : SDO=SD[6];6'd23 : SDO=SD[5];6'd24 : SDO=SD[4];6'd25 : SDO=SD[3];6'd26 : SDO=SD[2];6'd27 : SDO=SD[1];6'd28 : SDO=SD[0];6'd29 : SDO=1'b1;//ACK
//stop 6'd30 : begin SDO=1'b0; SCLK=1'b0; ACK3=I2C_SDAT; end 6'd31 : SCLK=1'b1; 6'd32 : begin SDO=1'b1; END=1; end
endcaseend
endmodule
module Reset_Delay(iCLK,oRESET);input iCLK;output reg oRESET;reg [19:0] Cont;
always@(posedge iCLK)begin
if(Cont!=20'hFFFFF)begin
Cont <= Cont+20'h00001;oRESET <= 1'b0;
endelseoRESET <= 1'b1;
end
endmodule