Quarter square 查找表乘法器,手动建立rom

建立一个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的更多相关文章
- 利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨
1.使用matlab制作.coe文件 查找表的构造 构造256点的正余弦表 exp(-j*2*pi*(0:255)/256),分别得到 cos和sin的查找表 matlab代码: 求sin fid = ...
- 修改6S Fortran77 代码,建立查找表
逐像元大气校正,常预先计算查找表(LUT,LookUp Tabel),6S大气辐射传输模式也可以用来计算LUT.但6S源程序输出信息多,且浮点数输出精度低,不利于提取关键信息生成LUT,本文描述了 ...
- OpenCV学习笔记:如何扫描图像、利用查找表和计时
目的 我们将探索以下问题的答案: 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 这里我们测试的,是一种简单的 ...
- OpenCV从入门到放弃系列之——如何扫描图像、利用查找表和计时
目的 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 颜色空间缩减.具体做法就是:将现有颜色空间值除以某个输入 ...
- C语言数据结构基础学习笔记——静态查找表
查找:在数据集合中寻找满足某种条件的数据元素的过程称为查找. 查找表:用于查找的数据集合称为查找表,一般有以下操作:①查找是否在表中:②查找属性:③进行操作. 查找表又分为: ①静态查找表:只可以进行 ...
- 【C/C++】查找(一):静态查找表
{静态查找表 + 动态查找表} 所谓动态,就是,找的时候没有则添加,或者能删除 关键字:primary key:用来表示查找表中的一条记录 {主关键字 + 次关键字} 主关键字是唯一的,用来唯一的标识 ...
- 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找
今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...
- JAVASE02-Unit05: 集合操作 —— 查找表
Unit05: 集合操作 -- 查找表 使用该类测试自定义元素的集合排序 package day05; /** * 使用该类测试自定义元素的集合排序 * @author adminitartor * ...
- Lua查找表元素过程(元表、__index方法是如何工作的)
近日开始研究Lua,在元表的使用上照猫画虎地搞了两下,实现了“面向对象”,但究其本质却略有不解,后咨询牛哥得解,特此记录. Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Val ...
随机推荐
- LinQ的查询操作
LinQ的高级查询:-------------------在car表格进行练习操作: 一.模糊查询:1.在后台代码:(Contains)List<car>list=con.car.wher ...
- mysql日志开启和查看
mysql日志开启和查看. 找到mysql根目录下的my.ini文件,打开在下面插入 log-bin=mysql-bin binlog_format=mixed 然后重启mysql. 在dos端登录m ...
- xml---sax操作
<?xml version="1.0" encoding="UTF-8"?> <书架> <书> <书名>书名1& ...
- Des加解密算法
class DesHelper { /// <summary> /// DES加密方法 /// </summary> ...
- 超高性能的json序列化之MVC中使用Json.Net
先不废话,直接上代码 Asp.net MVC自带Json序列化 /// <summary> /// 加载组件列表 /// </summary> /// <param na ...
- Redis从基础命令到实战之列表类型(List)
经过上一篇基于Redis散列类型的改造后,实战练习中的商品管理已经具备了增加.修改整体.修改部分属性和分页查询功能,但仍然不支持删除商品的功能.这是因为商品总数是以一个自增数字记录的,且关联了新商品k ...
- jQuery实现鼠标拖动改变Div高度
最近项目中需要在DashBoard页面做一个事件通知栏,该通知栏固定位于页面底部,鼠标拖动该DIV实现自动改变高度扩展内容显示区域. 以下是一个设计原型,基于jQuery实现,只实现了拖动效果,没有做 ...
- 开源GIS软件初探
谈到GIS软件,首先让我们想到的便是GIS界的龙头大哥ESRI公司旗下的ArcGIS产品,从最初接触的version 9.2到如今的version 10.1,其发展可谓风生水起.MapInfo软件也不 ...
- 数据库imp导表dmp的方法
1>sqlplus / as sysdba 进入sqlplus 2>drop user USER cascade 3>create user USER IDENTIFIED BY P ...
- OAF 中的EO 和VO
EO :oracle.apps.fnd.framework.server.OAEntityImpl VO:oracle.apps.fnd.framework.server.OAViewRowImpl ...