applelonger 发表于 2011-4-2 14:59:17

请教一个xilinx 时钟的问题

各位好!
我有一个xilinx ML506的板子,下了个简单的组合逻辑电路测试 结果OK。
然后下个时序逻辑就出错了。。。
我的代码如下:
module LED( c, my_clk
    );
       input my_clk;
       output reg c;
       wire clk;

       initial begin
                c = 1;
       end
       
       always @(posedge clk) begin
                c <= ~c;
       end
               
       div_clk uut (
               .my_clk(my_clk),
               .clk(clk)
               );

endmodule

module div_clk(my_clk, clk
    );
       input my_clk;
       output reg clk;
       reg counter;
       
       initial begin
                counter = 0;
       end
       
       always @(posedge my_clk) begin
                if (counter == 10000) begin
                        counter <= 0;
                        clk <= ~clk;
                end
                else begin
                        clk <= clk;
                        counter <= counter + 1;
                end
       end


endmodule
约束文件如下:
#" PlanAhead Generated physical constraints "
NET "c" LOC = H18
#"Created by Constraints Editor (xc5vsx50t-ff1136-1) - 2011/04/01"
NET "my_clk" TNM_NET = my_clk
TIMESPEC TS_my_clk = PERIOD "my_clk" 1 ms HIGH 50% INPUT_JITTER 10 us
#"Created by Constraints Editor (xc5vsx50t-ff1136-1) - 2011/04/02"
OFFSET = OUT 50 ns AFTER "my_clk"

结果是:c信号对应管脚的灯一直亮着!当我把counter设为500 时,灯则是闪一下就灭了!
求教了 ! thx

哦十全_至芯学员 发表于 2011-4-2 22:26:10

1.intial语句是不可综合的,它只用在测试文件。你要是想对c和counter赋初值,你可以采用复位的方式。例如:
always @(posedge clk,negedge rst)
begin
        if(!rst)    //一般板子是低电平复位,且是上电就复位
                begin
                        c<=1'b1;
                end
        else
                begin
                        c<=~c;
                end
end
你要是改成500的话,不应该是亮了一下,应该是一直亮的,只是亮度变低。你可以做个仿真先……

applelonger 发表于 2011-4-3 13:23:32

哦十全_至芯学员 你好!
按你所说我进行了修改。另外,修改了一下 div_clk模块:
module div_clk(clk_in, clk, rst
    );
       input clk_in;
       input rst;
       output reg clk;
       
       reg counter;
       
//       initial begin
//                counter = 0;
//       end
       
       always @(posedge clk_in, negedge rst) begin
                if(!rst) begin
                        counter <= 0;
                end
                else if(counter >= 2000) begin
                        counter <= 0;
                        clk <= 0;
                end
                else if(counter < 1000) begin
                        clk <= 0;
                        counter <= counter + 1;
                end
                else if((counter >= 1000) && (counter < 2000))begin
                        clk <= 1;
                        counter <= counter +1;
                end
       end


endmodule

实验结果: 下载后led没亮,rst到来(1->0),灯亮,rst(0->1)(或其他操作) 等持续亮着。
会不会是我没有把时钟信号clk_in 引进来呢?
thx

applelonger 发表于 2011-4-3 14:54:03

top module:

module LED( c, clk_in, rst
    );
       input clk_in;
       input rst;
       output reg c;
       wire clk;

       always @(posedge clk,negedge rst) begin
                if(!rst) begin
                        c <= 1;
                end
                else begin
                        c <= ~c;
                end
       end

       div_clk uut (
               .clk_in(clk_in),
               .clk(clk),
               .rst(rst)
               );
               

endmodule

哦十全_至芯学员 发表于 2011-4-3 22:19:44

1.rst复位信号接在板子上复位键,你先检查下你的板子是低电平复位还是高电平复位。
2.灯灭亮的频率太快的话,人眼分辨不出来的。我们的日光灯用的是50HZ的交流电,我们看不出它的变化。所以建议你分频后的频率小些。下面是我写的程序你试一试,我们共同学习啊。
module LED( c,
          clk_in,
                  rst
                  );                  
input clk_in;
input rst;
output c;

wire clk;
reg c;
reg counter;

always @(posedge clk_in,negedge rst)
          begin
                if(!rst)
                      begin
                        counter<=1'b0;
                              end
                     else
                              begin
                                        counter<=counter+1'b1;
                              end
         end
   
assign clk=counter;

always @(posedge clk,negedge rst)
         begin
        if(!rst)
             begin
                    c<=1'b0;
                     end
            else
                     begin
                           c<=~c;
                  end
         end
   
endmodule

applelonger 发表于 2011-4-3 22:30:04

谢谢先哦 :)
我再试试,还有我想问一下:时钟管脚要怎么连,怎么配置呢?
我是连到一个管脚,还做了时序约束。这样是否正确?

哦十全_至芯学员 发表于 2011-4-3 22:43:56

assignment——pins连接就行了,不用做时序约束。我现在还在学习中,至于约束这块老师还没有深入讲解。等我会了,咱们在探讨。

applelonger 发表于 2011-4-3 23:29:49

呵呵 我就是很怀疑有没有吧时钟信号连接进去 呵呵
到时候多讨论啊

applelonger 发表于 2011-4-3 23:29:56

呵呵 我就是很怀疑有没有吧时钟信号连接进去 呵呵
到时候多讨论啊

applelonger 发表于 2011-4-4 10:37:50

问题已解决! 的确是时钟没有引进来,管脚分配出错了!
原:H17        3        IO_L0P_CC_GC_3
改:L19        3        IO_L5P_GC_3
感谢帮助!!
页: [1]
查看完整版本: 请教一个xilinx 时钟的问题