之前说过,使用IP核要先百度,然后看文档,然后再百度最后使用。本篇文章以cord IC核的sin、cos来进行实验(全网最详教程)。
1、定点数、浮点数、反码、补码
首先要明确这几个词的概念。废话不多说,直接上例子:采用32位的有符号定点数表示方法,第一位表示符号位(0是正数,1是负数),因此还剩31个位置来表示数据,具体整数部分与小数部分是几位,看自己设定。我们下面假设整数部分2位(因为-pi~pi=-3.14~3.14,2位可以表示3),29位表示小数。
Exp1:
①1.5=1+0.5=>0(符号位)_01(整数位)_0.5*2^29(小数位)=0(符号位)_01(整数位)_1,0000,0000,0000,0000,0000,0000,0000(小数位)=00110000000000000000000000000000=30000000'h('h表示16进制)
②负数是正数的补码,即反码+1:补码=反码(二进制取反即可)+1
由于1.5=0_01_10000000000000000000000000000,所以其反码为1_10_0,1111,1111,1111,1111,1111,1111,1111,所以其补码为1_10_1,0000,0000,0000,0000,0000,0000,0000,所以
-1.5=11010000000000000000000000000000=D0000000'h
Exp2:
120°=120/180*pi=2.094395102393195=2+(0.094395102393195*2^29)=0_10_int(50677984.71016798224384)=0_10_50677985=0_10_0,0011,0000,0101,0100,1000,1110,0001=01000011000001010100100011100001=430548E1'h
-120°=-120/180*pi=-2.094395102393195=1_01_1,1100,1111,1010,1011,0111,0001,1110=10111100111110101011011100011110=BCFAB71E'h
2、了解了编码规则后就开始使用cordic IP核
实验任务:使用IP核cordic的sin/cos功能
实验软硬件:ZCU106、Vivado2019.1
实验过程:
step1:建立test_pl_cordic项目,建立top源文件,并添加Clocking Wizard
与cordic IP核(如果这一步不会请参考前面的文章)


step2:cordic IP核的配置


