【Verilog HDL 训练】第 12 天(数据通路)
数据通路。
y = func(a,b)
func可以是加法,减法,乘法,比较,移位,舍入,饱和等。
分别针对有符号数,无符号数的情况。
提示:可以参考synopsys的一篇文档 https://t.zsxq.com/QF6QNju
加法:
- 对于无符号数而言:
module arithmetic(input [3:0] a,input [3:0] b,output [4:0] res_sum, //加output [3:0] res_sub, //减output [7:0] res_pro, //乘//output [3:0] res_comp, //比较output [3:0] right_shift //右移);assign res_sum = a + b;assign res_sub = a - b;assign res_pro = a * b; //assign res_com = assign right_shift = a>>3; //逻辑右移wire [3:0] right_shift_a; //算术右移结果assign right_shift_a = a>>>3; endmodule
测试文件:
module arithmetic_tb(
);reg clk;reg [3:0] a;reg [3:0] b;wire [4:0] res_sum; //加wire [3:0] res_sub; //减wire [7:0] res_pro; //乘//wire [3:0] res_comp, //比较wire [3:0] right_shift; //右移initial beginclk = 0;forever # 2 clk = ~clk;endinitial begina = 4'b1011;b = 4'b1001;#10a = 4'b1001;b = 4'b0111;endarithmetic u0(.a(a),.b(b),.res_sum(res_sum),.res_sub(res_sub),.res_pro(res_pro),.right_shift(right_shift));endmodule
行为仿真时序图:
对于无符号数,逻辑右移和算术右移是一样的,都是高位补零。
- 对于有符号数而言:
module arithmetic(input signed [3:0] a,input signed [3:0] b,output signed [4:0] res_sum, //加output signed [3:0] res_sub, //减output signed [7:0] res_pro, //乘output signed [3:0] right_shift //右移);assign res_sum = a + b;assign res_sub = a - b;assign res_pro = a * b; //assign res_com = assign right_shift = a>>3; //逻辑右移wire [3:0] right_shift_a; //算术右移结果assign right_shift_a = a>>>3; endmodule
测试文件同上!
仿真波形:
可以看出,对于有符号数,逻辑右移和算术右移结果不一样,逻辑右移依然是补零,算术右移则补符号位。
但对于有符号数的加法规则如何?
例如上述仿真:1001 + 0111 为什么等于 00000?
也就是-1 + 7 = 0?
得到了答案:
1001是补码的形式,原码是1111,也就是-7,这样的话就是-7+7=0,也符合道理了。
【Verilog HDL 训练】第 12 天(数据通路)相关推荐
- 【Verilog HDL 训练】第 11 天(分频电路)
设计一个占空比50%的三分频电路. 针对这个分频器,博文的末尾会给出一个反面教材,这是我上次写的一个分频器,看起来很好,其实是不能综合的.针对其中的错误,我令立博文记录之:[ Verilog ]alw ...
- 【Verilog HDL 训练】第 06 天(边沿检测)
1. 复习verilog语法 [选做题] - reg和wire的区别 寄存器数据类型 Verilog中规定,凡是在程序块中被赋值的变量,都必须是寄存器类型的.(程序块:例如always块) 这里未免还 ...
- 【Verilog HDL 训练】第 04 天(竞争、冒险、译码等)
1. 什么是竞争和冒险? 记得我刚学FPGA那会,恶补基础知识,其中之一就是竞争与冒险,我参考了<FPGA之道>,记录了几篇博客: [ FPGA ]组合逻辑中的竞争与险象问题(一) 第一篇 ...
- 【Verilog HDL 训练】第 14 天(glitch-free的两个时钟切换电路)
2019年5月13日 glitch-free的两个时钟切换电路. 可以看到这是一个星期之前的题目了,现在才抽空做,把这篇颠倒个顺序吧,也是最后一天了,以后的题目都是讨论性质的,不会以第多少天的形式来写 ...
- 【Verilog HDL 训练】第 13 天(存储器、SRAM)
存储器. 1. rom,ram,flash,ddr,sram,dram,mram..列举并解释一下这些名词. 2. 用verilog实现一个深度为16,位宽8bit的单端口SRAM.搭建一个仿真环境, ...
- 【Verilog HDL 训练】第 10 天(PWM 呼吸灯)
5月8日 PWM 用verilog实现PWM控制呼吸灯.呼吸周期2秒:1秒逐渐变亮,1秒逐渐变暗.系统时钟24MHz,pwm周期1ms,精度1us. 今天的题目我是第一次见,答案借鉴大神的:Veril ...
- 【Verilog HDL 训练】第 09 天(按键消抖)
5月7日 按键防抖 1. 用verilog实现按键抖动消除电路,抖动小于15ms,输入时钟12MHz. 在编写Verilog代码之前,先分析下一些前提问题,首先是几个按键(1个,多个),我们以1个和三 ...
- 【Verilog HDL 训练】第 08 天(二进制、Johnson、环形计数器)
5月6日 计数器 1. 用verilog实现一个4bit二进制计数器. a) 异步复位 b) 同步复位 input clk, rst_n; output [3:0] o_cnt; Verilog实现代 ...
- 【Verilog HDL 训练】第 07 天(串并转换)
串并转换 1. 复习verilog语法 [选做题] - 文件操作fopen fdisplay fwrite fclose - 生成随机数 random - 初始化 readmemh readmemb ...
最新文章
- 利用Redis进行全页面缓存的简单Demo
- ORA-01092: ORACLE 例程终止 强行断开连接
- 为Openshift + MongoDb应用程序编写验收测试
- java人种_实在看不出藏族有大量矮黑血统
- 应用程序、虚拟目录、应用程序池
- iOS开发之oc(五)--成员变量(实例变量)
- matlab 三维点 边界曲面,不用matlab如何从散点数据绘制极坐标三维曲面图?
- 关于CSplitterWnd类窗口静态分割总结
- mac iterm 怎么搜索不能输入_Mac高效开发之iTerm2、Prezto和Solarized主题
- Physical Standby Database Failover
- 前后端分离项目,标准json协议格式参考
- 关于win7系统重装完鼠标不能用的解决办法
- php抓取微信文章图片保存到本地
- Unity 多点触控 禁用与启用
- 机器学习及SparkMLlib简介
- Git原理杂谈之pull/push命令
- 什么是内存对齐?如何计算内存对齐?为什么要内存对齐?
- 迅捷fw150服务器无响应,Fast迅捷FW150RM无线路由器Client客户端模式怎么设置
- RabbitMQ流量削峰应用
- javascript获取手机键盘的高度