基础逻辑门

简介: Verilog HDL 设计语言支持3种设计风格: 门级,数据流级和行为级。 门级和数据流级设计风格通常用于设计组合逻辑电路,而行为级设计风格既可以用于设计组合逻辑电路又可以设计时序逻辑电路。本次实验通过使用Vivado 2015.1软件工具,以Basys3和Nexys4 DDR开发板为目标板,设计简单的组合逻辑电路来展示3种设计风格的用法。请参考Vivado手册了解如何使用Vivado工具创建工程并验证数字电路。

Verilog HDL简介

Verilog HDL 设计语言支持3种设计风格: 门级,数据流级和行为级。 门级和数据流级设计风格通常用于设计组合逻辑电路,而行为级设计风格既可以用于设计组合逻辑电路又可以设计时序逻辑电路。本次实验通过使用Vivado 2015.1软件工具,以Basys3和Nexys4 DDR开发板为目标板,设计简单的组合逻辑电路来展示3种设计风格的用法。请参考Vivado手册了解如何使用Vivado工具创建工程并验证数字电路。

Nexys4 DDR简介

Nexys4 DDR 特性如下:

  • 128 MiB DDR 2 SDRAM
  • 16Mbytes SPI (quad 模式) PCM 非易失型存储器
  • 16Mbytes 并行 PCM 非易失型存储器
  • 10/100 以太网PHY
  • USB-UART 和 USB-HID 端口(用于鼠标和键盘)
  • 8-bit VGA 端口
  • 100MHz CMOS 振荡器
  • 72个I/O连接到扩展连接器
  • GPIO 包括 8个LED, 5个按键开关,8个拨码开关和2个4位7段数码管

Nexys4 DDR 开发板如下图所示

网络异常,图片无法展示
|

门级建模

Verilog HDL 支持内建的原始的门级设计。门级支持包括多输入、多输出、三态和拉态。 多输入门支持包括: and, nand, or, nor, xor, 和xnor,它们的输入为2个及以上,输出只有1个。多输出门支持包括buf 和 not ,它们的输出为2个及以上,输入只有1个。 Verilog HDL语言还支持三态门: bufif0, bufif1, notif0, 和notif1。这些三态门有一个输入,一个控制信号和一个输出。拉门支持包括pullup和 pulldown,只有一个输出(没有输入)。这些门的零延迟的基本语法如下:

and | nand | or | nor | xor | xnor [instance name] (out, in1, …, inN); // [] is optional and | is  
selection  
buf | not [instance name] (out1, out2, …, out2, input);    
bufif0 | bufif1 | notif0 | notif1 [instance name] (outputA, inputB, controlC);  
pullup | pulldown [instance name] (output A);   你也可以在同一语句中,用逗号分隔,创建多个相同类型门的实例,比如:

Verilog HDL语言也允许在实例化门电路时加入延迟。 加入的延迟来自输入或输出。这些延迟可以表达为上升、下降或关断延迟;在一个实例中可以使用1、2或3种延迟。关断延迟可以用于输出能被关掉的门 (如 notif1).比如,

and #5 A1(Out, in1, in2); // the rise and fall delays are 5 units   
and #(2,5) A2(out2, in1, in2);  // the rise delay is 2 unit and the fall delay is 5  
units notif1 #(2, 5, 4) A3(out3, in2, ctrl1); //the rise delay is 2, the fall delay is 5, and the turn- off delay is 4 unit

实验步骤

  • 打开 Vivado并创建空白工程,取名为 lab1.1 (参考 Vivado2015.1 手册 Step 1)。

网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|

创建文件create file

网络异常,图片无法展示
|

添加xdc文件

网络异常,图片无法展示
|

选择配置文件

网络异常,图片无法展示
|

  • 使用门级建模风格创建Verilog module包含3个输入(in1,in2,select)和1个输出(out) (参考Vivado2015.1手册 Step 1).

提示:单击在New Project窗口,Add Source上的绿色加号按钮。然后单击Create File。修改文件名为lab1_1_1,单击OK。确认目标语言和仿真语言都设置为Verilog。单击两次Next。

  • 将适合开发板的XDC文件添加到工程。

提示:单击在New Project窗口Add Constraints上的绿色加号按钮。单击AddFile.选择Basys3_Master.xdc (Basys3)或Nexys4DDR_Master.xdc (Nexys4 DDR)。点击Next。

  • 在New Project窗口选择xc7a35tcpg236-1(Basys3)或xc7a100tcsg324-1(Nexys4 DDR)。单击Next。单击Finish。
  • 一个定义Module的窗口会出现, 通过单击Port Name并输入变量名,创建3个输入 (in1, in2, select) 和1个输出(out) 。 通过单击下拉列表选择正确的方向修改 Direction。单击OK。

网络异常,图片无法展示
|

  • 打开lab1.1.v 文件编辑其中内容。 在分号 (;)后添加上文电路的结构逻辑。选择File > Save File或 CRTL-S保存。
    单击RTL Analysis上的 Elaborated Design选项卡。
    单击 Schematic 查看门级建模的设计。

使用门级建模的方式写,verilog的代码如下:

module 
ab1_1( input in1,in2, input select, output out ); 
wire temp1,temp2,temp3; 
not (temp1,select); 
and (temp2,temp1,in1); 
and (temp3,select,in2); 
or (out,temp2,temp3); 
endmodule

点击Schematic 查看门级建模的设计

网络异常,图片无法展示
|

大致如下的电路:

网络异常,图片无法展示
|

由此我们可以知道我们设计的门级建模的确是对的。

编辑XDC文件。去注释并将 SW0 和 SW1赋给in1 和 in2, SW7 给 select, LED0给out。保存XDC文件。 生成比特流文件,将其下载到Basys3或Nexys4 DDR开发板,并验证功能

