参考:《单片机与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输出。又按上述方法在板子上实测,得到结果与仿真结果相符。
评论