建立一个C的范围为0~255,内容是(C)2/4的查表

占用256个存储空间,但可以计算出+-127的两个数之积。传统算法需要至少127×127个存储空间。

查找表模块的建立:

module lut_module
(
input CLK,
input RSTn, input [:]Addr,
output [:]Q
); /*****************************/ reg [:]rQ; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
rQ <= 'd0;
else
case( Addr ) , : rQ <= 'd0;
: rQ <= 'd1;
: rQ <= 'd2;
: rQ <= 'd4;
: rQ <= 'd6;
: rQ <= 'd9;
: rQ <= 'd12;
: rQ <= 'd16;
: rQ <= 'd20;
: rQ <= 'd25;
: rQ <= 'd30;
: rQ <= 'd36;
: rQ <= 'd42;
: rQ <= 'd49;
: rQ <= 'd56;
: rQ <= 'd64;
: rQ <= 'd72;
: rQ <= 'd81;
: rQ <= 'd90;
: rQ <= 'd100;
: rQ <= 'd110;
: rQ <= 'd121;
: rQ <= 'd132;
: rQ <= 'd144;
: rQ <= 'd156;
: rQ <= 'd169;
: rQ <= 'd182;
: rQ <= 'd196;
: rQ <= 'd210;
: rQ <= 'd225;
: rQ <= 'd240;
: rQ <= 'd256;
: rQ <= 'd272;
: rQ <= 'd289;
: rQ <= 'd306;
: rQ <= 'd324;
: rQ <= 'd342;
: rQ <= 'd361;
: rQ <= 'd380;
: rQ <= 'd400;
: rQ <= 'd420;
: rQ <= 'd441;
: rQ <= 'd462;
: rQ <= 'd484;
: rQ <= 'd506;
: rQ <= 'd529;
: rQ <= 'd552;
: rQ <= 'd576;
: rQ <= 'd600;
: rQ <= 'd625;
: rQ <= 'd650;
: rQ <= 'd676;
: rQ <= 'd702;
: rQ <= 'd729;
: rQ <= 'd756;
: rQ <= 'd784;
: rQ <= 'd812;
: rQ <= 'd841;
: rQ <= 'd870;
: rQ <= 'd900;
: rQ <= 'd930;
: rQ <= 'd961;
: rQ <= 'd992;
: rQ <= 'd1024;
: rQ <= 'd1056;
: rQ <= 'd1089;
: rQ <= 'd1122;
: rQ <= 'd1156;
: rQ <= 'd1190;
: rQ <= 'd1225;
: rQ <= 'd1260;
: rQ <= 'd1296;
: rQ <= 'd1332;
: rQ <= 'd1369;
: rQ <= 'd1406;
: rQ <= 'd1444;
: rQ <= 'd1482;
: rQ <= 'd1521;
: rQ <= 'd1560;
: rQ <= 'd1600;
: rQ <= 'd1640;
: rQ <= 'd1681;
: rQ <= 'd1722;
: rQ <= 'd1764;
: rQ <= 'd1806;
: rQ <= 'd1849;
: rQ <= 'd1892;
: rQ <= 'd1936;
: rQ <= 'd1980;
: rQ <= 'd2025;
: rQ <= 'd2070;
: rQ <= 'd2116;
: rQ <= 'd2162;
: rQ <= 'd2209;
: rQ <= 'd2256;
: rQ <= 'd2304;
: rQ <= 'd2352;
: rQ <= 'd2401;
: rQ <= 'd2450;
: rQ <= 'd2500;
: rQ <= 'd2550;
: rQ <= 'd2601;
: rQ <= 'd2652;
: rQ <= 'd2704;
: rQ <= 'd2756;
: rQ <= 'd2809;
: rQ <= 'd2862;
: rQ <= 'd2916;
: rQ <= 'd2970;
: rQ <= 'd3025;
: rQ <= 'd3080;
: rQ <= 'd3136;
: rQ <= 'd3192;
: rQ <= 'd3249;
: rQ <= 'd3306;
: rQ <= 'd3364;
: rQ <= 'd3422;
: rQ <= 'd3481;
: rQ <= 'd3540;
: rQ <= 'd3600;
: rQ <= 'd3660;
: rQ <= 'd3721;
: rQ <= 'd3782;
: rQ <= 'd3844;
: rQ <= 'd3906;
: rQ <= 'd3969;
: rQ <= 'd4032;
: rQ <= 'd4096;
: rQ <= 'd4160;
: rQ <= 'd4225;
: rQ <= 'd4290;
: rQ <= 'd4356;
: rQ <= 'd4422;
: rQ <= 'd4489;
: rQ <= 'd4556;
: rQ <= 'd4624;
: rQ <= 'd4692;
: rQ <= 'd4761;
: rQ <= 'd4830;
: rQ <= 'd4900;
: rQ <= 'd4970;
: rQ <= 'd5041;
: rQ <= 'd5112;
: rQ <= 'd5184;
: rQ <= 'd5256;
: rQ <= 'd5329;
: rQ <= 'd5402;
: rQ <= 'd5476;
: rQ <= 'd5550;
: rQ <= 'd5625;
: rQ <= 'd5700;
: rQ <= 'd5776;
: rQ <= 'd5852;
: rQ <= 'd5929;
: rQ <= 'd6006;
: rQ <= 'd6084;
: rQ <= 'd6162;
: rQ <= 'd6241;
: rQ <= 'd6320;
: rQ <= 'd6400;
: rQ <= 'd6480;
: rQ <= 'd6561;
: rQ <= 'd6642;
: rQ <= 'd6724;
: rQ <= 'd6806;
: rQ <= 'd6889;
: rQ <= 'd6972;
: rQ <= 'd7056;
: rQ <= 'd7140;
: rQ <= 'd7225;
: rQ <= 'd7310;
: rQ <= 'd7396;
: rQ <= 'd7482;
: rQ <= 'd7569;
: rQ <= 'd7656;
: rQ <= 'd7744;
: rQ <= 'd7832;
: rQ <= 'd7921;
: rQ <= 'd8010;
: rQ <= 'd8100;
: rQ <= 'd8190;
: rQ <= 'd8281;
: rQ <= 'd8372;
: rQ <= 'd8464;
: rQ <= 'd8556;
: rQ <= 'd8649;
: rQ <= 'd8742;
: rQ <= 'd8836;
: rQ <= 'd8930;
: rQ <= 'd9025;
: rQ <= 'd9120;
: rQ <= 'd9216;
: rQ <= 'd9312;
: rQ <= 'd9409;
: rQ <= 'd9506;
: rQ <= 'd9604;
: rQ <= 'd9702;
: rQ <= 'd9801;
: rQ <= 'd9900;
: rQ <= 'd10000;
: rQ <= 'd10100;
: rQ <= 'd10201;
: rQ <= 'd10302;
: rQ <= 'd10404;
: rQ <= 'd10506;
: rQ <= 'd10609;
: rQ <= 'd10712;
: rQ <= 'd10816;
: rQ <= 'd10920;
: rQ <= 'd11025;
: rQ <= 'd11130;
: rQ <= 'd11236;
: rQ <= 'd11342;
: rQ <= 'd11449;
: rQ <= 'd11556;
: rQ <= 'd11664;
: rQ <= 'd11772;
: rQ <= 'd11881;
: rQ <= 'd11990;
: rQ <= 'd12100;
: rQ <= 'd12210;
: rQ <= 'd12321;
: rQ <= 'd12432;
: rQ <= 'd12544;
: rQ <= 'd12656;
: rQ <= 'd12769;
: rQ <= 'd12882;
: rQ <= 'd12996;
: rQ <= 'd13100;
: rQ <= 'd13225;
: rQ <= 'd13340;
: rQ <= 'd13456;
: rQ <= 'd13572;
: rQ <= 'd13689;
: rQ <= 'd13806;
: rQ <= 'd13924;
: rQ <= 'd14042;
: rQ <= 'd14161;
: rQ <= 'd14280;
: rQ <= 'd14400;
: rQ <= 'd14520;
: rQ <= 'd14641;
: rQ <= 'd14762;
: rQ <= 'd14884;
: rQ <= 'd15006;
: rQ <= 'd15129;
: rQ <= 'd15252;
: rQ <= 'd15376;
: rQ <= 'd15500;
: rQ <= 'd15625;
: rQ <= 'd15750;
: rQ <= 'd15876;
: rQ <= 'd16002;
: rQ <= 'd16129;
: rQ <= 'd16256; endcase /*****************************/ assign Q = rQ; /*****************************/ endmodule

