Scheme实现数字电路仿真(2)——原语

本文介绍了如何使用Scheme语言来模拟数字电路的原语,包括Verilog原语的概念和限制,以及如何在Scheme中构建时序电路原语,如D锁存器和D触发器。通过函数描述原语,作者探讨了如何引入时序概念并设计了一种带有状态转换的函数f-step,用于模拟电路的迭代变化。文章还提到了反柯里化在实现fold-left操作中的应用,以及如何封装电路原语以适应仿真需求。
摘要由CSDN通过智能技术生成
  版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址

  http://www.cnblogs.com/Colin-Cai/p/12045295.html 

  作者:窗户

  QQ/微信:6679072

  E-mail:6679072@qq.com

  上一章给出了组合电路的仿真实现,这一章开始思考时序电路的仿真实现。但时序电路远比组合电路复杂的多,我们先从组成电路的每个元件说起。在程序实现层次,我们可以考虑给每个基础元件一个自定义描述方式,称为原语。

  Verilog原语

  Verilog提供了元件原语建模的方式,说白了,就是用一个表格来体现所有情况下的输出。Verilog的原语只允许有一个输出。

  比如and门,用Verilog原语来描述如下

primitive myand(out,in1,in2);
output out;
input in1,in2;
table
// in1 in2    out
    0   ?   :  0;
    1   0   :  0;
    1   1   :  1;
endtable
endprimitive

    Verilog原语中不能使用高阻(因为除了三态门产生高阻输出之外,这的确与真实电路不符,而Verilog并无VHDL那般抽象),不能表示三态门。

   对于时序电路,Verilog也一样可以支持。所谓时序电路,意味着电路的输出不仅仅与当前电路的输入有关,还与电路之前的状态有关,所谓电路之前的状态也就是电路之前的输出。

  我们来考虑这样一个时序元件,称之为D锁存器,有两个输入en和in,一个输出out。当en为0时,out和in保持一致;当en为1时,out保持不变。这称之为电平触发。用波形图可以描述其特性:

  用verilog描述可以如下:

module dlatch(out, en, in);
output out;
input en, in;
reg out;
always@(in)
if(!en)
  out <= in;
endmodule

  电平触发的D锁存器可以用原语描述如下:

primitive dlatch(out, en, in);
output out;
input en, in;
reg out;
table
//en in : out : next out
   0   0 :  ?   :  0;
   0   1 :  ?   :  1;
   1   ? :  ?   :  -;
endtable
endprimitive

  状态表的最后一行next out位置的 - 符号代表状态保持。

  再来一个我们数字设计时最常用的元件D触发器,它有两个输入信号clk和in,有一个输出信号out。当clk从0变到1的瞬间(称之为上升沿),out被赋予in的值,其他时候out保持不变。这种触发称之为沿触发。波形图可以用以下描述其特性:

  用Verilog描述如下:

module dff(out, clk, in);
output out;
input
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值