verilog 中r如何把一个二进制数扩大1.3倍,代码如何写啊? 急用!帮帮忙!!! 用verilog HDL实现对f(x) = x4 + x +...

\u5982\u4f55\u7528verilog\u6bd4\u8f83\u4e00\u4e2a\u672a\u77e532\u4f4d\u4e8c\u8fdb\u5236\u6570\u4e2d\u201c1\u201d\u201c0\u201d\u7684\u4e2a\u6570\u3002

1\u3001\u4f7f\u7528matlab\u751f\u62101024\u70b9\u7684\u6b63\u5f26\u6ce2\u6570\u636e\u7684\u65b9\u6cd5\u4ee3\u7801\u3002

2\u3001\u4f7f\u7528adder.v\u6587\u4ef6\u76f8\u4f4d\u7d2f\u52a0\u6a21\u5757\u7684\u65b9\u6cd5\u4ee3\u7801\u3002

3\u3001\u5b9e\u73b0dds_top.v\u9876\u5c42\u8bbe\u8ba1\u7684\u65b9\u6cd5\u4ee3\u7801\u3002

4\u3001\u5b9e\u73b0\u4eff\u771f\u6d4b\u8bd5\u6587\u4ef6\u7684\u65b9\u6cd5\u4ee3\u7801\u3002

5\u3001\u4f7f\u7528matlab\u751f\u6210\u6570\u636e\u6548\u679c\u5982\u4e0b\u3002

6\u3001\u6700\u540e\u4f7f\u7528vivado\u548cModelsim\u8054\u5408\u4eff\u771f\u6548\u679c\u5c31\u5b8c\u6210\u4e86\u3002

\u5c31\u662f\u4e00\u4e2a\u9664\u6cd5\u5668\u554a\uff0c\u7ed9\u4f60\u4e00\u4e2a\u81ea\u5df1\u5199\u7684\uff0c25bit\u9664\u4ee510bit\u7684\uff0c\u6b63\u6574\u6570\u9664\u4ee5\u6b63\u6574\u6570\uff0c\u53ea\u6c42\u4e86\u5546\u6ca1\u6c42\u4f59\u6570\uff0c\u6539\u6539\u5c31\u884c\u4e86

`timescale 1ns/10ps

module Mtrk_obs_divid(
clk_main,
reset,

start,
dividend,// the dividend and divisor are postive
divisor,

divid_end,
quotient
);
input clk_main;
input reset;

input start;
input [24:0] dividend;
input [9:0] divisor;

output [15:0] quotient;
reg [15:0] quotient;

output divid_end;
reg divid_end;
// end of input and output
// ============================================
reg [4:0] divid_cnt;
reg [25:0] abs_dividend;
wire quotient_bit;
reg quotient_over;

always@(posedge clk_main)
begin
if(reset)
quotient_over <= 1'b0;
else if(start)
quotient_over = {divisor,1'b0};
end

always@(posedge clk_main)
begin
if(reset)
divid_cnt <= 5'd16;
else if(start)
divid_cnt <= 5'd0;
else if(divid_cnt<5'd16)
divid_cnt <= divid_cnt + 5'd1;
end

always@(posedge clk_main)
begin
if(reset)
abs_dividend <= 26'd0;
else if(start)
abs_dividend <= {1'b0,dividend};
else if(divid_cnt<5'd16)
abs_dividend <= quotient_bit?{(abs_dividend[25:15]-{1'd0,divisor[9:0]}),abs_dividend[14:0],1'b0}:{abs_dividend,1'b0};
end

assign quotient_bit = abs_dividend[25:15]>={1'b0,divisor};

always@(posedge clk_main)
begin
if(reset|start)
divid_end <= 1'b0;
else
divid_end <= (divid_cnt==6'd15);
end

always@(posedge clk_main)
begin
if(start)
quotient <= 16'd0;
else if(divid_cnt<20'd16)
quotient <= (quotient_over)?16'd65535:{quotient[14:0],quotient_bit};
end
endmodule

晕死,你先扩大1024*1.3=1331倍,然后左移十位就行了。有精度损失

实际上是实现固定乘数的乘法器,是把乘法器 按一定精度展开就可以了 比如1.0101

din * 1.3
= din * ( 1.3 * (2^10) ) / (2^10)
= din * 1331 / (2^10)

所以,由上面这个表达式,可以知道,要把一个二进制数扩大1.3倍,可以把这个数乘以1331,然后将结果右移10位即可。

一个数乘以(2^10),就是把这个数左移10位;
一个数除以(2^10),就是把这个数右移10位。

要注意的是,上面的“10”是可以自己酌情选择的,选得越大,精确度越高,但是硬件的门数也越多。

扩展阅读:verilog 延时 ... verilog 教程 ... 数据分配器 verilog ... verilog 对某一位赋值 ... verilog ii64位仿真 ... verilog 四选一 ... verilog 逻辑符号 ... verilog循环左移 ... verilog 与运算 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网