正文

〖002〗二选一多路器[Verilog HDL模块的基本概念]2006-06-10 16:01:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/15629.html

分享到:

参考:《单片机与CPLD综合应用技术》(周立功)
实验板: 网助二号


从几个简单Verilog HDL程序了解Verilog HDL模块的特性。

例5.2.1

module muxtwo(out, a, b, sl);
input  a, b, sl;
output out;
reg out;
    always @ (sl or a or b)
        if(!sl)
            out = a;
        else
            out = b;
endmodule

这几天看了许多不常见的符号,正好拿来组成以下框图表示上述模块:

         ____
a ───┤   ╲
        ㄧ    ├─── out
b ───┤   ╱
          ̄ ̄ㄧ
sl ─────┘

由于Verilog HDL是与C语言类似的, 所以不难理解此模块muxtwo的作用。这是一个二选一多路器(想起了数电里学过的数据选择器,又叫多路选择器Multiplexer, 简写为MUX), 即选择由out端输出a还是b由sl电平决定。sl为0时输出out与a相同; 否则与b相同。"always @ (sl or a or b)"这一句表示只要sl,或a,或b其中有一个变化,就执行下面的语句。这里并不关心其电路结构,只从逻辑功能上来描述。

例5.2.2

module muxtwo(out, a, b, sl);
input  a, b, sl;
output out;
     not    u1(nsl, sl);
     and #1 u2(sela, a, nsl);
     and #1 u3(selb, b, sl);
     or  #2 u4(out, sela, selb);
endmodule

还是用符号画个图表示一下,虽然"画"起来有点费劲儿,不过感觉还是挺有意思(U1是非门、U2U3是与门、U4时或门)。

a                   1     U2
────────────┬---╮ 3
                    2   ㄧand├─┐
         U1       ┌──┴---╯  ㄧ    U4
        ┌---╮   ㄧ             └─┬----╮
    ┌─┤not о─-┘                  ) or ├── out
    ㄧ  └---╯                  ┌─┴----╯
sl  ㄧ               1    U3     ㄧ
──┴─────────┬---╮ 3ㄧ
b                    2  ㄧand├─┘
────────────┴---╯

这个模块muxtwo的作用也容易理解。同样为二选一多路器。各输入输出信号功能同上一模块功能相同,即sl为0时输出out与a相同; 否则与b相同。该模块的描述是用基本的"与"门、"或"门、"非"门的互联来描述的。在程序模块中出现的and、or和not都是Verilog HDL语言的保留字,由Verilog语言的原语(primitive)规定了它们的接口顺序和用法,分别表示这三种门,其中元件的输出口都规定在第一个端口"#1"和"#2"分别表示门输入到输出的延迟为1和2个单位时间;模块表示的是电路结构,与上面的电路逻辑图表示的是完全一致的。Verilog HDL的语法也支持这种基本逻辑单元互联结构的描述。

这个模块中有三个中间变量:nsl、sela、selb。对照结构图分别对应着非门U1和与门U2、与门U2和或门U4、与门U3和或门U4之间的连接信号。

如果在编写Verilog HDL模块时,不但符合语法,还符合一些基本规则,可以通过计算机上运行的工具把上例5.2.1自动转换为例5.2.2的描述模块。此过程叫综合(synthesis)。因为后者很容易与某种工艺的基本元件逐一对应起来,再通过布局布线工具自动地转变为某种工艺的电路布线。

我所理解意思就是比如我们用Verilog HDL设计了如前者类似的功能模块,由于其是用行为描述的,所以只能在CPLD或FPGA这种器件中实现,若想应用到实际中,在模块较小的时候,若就用CPLD等芯片实现显然太浪费,可能就要单独设计这样的芯片了。那简单而有效的另一方法就是上面所述,用如5.2.2的设计,或用5.2.1转换为后者,即用电路结构的方式描述,这样便可以用现有基本元件结构实现了。
某些风格的Verilog HDL可以综合,而某些则不可以综合,书中提出了一个问题:不可综合的Verilog HDL有些什么作用呢? 希望学完这章能够自己找出答案。

虽然这个模块很简单,也容易理解,可还不放心,总想用板子实测一下。于是用网助二号 (查看该板)验证,这块板上有四个拨码开关K5、K6、K7、K8,现作如下分配:

┌---------------------------┐
ㄧCPLD引脚  板上资源  模块I/Oㄧ
├---------------------------┤
ㄧ  61        K5        a    ㄧ
ㄧ  63        K6        b    ㄧ
ㄧ  65        K8        sl   ㄧ
ㄧ  30        L1        out  ㄧ
└---------------------------┘

这样通过拨码开关控制输入,由发光二极管L1观察输出的状态。在这块板上拨码开关下拨表示输入为1,上拨为0。输出为0时LED亮,为1时灭。输入三个信号,共16种组合,结果如下:

╔────────╗
│ a  b   sl  out │
├────────┤
│ 0  0   0    0  │
│ 0  0   1    0  │
│ 0  1   0    0  │
│ 0  1   1    1  │
│ 1  0   0    1  │
│ 1  0   1    0  │
│ 1  1   0    1  │
│ 1  1   1    1  │
╚────────╝

可见验证结果与预测相符: sl为0时选择a输出; sl为1时选择b输出


补充:虽然如上结果足以验证其正确性,但总感觉不弄个图上来还是不太生动^_^想把实验板的最终结果拍下来吧,又没数码相机。想还是用Porteus模拟一下吧,另外又将上面的实验扩展了一下,既然这块板(查看)是单片机与CPLD的综合实验板,那何不利用一下单片机输出信号代替上面的开关产生所有的组合呢?

模拟过程中用到的门电路有:

7404 : 六反相器
7408: 四2输入与门
7432: 四2输入或门

将单片机P1.0口、P1.1口、P1.2口分别与上述实验的a、b、sl相接以组合产生8个状态,为便于观察,再分别接一个LED显示其状态。二选一多路器的输出端out接一个LED显示结果。单片机部分程序主要就是在P1口低三位产生000,001,010,011,……,111这8个状态送到a、b、sl这三个端,每产生一个状态后延时1s,以便观察。

单片机程序如下:

          org    0000h
start:    mov    a,  #00h
lop:      mov    p1, a
          inc    a
          call   delay_1s          
          ajmp   lop

delay_1s: mov    r0,#2
temp1:    mov    r1,#0ffh
temp2:    mov    r2,#10
temp3:    mov    r3,#100
          djnz   r3,$
          djnz   r2,temp3
          djnz   r1,temp2
          djnz   r0,temp1
          ret
          end

最终仿真结果:




仍然可以得出: sl为0时选择a输出; sl为1时选择b输出。又按上述方法在板子上实测,得到结果与仿真结果相符。


阅读(8562) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册