Verilog HDL高级程序设计举例 .ppt
16h0004:pressed=key_2;
16h0008:pressed=key_3;
16h0010:pressed=key_4;
16h0020:pressed=key_5;
16h0040:pressed=key_6;
16h0080:pressed=key_7;
16h0100:pressed=key_8;
16h0200:pressed=key_9;
16h0400:pressed=key_A;
16h0800:pressed=key_B;
16h1000:pressed=key_C;
16h2000:pressed=key_D;
16h4000:pressed=key_E;
16h8000:pressed=key_F;
default:pressed=None;
endcase
end
initial#2000$stop;
initialbeginclock=0;
forever#5clock=~clock;
end
initialbeginreset=1;
#10reset=0;end
initialbeginfor(k=0;k=1;k=k+1)
beginkey=0;
#20for(j=0;j=16;j=j+1)
begin
#20key[j]=1;
#60key=0;
end
endend
endmodule
测试结果如图6.2-21所示。图6.2-21十六进制键盘电路的键盘扫描和编码器的测试结果6.2.8log函数的VerilogHDL设计
ASIC和FPGA的一个重要功能是实现计算函数加速器,随着通信、自动控制和多媒体信号处理计算量的增大,采用VerilogHDL设计计算函数加速器越来越重要。6.2.8节和6.2.9节将分别对两种典型的计算函数加速器进行设计。通过这些例子,可了解一些初步的设计方法。
log函数是一种典型的单目计算函数,与其相应的还有指数函数、三角函数等。对于单目计算函数的硬件加速器的设计,一般有两种简单的方法:一种是查找表的方式;一种是使用泰勒级数展开成多项式进行近似计算。这两种方式在设计方法和精确度方面有很大的不同。查找表方式是通过存储器进行设计,设计方法简单,其精度需要通过提高存储器的深度来实现,在集成电路中占用面积大,因此这种方式通常在精度要求不高的近似计算中使用。泰勒级数展开方式采用乘法器和加法器来实现,可以通过增加展开级数来提高计算的精确度。
例6.2-11用VerilogHDL设计采用查找表方式的log函数,输入信号位宽为4bit,输出信号位宽为8bit。单目计算函数的特点是,只有一个输入信号和一个输出信号,在结构上与存储器工作原理相似。实现函数操作,是将函数中的计算结果存入存储器中,将输入信号(操作数)作为地址访问存储器,那么存储器输出的结果就是函数的运算结果。由于从存储器中读取数据要比复杂计算的速度快得多,所以通常采用查找表结构,这可以在很大程度上提高运算速度。查找表的方法一般适用于位数比较低的情况,如果位数较高则会占用大量的内存。表6.2-2是输入4bit、输出8bit信号的log函数计算表。表6.2-2log函数计算表其中,输入数据为1位整数位与3位小数位,精确到2-3;输出结果为2位整数位和6位小数位,精确到2-6。其VerilogHDL程序代码如下:
modulelog_lookup(x,clk,out);
input[3:0]x;
inputclk;
output[7:0]out;
reg[7:0]out;
alway