集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 3786|回复: 9

请教一个xilinx 时钟的问题

[复制链接]
applelonger 发表于 2011-4-2 14:59:17 | 显示全部楼层 |阅读模式
各位好!
我有一个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 [15:0] 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 [15:0] 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 [25:0]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[25];

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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-24 10:41 , Processed in 0.070690 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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