根据ab=( a + b ) 2 /4  - ( a - b ) 2 /4,取I1=a+b,I2=a-b,然后I1,I2取正数,调用rom模块求出(C)2/4; 然后相减(加补码)

module lut_multiplier_module
(
input CLK,
input RSTn, input Start_Sig,
input [:]A,
input [:]B, output Done_Sig,
output [:]Product, /***************************/ output [:]SQ_I1_Sig,
output [:]SQ_I2_Sig,
output [:]SQ_Q1_Sig,
output [:]SQ_Q2_Sig /***************************/ ); /***************************/ wire [:]Q1_Sig;
wire [:]Q2_Sig; /***************************/ reg [:]i;
reg [:]I1;
reg [:]I2;
reg [:]Data;
reg isDone; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
i <= 'd0;
I1 <= 'd0;
I2 <= 'd0;
Data <= 'd0;
isDone <= 'b0;
end
else if( Start_Sig )
case( i ) :
begin
I1 <= { A[], A } + { B[], B };
I2 <= { A[], A } + { ~B[], ( ~B + 'b1 ) };
i <= i + 'b1;
end :
begin
I1 <= I1[] ? ( ~I1 + 'b1 ) : I1;
I2 <= I2[] ? ( ~I2 + 'b1 ) : I2;
i <= i + 'b1;
end :
begin i <= i + 'b1; end :
begin Data <= Q1_Sig + ( ~Q2_Sig + 'b1 ); i <= i + 1'b1; end :
begin isDone <= 'b1; i <= i + 1'b1; end :
begin isDone <= 'b0; i <= 4'd0; end endcase /***************************/ lut_module U1
(
.CLK ( CLK ),
.RSTn( RSTn ),
.Addr ( I1[:] ),
.Q ( Q1_Sig )
); /***************************/ lut_module U2
(
.CLK ( CLK ),
.RSTn( RSTn ),
.Addr ( I2[:] ),
.Q ( Q2_Sig )
); /***************************/ assign Done_Sig = isDone;
assign Product = Data; /***************************/ assign SQ_I1_Sig = I1;
assign SQ_I2_Sig = I2;
assign SQ_Q1_Sig = Q1_Sig;
assign SQ_Q2_Sig = Q2_Sig; /***************************/ endmodule

还可通过quartus直接建立rom宏模块,.mif文件由file-new-other files-Memory Initialization File建立,填入上述地址、数据。

测试激励文本lut_multiplier_module.vt

`timescale  ps/  ps
module lut_multiplier_module_simulation(); reg CLK;
reg RSTn; reg Start_Sig;
reg [:]A;
reg [:]B; wire Done_Sig;
wire [:]Product; /*************************/ wire [:]SQ_I1_Sig;
wire [:]SQ_I2_Sig;
wire [:]SQ_Q1_Sig;
wire [:]SQ_Q2_Sig; /*************************/ lut_multiplier_module U1
(
.CLK(CLK),
.RSTn(RSTn),
.Start_Sig(Start_Sig),
.A(A),
.B(B),
.Done_Sig(Done_Sig),
.Product(Product),
.SQ_I1_Sig(SQ_I1_Sig),
.SQ_I2_Sig(SQ_I2_Sig),
.SQ_Q1_Sig(SQ_Q1_Sig),
.SQ_Q2_Sig(SQ_Q2_Sig)
); /******************************/ initial
begin
RSTn = ; #; RSTn = ;
CLK = ; forever # CLK = ~CLK;
end /******************************/ reg [:]i; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
i <= 'd0;
Start_Sig <= 'b0;
A <= 'd0;
B <= 'd0;
end
else
case( i ) : // A = -127 , B = 127
if( Done_Sig ) begin Start_Sig <= 'b0; i <= i + 1'b1; end
else begin A <= 'b10000001; B <= 8'd127; Start_Sig <= 'b1; end : // A = 2 , B = - 4
if( Done_Sig ) begin Start_Sig <= 'b0; i <= i + 1'b1; end
else begin A <= 'd2; B <= 8'b11111100; Start_Sig <= 'b1; end : // A = 10 , B = 100
if( Done_Sig ) begin Start_Sig <= 'b0; i <= i + 1'b1; end
else begin A <= 'd10; B <= 8'd100; Start_Sig <= 'b1; end : // A = -127 , B = -127
if( Done_Sig ) begin Start_Sig <= 'b0; i <= i + 1'b1; end
else begin A <= 'b10000001; B <= 8'b10000001; Start_Sig <= 'b1; end :
i <= 'd4; endcase endmodule

Quarter square 查找表乘法器,手动建立rom的更多相关文章

  1. 利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨

    1.使用matlab制作.coe文件 查找表的构造 构造256点的正余弦表 exp(-j*2*pi*(0:255)/256),分别得到 cos和sin的查找表 matlab代码: 求sin fid = ...

  2. 修改6S Fortran77 代码,建立查找表

      逐像元大气校正,常预先计算查找表(LUT,LookUp Tabel),6S大气辐射传输模式也可以用来计算LUT.但6S源程序输出信息多,且浮点数输出精度低,不利于提取关键信息生成LUT,本文描述了 ...

  3. OpenCV学习笔记:如何扫描图像、利用查找表和计时

    目的 我们将探索以下问题的答案: 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 这里我们测试的,是一种简单的 ...

  4. OpenCV从入门到放弃系列之——如何扫描图像、利用查找表和计时

    目的 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 颜色空间缩减.具体做法就是:将现有颜色空间值除以某个输入 ...

  5. C语言数据结构基础学习笔记——静态查找表

    查找:在数据集合中寻找满足某种条件的数据元素的过程称为查找. 查找表:用于查找的数据集合称为查找表,一般有以下操作:①查找是否在表中:②查找属性:③进行操作. 查找表又分为: ①静态查找表:只可以进行 ...

  6. 【C/C++】查找(一):静态查找表

    {静态查找表 + 动态查找表} 所谓动态,就是,找的时候没有则添加,或者能删除 关键字:primary key:用来表示查找表中的一条记录 {主关键字 + 次关键字} 主关键字是唯一的,用来唯一的标识 ...

  7. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  8. JAVASE02-Unit05: 集合操作 —— 查找表

    Unit05: 集合操作 -- 查找表 使用该类测试自定义元素的集合排序 package day05; /** * 使用该类测试自定义元素的集合排序 * @author adminitartor * ...

  9. Lua查找表元素过程(元表、__index方法是如何工作的)

    近日开始研究Lua,在元表的使用上照猫画虎地搞了两下,实现了“面向对象”,但究其本质却略有不解,后咨询牛哥得解,特此记录. Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Val ...

随机推荐

  1. HTTP服务&Ajax编程知识点导图

  2. TortoiseGit 图标不显示

    1. 确认注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdent ...

  3. Centos 6.5 下php5.6.2 的编译安装

    纯净的Centos 6.5系统 配置163yum源 (稍后会写一篇文档) 安装  开发软件包:yum  -y groupinstall  "Development Tools" 安 ...

  4. 对象化前端表单(Form)提交

    很常见的业务场景,就是前端一个表单,submit给后台,在web.form时代,有from 的runat="server" 配合submit 自动会提交给服务端,然后服务端解析Re ...

  5. 关于rank、dense_rank、ROW_NUMBER及OVER(PARTITION BY)、OVER(ORDER BY)的一些用法

    CREATE TABLE t_harry ( id int NOT NULL, ) DEFAULT NULL, ChannelID ) DEFAULT NULL, TimeStamp datetime ...

  6. Windows 下针对python脚本做一个简单的进程保护

    前提: 大家运行的脚本程序经常会碰到系统异常关闭.或被其他用户错杀的情况.这样就需要一个进程保护的工具. 本文结合windows 的计划任务,实现一个简单的进程保护的功能. 利用py2exe生产 ex ...

  7. c++ c# java 调用 c++ 写的dll

    1. vs 中新建win32 dll 项目   testdll 添加实现文件       test.cpp #include "stdafx.h" #include <ios ...

  8. Servlet学习五——流的分发

    在上一节中有提到,流的传输,可以考虑Stream,但如果需要同时分发流和其它信息,,就需要再考虑其它方式了. 在coding中,服务端查询结果都是以gson进行传输,当需要传输一个语音并且同时需要传输 ...

  9. const的位置与区别

    转自  http://www.cnblogs.com/wucx/p/4566176.html 一个比较经典的问题——问以下两种声明的区别:1)  const char * p2)  char * co ...

  10. LinQ高级查询

    1.模糊查询 con.Users.Where(a =>a.UserName.Contains(name)).ToList(); //包含name con.Users.Where(a =>a ...