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\u30021\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
实际上是实现固定乘数的乘法器,是把乘法器 按一定精度展开就可以了 比如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 与运算 ...