2008-04-30

任意分频的 Verilog 实现

0 Comments | 14:00 | Verilog | Edit

该模块实现任意整数分频,这样偶分频和奇分频就不用写成两个模块了,呵呵。好不容易设计了这么个玩意,结果使用的CPLD资源太大,在毕业设计中,我还是用的简单的偶分频模块,毕竟实现简单,省资源。自己没使上,放在博客上,让有需要的做个参考吧,呵呵。

实现原理,自己上网找吧,这里就不罗嗦了。

module top
(
    input rst,
    input clk,
    output clk_out
);

    reg [3:0] factor_reg;
    freq_div #(.FACTOR_LEN(4)) freq_div_inst(rst, clk, clk_out, factor_reg);
    always
        factor_reg = 4'h5;

endmodule


// 实现任意整数分频
// Author: Mingchang Lian
// Date: 2008-4-30
// Revision: 0.1
// Copyright: GPL
// 不要在声明的时候赋初值,仿真和综合都有可能不会赋值,而用随机值
// 仿真建议显式赋值,reg在always里赋值
// 综合建议加个reset信号,来赋初值
module freq_div
(
    input rst,    // 低电平有效,复位
    input clk,    // 输入时钟
    output clk_out, // 分频输出
    input [(FACTOR_LEN - 1):0] factor // 分频倍数
);

    reg clk_pos; // 上升沿分频
    reg clk_neg; // 下降沿分频
    reg [(FACTOR_LEN - 1):0] i; // 计数器
    reg [(FACTOR_LEN - 1):0] j; // 计数器

    parameter FACTOR_LEN = 8;
   
    // 偶分频输出 clk_pos
    // 奇分频将上升沿和下降沿分配相与后输出
    // 奇分频的高电平多于低电平用与运算
    // 低电平多于高电平用或运算
    assign clk_out = (factor[0]) ? (clk_pos & clk_neg) : clk_pos;

    always @ (posedge clk)
    begin
        if (!rst)    // 复位
        begin
            clk_pos <= 1'b0;
            i <= {FACTOR_LEN{1'b0}};
        end
        else
        begin
            i = i + 1'b1;
            if (i == (factor >> 1))
                clk_pos <= ~clk_pos; // 翻转
            else if (i == factor)
            begin
                clk_pos <= ~clk_pos;
                i <= {FACTOR_LEN{1'b0}};
            end
            else
                /* NOP */;
        end
    end

    always @ (negedge clk)
    begin
        if (!rst)    // 复位
        begin
            clk_neg <= 1'b0;
            j <= {FACTOR_LEN{1'b0}};
        end
        else
        begin
            j = j + 1'b1;
            if (j == (factor >> 1))
                clk_neg <= ~clk_neg;
            else if (j == factor)
            begin
                clk_neg <= ~clk_neg;
                j <= {FACTOR_LEN{1'b0}};
            end
            else
                /* NOP */;
        end
    end
endmodule

阅读全文»

Tags:

2008-04-29

Quartus II 中使用VIM编辑器

0 Comments | 21:49 | Verilog | Edit

Quartus II的编辑器不支持中文,实在够垃圾的,呵呵。以前我都是在外部编辑器中写代码,再导入到Quartus中,这样实在是麻烦,尤其是在调试时,两边“忙”,很容易出问题。今天好好看了一下Quartus II的选项,原来Quartus II支持外部编辑器,于是把编辑器换成了VIM,哈哈。这下好了,可以在Quartus II中用中文注释了。而且调试时,双击出错的地方会自动调转到VIM编辑器,呵呵。

怎么设置??直接看图片吧,呵呵。使用的VIM命令是:

gvim --remote-tab-silent +%l %f



阅读全文»

Tags: VIM Quartus II

2008-04-27

Verilog与C语言的比较

0 Comments | 16:00 | Verilog | Edit

在一个课件上看到的,觉得总结的非常好,就放到博客上。

Verilog HDL是在C语言的基础上发展起来的,保留了C语言的结构特点。

  • C语言由函数组成,Verilog由模块(module)组成
  • C语言通过函数名及其端口变量实现调用,Verilog也通过模块名和端口变量实现调用
  • C语言有主函数main(),Verilog的个module均等价,但必有一个顶层模块,包含芯片系统与外界的所有I/O信号
  • C语言是顺序执行,而Verilog的所有module均并发执行
  • C语言与Verilog语法相似

阅读全文»

Tags: Verilog

2008-04-05

专用集成电路

0 Comments | 21:02 | 经典书籍 | Edit

本书是一本有关专用集成电路(ASIC)的综合性和权威性书籍。书中叙述了VLSI系统设计的最新方法。利用商业化工具以及预先设计好的单元库已使得 ASIC设计成为速度最快、成本最低而且错误最少的一种IC设计方法,因而ASIC设计方法已迅速在工业界的各个应用领域得到推广。
   本书介绍了半定制和可编程的ASIC。在对每种ASIC类型的数字逻辑设计与物理特性的基本原理进行描述后,讨论了ASIC逻辑设计设计输入、逻辑综合、 仿真以及测试,并进一步讲述了相应的物理设计——划分、布图规划、布局以及布线。此外,本书对在ASIC设计中需要了解的各方面知识以及必需的工作都有详 尽叙述。
   本书可作为大学高年级和研究生教材,也是ASIC领域工程技术人员的理想参考书。

我的评论:学ASIC的经典教材了,看这本书才知道FPGA在IC中的地位。全书分为三部分:ASIC介绍、ASIC逻辑设计、ASIC物理设计。我还没看完,等全看完再多说吧,呵呵。

豆瓣链接:专用集成电路

阅读全文»

Tags: ASIC

2008-04-05

半年没写博客了

0 Comments | 20:34 | Blog事务 | Edit

快半年没写博客了,呵呵。一直在忙毕业设计,也许是借口吧,呵呵。这半年发生了很多事情,不管是学习上的,还是私人上的事情^_^。毕业设计还在继续努力中,PCB已经送到工厂了,真怕出错了,呵呵。因为毕设好久没玩 Linux 了,前几天实验室的电脑坏了,就把寝室的电脑搬到了实验室,也因此和 Debian 告别了,用了一年多(??应该有吧)的Debian就此删了,真有点舍不得。等我下次买笔记本了,再相见吧,Debian。

这半年一直在补以前欠下的知识,但还是感觉落下什么,什么都不会,呵呵。这也许就是对自己掌握知识的不自信吧。还有就是冒着风险没学用Protel画PCB,而是坚持学的Allegro。Allegro的软件操作还是很有意思的,一看就是从UNIX工作站起源的软件,呵呵,处处体现着软件设计的巧妙(还不如说是奇怪的操作,呵呵)。

以后要坚持写博客了,不然工作了,就更没机会写博客了。以后的内容应该会以毕设为主了,Linux先放一边吧。还有三个月,就毕业了,奋斗吧。

阅读全文»

Tags: