Falu32

Verilog

基本語法

型態

全域變數

基本元件

多樣的寫法

指定

assign

always

initial

運算式

分枝

迴圈

模組

函數

Task

陣列

輸出入

觀察

真值表

測試程式

訊息顯示

注意事項

模擬程序

硬體工程

程式範例

Xor

Xor3

全加器

加法器

加減器

快速加法器

乘法器

ALU

閂鎖器

脈衝偵測

計數器

多工器

暫存器群

記憶體

延遲問題

浮點數

狀態機

程式計數器

CPU0-Mini

CPU0

pipeline

工具

QuartusII

Icarus

Veritek

訊息

相關網站

參考文獻

最新修改

簡體版

English

Verilog 程式:falu32.v

module main;
reg [1:0] op;
real a, b;
reg [31:0] a32, b32, y32;
reg [63:0] a64, b64, y64, a64t, b64t;
real y;

task f32to64(input [31:0] x32, output [63:0] x64); 
reg [10:0] e;
begin
  e = {3'b0, x32[30:23]};
  e = e + (1023 - 127);
  x64 = {x32[31], e, x32[22:0], 29'b0};
end endtask

task f64to32(input [63:0] x64, output [31:0] x32); 
reg [10:0] e;
begin
  e = {x64[62:52]};
  e = e + (127-1023);
  x32 = {x64[63], e[7:0], x64[51-:23]};
end endtask

task falu32(input [31:0] a32, input [31:0] b32, output [31:0] y32);
reg [63:0] a64, b64, y64;
real a, b, y;
begin
  f32to64(a32, a64); a = $bitstoreal(a64);
  f32to64(b32, b64); b = $bitstoreal(b64); 
  case (op)
    2'b00: y = a + b;
    2'b01: y = a - b;
    2'b10: y = a * b;
    2'b11: y = a / b;
  endcase
//  $display("y=%f", y);
  y64 = $realtobits(y);
  f64to32(y64, y32);
end
endtask

 initial begin
  a = 3.14;
  b = 10*10;
  a64 = $realtobits(a);
  b64 = $realtobits(b);
  f64to32(a64, a32);
  f64to32(b64, b32);
  op = 2'b00;
  $display("%dns: a=%f b=%f a64=%b b64=%b", $stime, a, b, a64, b64);
  $display("%dns: bitstoreal(a64)=%f bitstoreal(b64)=%f", $stime, $bitstoreal(a64), $bitstoreal(b64));
  $display("%dns: op=%b a32=%b b32=%b", $stime, op, a32, b32);
  f32to64(a32, a64t);
  f32to64(b32, b64t);
  $display("%dns: a64t=%f b64t=%f", $stime, $bitstoreal(a64t), $bitstoreal(b64t));
 end

 always #50 begin
   op = op + 1;
   falu32(a32, b32, y32);
   f32to64(y32, y64);
   $display("%dns: op=%b a=%f b=%f y=%f", $stime, op, a, b, $bitstoreal(y64));
end

initial #1000 $finish;

endmodule

執行結果

D:\oc\float>iverilog falu32.v -o falu32

D:\oc\float>vvp falu32
         0ns: a=3.140000 b=100.000000 a64=01000000000010010001111010111000010100
01111010111000010100011111 b64=0100000001011001000000000000000000000000000000000
000000000000000
         0ns: bitstoreal(a64)=3.140000 bitstoreal(b64)=100.000000
         0ns: op=00 a32=01000000010010001111010111000010 b32=0100001011001000000
0000000000000
         0ns: a64t=3.140000 b64t=100.000000
        50ns: op=01 a=3.140000 b=100.000000 y=-96.859993
       100ns: op=10 a=3.140000 b=100.000000 y=313.999969
       150ns: op=11 a=3.140000 b=100.000000 y=0.031400
       200ns: op=00 a=3.140000 b=100.000000 y=103.139999
       250ns: op=01 a=3.140000 b=100.000000 y=-96.859993
       300ns: op=10 a=3.140000 b=100.000000 y=313.999969
       350ns: op=11 a=3.140000 b=100.000000 y=0.031400
       400ns: op=00 a=3.140000 b=100.000000 y=103.139999
       450ns: op=01 a=3.140000 b=100.000000 y=-96.859993
       500ns: op=10 a=3.140000 b=100.000000 y=313.999969
       550ns: op=11 a=3.140000 b=100.000000 y=0.031400
       600ns: op=00 a=3.140000 b=100.000000 y=103.139999
       650ns: op=01 a=3.140000 b=100.000000 y=-96.859993
       700ns: op=10 a=3.140000 b=100.000000 y=313.999969
       750ns: op=11 a=3.140000 b=100.000000 y=0.031400
       800ns: op=00 a=3.140000 b=100.000000 y=103.139999
       850ns: op=01 a=3.140000 b=100.000000 y=-96.859993
       900ns: op=10 a=3.140000 b=100.000000 y=313.999969
       950ns: op=11 a=3.140000 b=100.000000 y=0.031400

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License