打开xdc文件

网络异常,图片无法展示
|

修改xdc文件对应段落:

set_property -dict { PACKAGE_PIN J15   IOSTANDARD LVCMOS33 } [get_ports { in1 }]; #IO_L24N_T3_RS0_15 Sch=sw[0]
set_property -dict { PACKAGE_PIN L16   IOSTANDARD LVCMOS33 } [get_ports { in2 }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1]
#set_property -dict { PACKAGE_PIN M13   IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2]
#set_property -dict { PACKAGE_PIN R15   IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3]
#set_property -dict { PACKAGE_PIN R17   IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4]
#set_property -dict { PACKAGE_PIN T18   IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5]
#set_property -dict { PACKAGE_PIN U18   IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6]
set_property -dict { PACKAGE_PIN R13   IOSTANDARD LVCMOS33 } [get_ports { select }]; #IO_L5N_T0_D07_14 Sch=sw[7]
#set_property -dict { PACKAGE_PIN T8    IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8]
#set_property -dict { PACKAGE_PIN U8    IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9]
#set_property -dict { PACKAGE_PIN R16   IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10]
#set_property -dict { PACKAGE_PIN T13   IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11]
#set_property -dict { PACKAGE_PIN H6    IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12]
#set_property -dict { PACKAGE_PIN U12   IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13]
#set_property -dict { PACKAGE_PIN U11   IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14]
#set_property -dict { PACKAGE_PIN V10   IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15]
## LEDs
 set_property -dict { PACKAGE_PIN H17   IOSTANDARD LVCMOS33 } [get_ports { out }]; #IO_L18P_T2_A24_15 Sch=led[0]
# set_property -dict { PACKAGE_PIN K15   IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1]
# set_property -dict { PACKAGE_PIN J13   IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2]
# set_property -dict { PACKAGE_PIN N14   IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3]
# set_property -dict { PACKAGE_PIN R18   IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4]
# set_property -dict { PACKAGE_PIN V17   IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5]
# set_property -dict { PACKAGE_PIN U17   IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6]
# set_property -dict { PACKAGE_PIN U16   IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7]
#set_property -dict { PACKAGE_PIN V16   IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8]
#set_property -dict { PACKAGE_PIN T15   IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9]
#set_property -dict { PACKAGE_PIN U14   IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10]
#set_property -dict { PACKAGE_PIN T16   IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11]
#set_property -dict { PACKAGE_PIN V15   IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12]
#set_property -dict { PACKAGE_PIN V14   IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13]
#set_property -dict { PACKAGE_PIN V12   IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14]
#set_property -dict { PACKAGE_PIN V11   IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15]
相关文章
|
存储 网络协议 安全
必知的技术知识:DNS资源纪录(ResourceRecord)介绍
必知的技术知识:DNS资源纪录(ResourceRecord)介绍
|
数据挖掘 程序员 Python
【Python】已解决:ModuleNotFoundError: No module named ‘Workbook’
【Python】已解决:ModuleNotFoundError: No module named ‘Workbook’
287 0
|
Java Linux
手把手教你Linux系统下的Java环境配置,简单到不行!
手把手教你Linux系统下的Java环境配置,简单到不行!
501 1
|
SQL Java 数据库连接
解决mybatis-plus 拦截器不生效--分页插件不生效
本文介绍了在使用 Mybatis-Plus 进行分页查询时遇到的问题及解决方法。依赖包包括 `mybatis-plus-boot-starter`、`mybatis-plus-extension` 等,并给出了正确的分页配置和代码示例。当分页功能失效时,需将 Mybatis-Plus 版本改为 3.5.5 并正确配置拦截器。
3873 6
解决mybatis-plus 拦截器不生效--分页插件不生效
|
缓存 NoSQL Java
Springboot实战——黑马点评之秒杀优化
【9月更文挑战第27天】在黑马点评项目中,秒杀功能的优化对提升系统性能和用户体验至关重要。本文提出了多项Spring Boot项目的秒杀优化策略,包括数据库优化(如索引和分库分表)、缓存优化(如Redis缓存和缓存预热)、并发控制(如乐观锁、悲观锁和分布式锁)以及异步处理(如消息队列和异步任务执行)。这些策略能有效提高秒杀功能的性能和稳定性,为用户提供更佳体验。
853 6
|
数据采集 机器学习/深度学习 数据可视化
数据挖掘实战:Python在金融数据分析中的应用案例
Python在金融数据分析中扮演关键角色,用于预测市场趋势和风险管理。本文通过案例展示了使用Python库(如pandas、numpy、matplotlib等)进行数据获取、清洗、分析和建立预测模型,例如计算苹果公司(AAPL)股票的简单移动平均线,以展示基本流程。此示例为更复杂的金融建模奠定了基础。【6月更文挑战第13天】
2694 3
|
存储 JavaScript 前端开发
基于SpringBoot+Vue高校校园点餐系统【源码(完整源码请私聊)+论文+演示视频+包运行成功】(1)
基于SpringBoot+Vue高校校园点餐系统【源码(完整源码请私聊)+论文+演示视频+包运行成功】
339 0
|
数据采集 机器学习/深度学习 人工智能
智源「悟道3.0」大模型系列问世,这次不拼参数,开源开放成为主角(1)
智源「悟道3.0」大模型系列问世,这次不拼参数,开源开放成为主角
568 0
|
存储 机器学习/深度学习 编译器
函数栈帧深度剖析(一篇带你牢牢掌握函数栈帧)(一)
函数栈帧深度剖析(一篇带你牢牢掌握函数栈帧)(一)
1686 0