硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2987|回复: 1
收起左侧

Verilog设计练习进阶(6)------- 在Verilog HDL 中使用函数

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2013-1-30 13:49:34 | 显示全部楼层 |阅读模式
此程序有错误 ,所以就不做功能仿真了,只把程序和仿真模块贴出来
module verilog_prj(clk,n,result,reset);  
  output[31:0] result;
  input[3:0]  n;
  input reset,clk;
  reg[31:0] result;
  always @(posedge clk)    //clk的上沿触发同步运算。
    begin
      if(!reset)            //reset为低时复位。
         result<=0;
        else
           begin
              result <= n * factorial(n)/((n*2)+1);
           end
     end
  function [31:0] factorial;      //函数定义。
    input  [3:0]  operand;
    reg    [3:0]  index;
    begin
      factorial = operand ? 1 : 0;
      for(index = 2; index <= operand; index = index + 1)
        factorial = index * factorial;
    end
  endfunction
endmodule
测试模块
`include "./step6.v"
`timescale 1ns/100ps
`define clk_cycle 50

module tryfuctTop;

reg[3:0] n,i;
reg reset,clk;

wire[31:0] result;

initial
  begin
    n=0;
    reset=1;
    clk=0;
    #100 reset=0;
    #100 reset=1;
    for(i=0;i<=15;i=i+1)
      begin
        #200 n=i;
      end
    #100 $stop;
  end
always #`clk_cycle clk=~clk;  
tryfunct tryfunct(.clk(clk),.n(n),.result(result),.reset(reset) );
endmodule
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
 楼主| 发表于 2013-1-30 14:17:50 | 显示全部楼层
特别注意
        上例中函数factorial(n)实际上就是阶乘运算。必须提醒大家注意的是,在实际的设计
中,我们不希望设计中的运算过于复杂,以免在综合后带来不可预测的后果。经常的情况是,
我们把复杂的运算分成几个步骤,分别在不同的时钟周期完成。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 03:37 , Processed in 0.149757 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表