Vivado HDL编写示例

vivado 软件提供了hdl编写中常用的示例,旨在帮助初学者更好地理解和掌握hdl编程,这里分享一下verilog代码示例。
一、触发器、寄存器与锁存器vivado综合工具根据hdl代码会选择4种寄存器原语:
fdce:带有时钟使能和异步清0的d触发器;fdpe:带有时钟使能和异步预置(preset)的d触发器;fdse:带有时钟使能和同步置位的d触发器;fdre:带有时钟使能和同步复位的d触发器;触发器是一种存储器件,可以用来存储一个二进制位。 常见的触发器有d触发器、jk触发器、t触发器等。
module dff( input clk, input reset, input d, output reg q);always @(posedge clk or posedge reset) begin if (reset) begin q <= 0; end else begin q <= d; endendendmodule寄存器是一种广泛使用的存储器件,可以在时序逻辑中存储多个比特位,通常由触发器或d触发器等逻辑单元实现。 一个寄存器需要同时包含时钟、使能和数据输入端口。
module register( input clk, input enable, input [7:0] d, output reg [7:0] q);always @(posedge clk) begin if (enable) begin q <= d; endendendmodulevivado综合会报告检测出的锁存器(latches),这些锁存器是由组合逻辑hdl代码设计错误引起的,比如if或case状态不完整。 综合会为检测出的锁存器报告一个warning(synth 8-327)。
module latches ( input a, input b, input clr, output reg q);always @ * if(clr) q = a; else if(g) q = b;endmodule二、三态缓冲器三态缓冲器是一种带有使能控制的存储器件,允许多个设备共享同一个总线信号。 当三态缓冲器的使能信号为高时,它就会输出输入信号; 当使能信号为低时,它就会将输出信号设置为高阻(高阻状态)。
module tristate_buffer( input enable, input [7:0] data_in, output reg [7:0] data_out, inout [7:0] bus);assign bus = enable ? data_out : 8'bz;always @(bus, enable) begin if (enable) begin data_out 0; i--) begin reg_data[i] <= reg_data[i-1]; end reg_data[0] <= data_in;endassign data_out = reg_data[7];endmodule四、乘法器乘法器是一种数学运算器件,可以在fpga设计中进行数字乘法。 乘法器在数码信号处理器中非常常见,在数字信号处理、滤波器和音频编解码器等领域有广泛的应用。
vivado综合时会根据实际情况,确定是用lut实现,还是用dsp实现,建议使用乘法时,计算结果输出多打两拍,有助于改善时序。
module multiplier_unsigned( input clk, input [7:0] a, input [7:0] b, output reg signed [15:0] c);always @(posedge clk) begin c <= a * b;endendmodule五、黑盒子fpga设计支持edif网表,可以在hdl源代码中使用black_box属性完成实例化,该实例将被视作黑盒子。
//模块定义(* black_box *) module black_box( input in1, in2, output dout); //此处省略代码endmodule//模块实例化module black_box( input di_1, di_2, output dout);//模块调用black_box u_black_box ( .in1(di_1), .in2(di_2), .dout(dout));endmodule六、fsm状态机vivado综合时可以从rtl源码中提取出有限状态机(fsm)逻辑,支持moore和mealy型状态机。 一个状态机由状态寄存器、下一个状态功能、输出功能三部分组成。
module fsm( input clk, input reset, input [1:0] state_in, output reg [1:0] state_out);parameter state_a = 2'd0;parameter state_b = 2'd1;parameter state_c = 2'd2;reg [1:0] state_reg;always @(posedge clk) begin if (reset) begin state_reg <= state_a; end else begin case (state_reg) state_a: state_reg <= state_b; state_b: state_reg <= state_c; state_c: state_reg <= state_a; default: state_reg <= state_a; endcase endendassign state_out = state_reg;endmodule

2G物联网业务迁移势在必行
空中作业新势力——基于飞凌嵌入式RK3588核心板的无人机主控方案
10月新能源车销量大幅度上涨,纯电动汽车销均7.7万辆
激光气体探测器:工业安全的新卫士
智能手机也能测量血压?
Vivado HDL编写示例
有什么性价比高的运动蓝牙耳机值得推荐?双十一运动装备必选!
华为余承东表态不进入家电领域,只围绕全场景智慧消费者业务
机械革命S2笔记本开启预售,游戏性能比上代提升约20%
使用充电器和开关电源给电瓶充电时的注意事项
以太网接口10-100Base-T引脚定义
电路板温度测试
5G取代WiFi?应该互补共生
今日看点丨联发科天玑 9300 旗舰 5G 生成式 AI 移动芯片正式发布;古尔曼:苹果明年将更新整个iPad产品线
飞思卡尔推出首个加快和简化软件开发的汽车微控制器产品线S32K
长安携手华为、宁德时代联合打造一个全新高端智能汽车品牌
Surface Book2怎么样?Surface Book2上手评测 硬件才是重点
小米6首曝:重点是没有大黑边了,用电容指纹?
水电站下泄生态流量在线监测系统解决方案介绍
电子元器件基本知识