step3:赋值代码,并仿真(因为testbench里设置了时延,因此下面的第三图里面的按钮必须点一下才能看到仿真结果)
`timescale 1ns / 1ps
//
// Company: 东北电力大学
// Engineer: Yang Zheng
//
// Create Date: 2021/12/31 14:33:38
// Design Name:
// Module Name: top
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module top(
input clk_p,
input clk_n,
input rst,
output [63:0] data_a,
output [63:0] data_b,
output [63:0] data_c
);
reg [31:0] c_E_PH [2:0];//A相
reg compute_sign = 1'b0;
clk_wiz_0 uut_clk_wiz_0(
.clk_out1(clk),
// Status and control signals
.reset(~rst),//高电平复位
.locked(locked),
// Clock in ports
.clk_in1_p(clk_p),
.clk_in1_n(clk_n)
);
always @(posedge clk or negedge rst) begin
if (!rst) begin
//复位
end
else begin
c_E_PH[0] <= 32'h00000000; //A相
c_E_PH[1] <= 32'hBCFAB71E; //B相
c_E_PH[2] <= 32'h430548E1; //C相
compute_sign <= 1'b1;
end
end
reg s_axis_phase_tvalid_a = 1'b0;
reg [31:0] s_axis_phase_tdata_a = 32'b0;
reg s_axis_phase_tvalid_b = 1'b0;
reg [31:0] s_axis_phase_tdata_b = 32'b0;
reg s_axis_phase_tvalid_c = 1'b0;
reg [31:0] s_axis_phase_tdata_c = 32'b0;
wire [63:0] m_axis_dout_tdata_a;
wire [63:0] m_axis_dout_tdata_b;
wire [63:0] m_axis_dout_tdata_c;
cordic_0 uut_cordic_sin_cos_a(
.aclk(clk),
.s_axis_phase_tvalid(s_axis_phase_tvalid_a),
.s_axis_phase_tdata(s_axis_phase_tdata_a),
.m_axis_dout_tvalid(m_axis_dout_tvalid_a),
.m_axis_dout_tdata(m_axis_dout_tdata_a)
);
cordic_0 uut_cordic_sin_cos_b(
.aclk(clk),
.s_axis_phase_tvalid(s_axis_phase_tvalid_b),
.s_axis_phase_tdata(s_axis_phase_tdata_b),
.m_axis_dout_tvalid(m_axis_dout_tvalid_b),
.m_axis_dout_tdata(m_axis_dout_tdata_b)
);
cordic_0 uut_cordic_sin_cos_c(
.aclk(clk),
.s_axis_phase_tvalid(s_axis_phase_tvalid_c),
.s_axis_phase_tdata(s_axis_phase_tdata_c),
.m_axis_dout_tvalid(m_axis_dout_tvalid_c),
.m_axis_dout_tdata(m_axis_dout_tdata_c)
);
assign data_a = m_axis_dout_tdata_a;
assign data_b = m_axis_dout_tdata_b;
assign data_c = m_axis_dout_tdata_c;
always @(posedge clk or negedge rst) begin
if (!rst)begin
//复位
s_axis_phase_tvalid_a <= 1'b0;
s_axis_phase_tvalid_b <= 1'b0;
s_axis_phase_tvalid_c <= 1'b0;
end
else if(compute_sign == 1'b1) begin
//可以开始计算
s_axis_phase_tvalid_a <= 1'b1;
s_axis_phase_tdata_a <= c_E_PH[0];
s_axis_phase_tvalid_b <= 1'b1;
s_axis_phase_tdata_b <= c_E_PH[1];
s_axis_phase_tvalid_c <= 1'b1;
s_axis_phase_tdata_c <= c_E_PH[2];
compute_sign <= 1'b0;
end
else if(m_axis_dout_tvalid_a == 1'b1
&& m_axis_dout_tvalid_b == 1'b1 && m_axis_dout_tvalid_c == 1'b1) begin
s_axis_phase_tvalid_a <= 1'b0;
s_axis_phase_tvalid_b <= 1'b0;
s_axis_phase_tvalid_c <= 1'b0;
end
end
endmodule
`timescale 1ns / 1ps
//
// Company: 东北电力大学
// Engineer: Yang Zheng
//
// Create Date: 2021/12/31 14:49:12
// Design Name:
// Module Name: testbench
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module testbench(
);
reg clk;
reg rst;
wire [63:0] data_a;
wire [63:0] data_b;
wire [63:0] data_c;
always #4 clk=~clk;
initial begin
clk = 1'b0;
rst = 1'b0;
#10;
rst = 1'b1;
end
top uut_top(
.clk_p(clk),
.clk_n(~clk),
.rst(rst),
.data_a(data_a),
.data_b(data_b),
.data_c(data_c)
);
endmodule

step4:结果分析

注意:输出是64位的,前32位是sin后32位是cos
我们把B相与C相的前32位拿来进行验证:
B相:c8930a30=11001000100100110000101000110000=1(符号位)_1(整数位)_00,1000,1001,0011,0000,1010,0011,0000(小数位)=-(1-1).((2^30-001000100100110000101000110000)/2^30)=-0.((2^30-143854128)/2^30)=-0.866
C相:376CF5D0=110111011011001111010111010000=0(符号位)_0(整数位)_11,0111,0110,1100,1111,0101,1101,0000(小数位)=0.(110111011011001111010111010000/2^30)=0.866
----------------------------2023-1-10更新---------------------------------------------------------------------------------
附上所有结果的转换截图,不要再说我代码不对/计算步骤不对了,我文章3000+的阅读量,不可能出错的!!!评论不要误人子弟!!!
1、32位浮点数转fix32_29
reg [31:0] input_data = 32'h3FC00000;//1.5
reg [31:0] input_data = 32'hBFC00000;//-1.5

2、32位浮点数转fix32_30
reg [31:0] input_data = 32'h3F5DB22D;//0.866
reg [31:0] input_data = 32'hBF5DB22D;//-0.866


验证完毕!!!
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po