打印

verilog 参数无法传递

[复制链接]
2141|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qiantuo12345|  楼主 | 2012-9-11 21:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qiantuo12345 于 2012-9-13 16:55 编辑

控制ADF4360 的 代码
顶层TransOut 的 参数 DataIn1, DataIn2,DataIn3
没办法赋值,就是没办法由外部模块传入,模块内部赋值
就没问题。

以上结论经示波器检查过。

不知道为啥,请各位大神帮忙看看代码。

芯片是CPLD,Altera EPM240t100C5N
外部晶振50MHz

//3-Set the N Counter Latch
//Send Data
//DATA Hold afier one SCLK pose-edge
//SCLK Max is 20Mhz
module TransOut( input  wire [`DATA_L : 0] DataIn1,
                 input  wire [`DATA_L : 0] DataIn2,
                 input  wire [`DATA_L : 0] DataIn3,
                 input  wire [1 : 0]       DataSel,
                 output reg  SCLK,
                 output reg  LE,
                 output reg  DA_OUT);
  integer n,m = `DATA_L;
  
  reg [`DATA_L : 0] Data;
  reg  [1 : 0] a = 2'b11;
  
  [email=always@(DataIn1]always@(DataIn1[/email] or DataIn2 or DataIn3)
  begin
    //Preform the Data
    //$display("in0 = %x\n",in0);
    if(DataSel == 2'b01)
      Data = 24'hff;
    else if(DataSel == 2'b10)
      Data = DataIn2;
    else if(DataSel == 2'b11)
      Data = DataIn3;
    else
      Data = 0;
    //SCLK Pin Output,LE Pin Output
    SCLK = `Lo;
    LE = `Hi;
    //Delay 5 units,LE set down
    #5 LE = `Lo;
   
    //Start the transform Clock
    for(n = 0;n < `DATA_L;n = n + 1)
    begin
      SCLK = #`SCLK_F `Hi;
      SCLK = #`SCLK_F `Lo;
    end
   
    #1 LE = `Hi;  
  end

  //DATA Pin Output
  always @(posedge SCLK)
  begin
    //Start Data TransForm,MSB First
    if(m > 0)
      begin
        DA_OUT = Data[m];
        m = m - 1;
      end
    else
      begin
        m = `DATA_L;
      end     
  end
  
endmodule

//Test Top Module
module Top;
  reg [`DATA_L : 0] d = 24'b111011101001;
  reg [1:0] sel = 2'b11;
  wire [`DATA_L : 0] r,ctrl;
  wire sclk,out,le;
  
  Create_R R(r);
//  TransOut T(r,sclk,le,out);
  
  SetADF S(ctrl);
  TransOut T(.DataIn1(r),
             .DataIn2(ctrl),
             .DataIn3(d[`DATA_L : 0]),
             .DataSel(sel[1:0]),
             .SCLK(sclk),
             .LE(le),
             .DA_OUT(out));
endmodule

相关帖子

沙发
waiter| | 2012-9-18 00:48 | 只看该作者
module TransOut( input  wire [`DATA_L : 0] DataIn1,
                 input  wire [`DATA_L : 0] DataIn2,
                 input  wire [`DATA_L : 0] DataIn3,
                 input  wire [1 : 0]       DataSel,
                 output reg  SCLK,
                 output reg  LE,
                 output reg  DA_OUT);

如果想要在例化该模块时,再指定 DATA_L的值,也就是要实现“参数传递”,就要把 DATA_L定义为一个parameter

使用特权

评论回复
板凳
waiter| | 2012-9-18 00:54 | 只看该作者
要像下面这样写:
/3-Set the N Counter Latch
//Send Data
//DATA Hold afier one SCLK pose-edge
//SCLK Max is 20Mhz
module TransOut
# (
parameter DATA_L = 7
)
( input  wire [`DATA_L : 0] DataIn1,
                 input  wire [DATA_L : 0] DataIn2,
                 input  wire [DATA_L : 0] DataIn3,
                 input  wire [1 : 0]       DataSel,
                 output reg  SCLK,
                 output reg  LE,
                 output reg  DA_OUT);
  integer n,m = DATA_L;
  
  reg [DATA_L : 0] Data;
  reg  [1 : 0] a = 2'b11;
  
  always@(DataIn1 or DataIn2 or DataIn3)
  begin
    //Preform the Data
    //$display("in0 = %x\n",in0);
    if(DataSel == 2'b01)
      Data = 24'hff;
    else if(DataSel == 2'b10)
      Data = DataIn2;
    else if(DataSel == 2'b11)
      Data = DataIn3;
    else
      Data = 0;
    //SCLK Pin Output,LE Pin Output
    SCLK = `Lo;
    LE = `Hi;
    //Delay 5 units,LE set down
    #5 LE = `Lo;
   
    //Start the transform Clock
    for(n = 0;n < DATA_L;n = n + 1)
    begin
      SCLK = #`SCLK_F `Hi;
      SCLK = #`SCLK_F `Lo;
    end
   
    #1 LE = `Hi;  
  end

  //DATA Pin Output
  always @(posedge SCLK)
  begin
    //Start Data TransForm,MSB First
    if(m > 0)
      begin
        DA_OUT = Data[m];
        m = m - 1;
      end
    else
      begin
        m = DATA_L;
      end     
  end
  
endmodule

//Test Top Module
module Top;
  parameter DATA_L = 8;
  reg [DATA_L : 0] d = 24'b111011101001;
  reg [1:0] sel = 2'b11;
  wire [DATA_L : 0] r,ctrl;
  wire sclk,out,le;
  
  Create_R R(r);
//  TransOut T(r,sclk,le,out);
  
  SetADF S(ctrl);
  TransOut
  #(.DATA_L(DATA_L))
  T(.DataIn1(r),
             .DataIn2(ctrl),
             .DataIn3(d[DATA_L : 0]),
             .DataSel(sel[1:0]),
             .SCLK(sclk),
             .LE(le),
             .DA_OUT(out));
endmodule

使用特权

评论回复
地板
GoldSunMonkey| | 2012-9-18 09:43 | 只看该作者
代码太长了,我都没心思看。

使用特权

评论回复
5
GoldSunMonkey| | 2012-9-18 09:43 | 只看该作者
你弄个小例子试一下不就知道了么?

使用特权

评论回复
6
qiantuo12345|  楼主 | 2012-9-19 17:05 | 只看该作者
3# waiter 非常感谢waiter大侠的回复,我现在遇到的问题是DataIn1,DataIn2,DataIn3,这几个参数无法传进TransOut模块,就是说,虽然在Top层实例化,但是实际上模块内部值还是没改变。比方说:TransOut  T0(
...
.DataIn1(24'b0101001),
...

但是实际上在模块内部引用DataIn1,值还是0.
不知道该如何解决?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

0

粉丝