尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

2.1 verilog 语言之基础

2.1 verilog 语言之基础 ​简单导线创建一个具有一个输入和一个输出、行为类似导线的模块与物理导线不同Verilog 中的导线以及其他信号具有方向性。这意味着信息仅沿一个方向流动从通常是一个源端流向汇端源端通常也被称为驱动器用于将值驱动到导线上。在 Verilog 的“连续赋值”assign left_side right_side;中右侧信号的值会被驱动到左侧的导线上。这种赋值是“连续的”因为即便右侧的值发生变化该赋值也会一直生效。连续赋值并非一次性的操作。模块上的端口也具有方向通常为输入或输出。输入端口由模块外部的某个对象驱动而输出端口则驱动外部的某个对象。从模块内部来看输入端口是驱动源或信号源输出端口则是接收端。下图展示了电路的各个部分与 Verilog 代码的每一位是如何对应的。模块和端口声明构成了电路的黑色部分。你的任务是通过添加一条 assign 语句创建一根导线绿色将 in 连接到 out。方框外的部分与你无关但你需要知道你的电路是通过将测试平台的信号连接到你的 top_module 上的端口来进行测试的。除了连续赋值语句外Verilog 还有另外三种用于过程块的赋值类型其中两种是可综合的。我们要到开始使用过程块时才会用到它们。参考答案/* 模块功能单比特信号直通缓冲电路Simple Wire 设计说明纯组合逻辑连线输入电平实时同步至输出无逻辑运算、无时序延迟 平台约束顶层模块名top_module、端口名in/out固定不可修改适配HDLBits自动例化测试框架 适用场景基础信号直通、短距离电平缓冲 */moduletop_module(input in,// 1bit外部输入线网接收上游输入电平output out// 1bit直通输出线网向下游同步传递输入电平);// 连续赋值实现导线直通wire型信号组合逻辑实时绑定输入变化立即同步到输出assign outin;endmodule输出结果四根导线创建一个包含3个输入和4个输出的模块其行为类似连线并建立如下连接a - wb - xb - yc - z下方的示意图展示了电路的各个部分与 Verilog 代码的每一位是如何对应的。在模块外部有三个输入端口和四个输出端口。当你有多个赋值语句时它们在代码中出现的顺序并不重要。与编程语言不同赋值语句“连续赋值”描述的是事物之间的连接而非将一个值从一个事物复制到另一个事物的操作。这里有一个可能造成混淆的地方或许现在就应该澄清此处的绿色箭头代表线路之间的连接而非线路本身。该模块本身已经声明了7条线路命名为a、b、c、w、x、y和z。这是因为input和output声明在未特别指定的情况下实际上会声明一条线路。编写input wire a与input a的效果是相同的。因此assign语句并非在创建线路而是在建立这7条已存在线路之间的连接。参考答案/* 模块功能多路信号直通分配电路四路独立输出连线 逻辑说明a单路输出至wb扇出分流至x、y两路c单路输出至z全程纯组合逻辑直通无运算 平台约束顶层模块名top_module、全部端口名称固定不可修改适配平台自动例化评测 设计要点演示单输入多扇出基础布线规则 */moduletop_module(input a,// 1bit输入信号仅驱动输出winput b,// 1bit输入信号同时驱动输出x、y信号一分二扇出input c,// 1bit输入信号仅驱动输出zoutput w,// 直通输出跟随a电平实时变化output x,// 直通输出跟随b电平实时变化output y,// 直通输出跟随b电平实时变化output z// 直通输出跟随c电平实时变化);assign wa;// a→w一对一信号直通assign xb;// b→x分支通路直通assign yb;// b→y分支通路直通实现b信号双路扇出assign zc;// c→z一对一信号直通endmodule输出结果反相器创建一个实现非门的模块这个电路类似于导线但有一个细微差别。在从in导线到out导线的连接过程中我们将使用一个反相器或“非门”来实现而不是普通的导线。使用 assign 语句。assign 语句会持续将 in 的反值驱动到连线 out 上。参考答案/* 模块名称单比特反相器NOT Gate / Inverter 功能概述纯组合逻辑对输入电平按位取反输出 平台约束顶层模块名top_module、端口in/out固定不可修改适配HDLBits自动例化评测 逻辑表达式out ~in 真值规则输入0输出1、输入1输出0 */moduletop_module(input in,// 1bit原始输入线网待取反信号output out// 1bit反向输出线网输出取反结果);// 组合逻辑连续赋值~为按位取反运算符实时反转输入电平assign out~in;endmodule输出结果与门创建一个实现与门的模块该电路现在有三根导线a、b和out。导线a和b已由输入端口赋予了值。但导线out目前没有任何信号驱动。请编写一条assign语句用信号a和b的与运算结果来驱动out。请注意该电路与非门非常相似只是多了一个输入。如果听起来有所不同那是因为我开始将信号描述为被驱动具有由连接的外部元件确定的已知值或未被驱动。Input wires由模块外部的元件驱动。assign语句会为线赋予一个逻辑电平。正如你所料一根线不能有多个驱动源如果有多个其逻辑电平是什么而没有驱动源的线将具有未定义的值在综合硬件时通常被视为0。参考答案/* 模块功能2输入标准与门AND Gate 逻辑式out a b 平台约束顶层名top_module、端口a/b/out不可修改适配平台自动例化评测 真值规则仅a、b同为高电平时输出1其余输入组合输出0 */moduletop_module(input a,// 1bit逻辑输入Ainput b,// 1bit逻辑输入Boutput out// 1bit与运算结果输出);// 连续赋值实现按位与运算纯组合逻辑实时响应输入变化assign outab;endmodule输出结果或非门创建一个实现或非门的模块。或非门是输出取反的或门。在 Verilog 中编写或非逻辑需要两个操作数一条赋值语句为一根导线或更正式地称为“线网”赋予一个值。该值可以是任意复杂的函数只要它是组合逻辑函数即无记忆、无隐藏状态的函数。assign语句属于连续赋值因为每当其任意输入发生变化时输出都会被“重新计算”且这一过程会持续进行这与简单的逻辑门非常相似。参考答案/* 模块功能2输入或非门NOR Gate 逻辑表达式out ~(a | b) 平台约束顶层模块名top_module、端口a/b/out禁止修改适配平台自动例化评测 真值规则仅a、b全0时输出1其余组合输出0 */moduletop_module(input a,// 1bit输入信号Ainput b,// 1bit输入信号Boutput out// 1bit或非运算结果输出);// 先按位或、整体取反括号固定运算顺序规避运算符优先级歧义assign out~(a|b);endmodule输出结果异或非门创建一个实现异或非门的模块参考答案/* 模块功能2输入同或门XNOR Gate 逻辑表达式out ~(a ^ b) 平台约束顶层模块名top_module、端口a/b/out禁止修改适配平台自动例化评测 真值规则a、b电平相同输出1电平相异输出0 */moduletop_module(input a,// 1bit逻辑输入Ainput b,// 1bit逻辑输入Boutput out// 1bit同或运算结果输出);// 先异或运算、整体取反括号锁定运算顺序规避优先级歧义assign out~(a^b);endmodule输出结果线网声明到目前为止这些电路都足够简单其输出是输入的简单函数。随着电路变得越来越复杂你需要用导线将内部组件连接起来。当你需要使用导线时应在模块主体内、首次使用它之前的某个位置对其进行声明。后续你会遇到更多类型的信号和变量它们也都采用同样的方式声明但现在我们先从 wire 类型的信号开始。示例// 模块功能两级反相器非门级联电路两次取反后输出电平与原始输入完全一致信号缓冲作用// 平台约束顶层模块名top_module、端口名固定不可修改适配平台自动例化评测moduletop_module(input in,// 声明1bit输入线网in接收外部原始输入信号output out// 声明1bit输出线网out输出两级取反后的最终信号);wire not_in;// 声明中间过渡线网not_in寄存第一级非门的取反结果// 第二级组合逻辑赋值对中间信号not_in再次取反搭建第2个非门驱动最终输出assign out~not_in;// 第一级组合逻辑赋值对原始输入in取反搭建第1个非门结果存入中间线网not_inassign not_in~in;endmodule// top_module模块定义结束在上述模块中有三根连线in、out 和 not_in其中两根已作为模块的输入和输出端口声明这也是你在之前的练习中无需声明任何连线的原因。连线 not_in 需要在模块内部声明它从模块外部是不可见的。随后通过两条 assign 语句创建了两个非门。请注意先创建哪一个非门并无影响最终得到的电路是相同的。因为两个assign 是同时执行的练习实现以下电路。创建两条中间导线名称可任意将与门和或门连接起来。请注意连接非门的导线实际上就是输出导线因此你无需额外声明第三条导线。注意导线的驱动规则每条导线仅由一个信号源门电路的输出驱动但可以为多个输入端提供信号。参考答案/* 模块功能双路与-或组合逻辑同步输出正向/反向结果 逻辑式out(ab)|(cd)out_n~out 平台约束顶层模块名top_module、全部端口命名固定不可修改 设计思路拆分多级门电路用中间线网承接过渡结果便于调试排查 */moduletop_module(input a,// 第1组与门输入Ainput b,// 第1组与门输入Binput c,// 第2组与门输入Cinput d,// 第2组与门输入Doutput out,// 组合逻辑正向输出output out_n// 组合逻辑反向输出低有效后缀_n通用标识);// 中间线网分级寄存门电路运算结果wire e;// 寄存ab结果wire f;// 寄存cd结果wire g;// 寄存两组与项相或的中间结果assign eab;// 第一级第1路2输入与运算assign fcd;// 第一级第2路2输入与运算assign ge|f;// 第二级两路与结果做或运算assign outg;// 输出原始正向电平assign out_n~g;// 输出取反反向电平endmodule输出结果​7458芯片7458是一款包含四个与门和两个或门的芯片。这个问题比7420稍微复杂一些。创建一个功能与7458芯片相同的模块。该模块有10个输入和2个输出。你可以选择使用assign语句来驱动每一根输出线也可以选择声明四根导线作为中间信号其中每一根内部导线都由一个与门的输出驱动。作为额外练习两种方法都可以尝试一下。参考答案/* 模块功能复刻7458双路独立与或门芯片逻辑 逻辑公式 p1y (p1a p1b p1c) | (p1d p1e p1f) p2y (p2a p2b) | (p2c p2d) 平台约束顶层名top_module、所有引脚名固定不可修改适配平台自动例化评测 结构说明通路1为两组3输入与门相或通路2为两组2输入与门相或两路完全独立 */moduletop_module(input p1a,p2a,p2b,p2c,p2d,input p1c,p1b,p1f,p1e,p1d,output p1y,p2y);// 通路1运算两组三输入与结果相或与运算满足交换律信号顺序不改变结果assign p1y(p1ap1bp1c)|(p1dp1ep1f);// 通路2运算两组二输入与结果相或assign p2y(p2ap2b)|(p2cp2d);endmodule输出结果
返回列表