FPGA学习(第5节)-看电路图写出Verilog代码(乘法运算+自加一+模块实例化等)
有个前一节的设计规范,现在我们通过看电路图写出对应的Verilog代码。
一、简单模块设计
(1)任务说明
(2)代码实现:
功能分析:输出两数相乘的结果。
图中是一个D触发器和乘法器的组合,可以通过组合逻辑+时序逻辑结合来实现。也可以只在时序逻辑中实现。
module mul_module(clk ,rst_n ,//其他信号,举例doutmul_a ,mul_b ,mul_result );//参数定义parameter A_W = 4;parameter B_W = 3;parameter R_W = A_W + B_W;//输入信号定义input clk ;input rst_n ;input [A_W-1:0] mul_a ;input [B_W-1:0] mul_b ;//输出信号定义output[R_W-1:0] mul_result;//输出信号reg定义reg [R_W-1:0] mul_result;//中间信号定义reg [R_W-1:0] mul_result_tmp;//组合逻辑写法/*always@(*)beginmul_result_tmp = mul_a * mul_b;endalways@(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginmul_result <= 0;endelse beginmul_result <= mul_result_tmp;endend*///时序逻辑写法always@(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginmul_result <= 0;endelse beginmul_result <= mul_a * mul_b;endendendmodule
二、简单模块设计
(1)电路图
(2)代码实现
功能分析:自加一
图中有一个加法器(组合逻辑实现)、一个D触发器(时序逻辑实现)。
module module_name(
clk ,
rst_n ,
//其他信号
out
);//参数定义
parameter DATA_W = 4;//输入信号定义
input clk ;
input rst_n ;//输出信号定义
output[DATA_W-1:0] out ;//输出信号reg定义
reg [DATA_W-1:0] out ;//中间信号定义
reg [DATA_W-1:0] out_temp;//组合逻辑写法
always@(*)beginout_temp = out+1'b1;
end//时序逻辑写法
always@(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)beginout<=0;
end
else beginout<=out_temp;
end
endendmodule
三、复杂模块设计
(2)代码实现
功能分析:与运算+选择器+实例化
从输出部分开始写代码:
两个寄存器变量的D触发器(时序)--》实例化模块(带参数)--》选择器(组合)--》寄存器变量的D触发器+与运行(时序)每个模块都在一个always块里去设计。
时序还是组合很清晰。
module mul2port(clk ,rst_n ,//其他信号,举例doutdin_a ,din_b ,din_c ,din_d ,sel_a ,sel_b ,result_a,result_b);//参数定义parameter A_W = 3;parameter B_W = 2;parameter C_W = 4;parameter R_A_W = 7;parameter R_B_W = 6;//输入信号定义input clk ;input rst_n ;input [A_W-1:0] din_a ;input [B_W-1:0] din_b ;input [C_W-1:0] din_c ;input [C_W-1:0] din_d ;input sel_a ;input sel_b ;//输出信号定义output[R_A_W-1:0] result_a ;output[R_B_W-1:0] result_b ;//输出信号reg定义reg [R_A_W-1:0] result_a ;reg [R_B_W-1:0] result_b ;//中间信号定义reg [R_A_W-1:0] result_a_tmp;reg [R_B_W-1:0] result_b_tmp;reg [C_W -1:0] sel_dout ;reg sel ;always@(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginresult_a <= 0;endelse beginresult_a <= result_a_tmp;endendalways@(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginresult_b <= 0;endelse beginresult_b <= result_b_tmp;endendmul_module #(.A_W(A_W),.B_W(C_W)) mul_4_3(.clk (clk ),.rst_n (rst_n ),.mul_a (din_a ),.mul_b (sel_dout ),.mul_result(result_a_tmp) );mul_module #(.A_W(B_W),.B_W(C_W)) mul_4_2(.clk (clk ),.rst_n (rst_n ),.mul_a (din_b ),.mul_b (sel_dout ),.mul_result(result_b_tmp) ); always@(*)beginif(sel)sel_dout = din_c;elsesel_dout = din_d;endalways@(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginsel <= 1'b0;endelse beginsel <= sel_a && sel_b;endendendmodule
FPGA学习(第5节)-看电路图写出Verilog代码(乘法运算+自加一+模块实例化等)相关推荐
- 如何写出“简单“代码?
如何写出"简单"代码? 当你做实际开发中,你一定会发现有人跟你说,或者你在网上看:要写简单代码要写简单代码. 这句话其实就跟大家熟悉的设计模式中的简单(kiss)原则是挂钩的 ...
- 优雅的写出 JavaScript 代码
目录 前言 避免使用 js 糟粕和鸡肋 编写简洁的 JavaScript 代码 使用 ES6/ES7 新特性 Babel ESLint Prettier 采用函数式编程 优雅的敲 JS 代码的几个原则 ...
- java 拼 变量名_你还用拼音为变量命名?新人OIer别傻了,教你写出优质代码
本篇文章适用语言:python,c++,Java.(其实我就是随便bb) 我们在编辑代码的时候,不免拿其他人的代码进行学习,或者将自己的代码拿给别人修改.这个时候,如何让别人快速读懂你的代码,是提升效 ...
- 大厂秘籍:谷歌代码规范开放下载,手把手教你写出好代码
这两天和一位大厂的朋友聊天,说起他们今年技术岗晋级答辩要增加代码走读环节,那该如何写出好看又好用的代码? 代码是程序员改变世界的工具,每个程序员都会写代码,但不一定能写出好代码. 如今的大型商业软件系 ...
- 哈哈哈,这个教人写出烂代码的项目在 GitHub 上火了...
如果说到什么是好代码,我们肯定都能说出一堆规则,例如使用一致的格式和缩进.使用清晰的变量名和方法名.在必要时提供文档与注释.不要过度精简代码等等. 但是对于什么是烂代码,你有比较清晰的认识吗? 在 G ...
- idea代码提示插件_IDEA 插件推荐 —— 让你写出好代码的神器!
概述 今天介绍的插件主要是围绕编码规范的.有追求的程序员,往往都有代码洁癖,要尽量减少代码的「坏味道」. 代码静态检查是有很多种类,例如圈复杂度.重复率等.业界提供了很多静态检查的插件来识别这些不合规 ...
- 写出漂亮代码的七种方法
首先我想说明我本文阐述的是纯粹从美学的角度来写出代码,而非技术.逻辑等.以下为写出漂亮代码的七种方法: 1.尽快结束 if 语句 例如下面这个JavaScript语句,看起来就很恐怖: functi ...
- 写出漂亮代码的45个小技巧
不知道大家有没有经历过维护一个已经离职的人的代码的痛苦,一个方法写老长,还有很多的if else ,根本无法阅读,更不知道代码背后的含义,最重要的是没有人可以问,此时只能心里默默地问候这个留坑的兄弟. ...
- 如何写出高性能代码(二)巧用数据特性
导语 同一份逻辑,不同人的实现的代码性能会出现数量级的差异: 同一份代码,你可能微调几个字符或者某行代码的顺序,就会有数倍的性能提升:同一份代码,也可能在不同处理器上运行也会有几倍的性能差异:十倍程序 ...
最新文章
- 【CSS】CSS前期回顾(2)
- Go语言(二)—基本概述
- SpringMVC_day1
- django.db.utils.OperationalError: (1049, Unknown database 'djangodb')
- CentOS安装tengine(淘宝服务器)
- linux 运行级别,linux执行流程 /etc/rc.d/init.d目录理解
- android 按钮变形动画,android-动画切换按钮
- 微软 Access数据库操作 中文教程
- JPEG 推荐的DC和AC系数的huffman(哈夫曼)码表
- 手机端输入框默认打开手机数字键盘
- 动态规划算法解Travelling Salesman Problem(TSP)问题
- IOS 改变导航栏颜色
- numpy中的ndarray方法和属性
- telnet测试136邮箱imap服务器
- 数睿数据的四域模型(软件=数据+形式)源何引发强烈关注?
- k型热电偶材料_k型热电偶工作原理及详细参数
- 内存颗粒和闪存颗粒的区别_闪存颗粒到底是何物?浅析闪存及制程
- c语言中转向的指针,C语言指针碎碎念
- mysql 时间盲注语句,sql注入学习记录(5)-基于时间延迟的SQL盲注
- JavaScript编程精粹
热门文章
- python批量将excel转成pdf_使用Python转换PDF,Word/Excel/PPT/md/HTML都能转!
- 全球三大设计奖之一“IDEA奖”公布,富士无反数码相机X100V获铜奖
- 【图像增强】人工多重曝光融合AMEF图像去雾【含Matlab源码 1916期】
- 马云:每个人都把我当靶子 已2个多月没去总部
- 臻色调女装品牌女装:专家为你揭开神秘面纱
- java个人通讯录系统_JSP个人通讯录系统
- Linux中数据库备份和恢复
- PreferenceManager被弃用,用什么替代
- 你怎么知道我什么都不会
- 虚拟机 VMware Workstation 中使用大白菜U盘启动安装操作系统方法