名称:基于FPGA的数据位宽转换器设计Verilog代码VIVADO仿真(文末获取)
软件:VIVADO
语言:Verilog
代码功能:
.请用 verilog设计如下电路,输入8bit数据,输出16bit数据,数据有效用 da vld,dbvd表示。
1)clkb是clka的二分频时钟,图示仅为示意图
Note: clock同步,但是需要考虑二分频相对 da vld拉高有两种情况。
2)数据长度不定,如果是偶数个数据,直接拼接输出,如果是奇数个数据,最后一个数据高8位输出8′h55
3)两次传输(davd拉高)的时间间隔足够长。
4)dbvd拉高的时序请自行设计,图示仅为示意图
5)所用资源越少越好
1. 程序文件
2. 程序编译
3. Testbench
4. 仿真图
输入偶数个数时
输入奇数个数时
包含程序内部变量的仿真图(偶数输入)
包含程序内部变量的仿真图(奇数输入)
部分代码展示:
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2019/08/29 21:02:46 // Design Name: // Module Name: data_conversion // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module data_conversion( input clka, input clkb, input rst_n, input da_vld, input [7:0] da, output reg db_vld, output reg [15:0] db ); reg da_vld_sync=0; reg [7:0] da_sync=8'd0; //将输入信号同步于clka always@(posedge clka) begin da_vld_sync<=da_vld; da_sync<=da; end reg data_cnt=0;//数据计数,用于判断输入数据的高位低位和奇偶 always@(posedge clka or negedge rst_n) if(!rst_n) data_cnt<=0;//复位 else if(da_vld_sync) data_cnt<=~data_cnt;//data_cnt为1是对应高位位置,为0时对应低位位置 else data_cnt<=0; reg [7:0] da_sync_delay=8'd0; //将da_sync延迟以周期,移到低位 always@(posedge clka) da_sync_delay<=da_sync; reg [15:0]db_data=16'd0; reg db_data_vld=0; reg db_data_vldbuf=0; //数据高低位组合到一起 always@(posedge clka) if(data_cnt==1 && da_vld_sync==1)begin//若data_cnt==1 && da_vld_sync==1表示为正常高位低位 db_data<={da_sync,da_sync_delay}; end else if(data_cnt==1 && da_vld_sync==0)begin//若data_cnt==1 && da_vld_sync==0表示最后一个数为奇,高位用8'h55表示 db_data<={8'h55,da_sync_delay}; end else db_data<=16'bz;//否则输出高阻状态 //将da_vld_sync结果2级触发器延迟2周期得到db_data_vld always@(posedge clka) begin db_data_vldbuf<=da_vld_sync; db_data_vld<=db_data_vldbuf; end //将db_data_vld同步于clkb always@(posedge clkb) if(db_data_vld) db_vld<=1; else db_vld<=0;
源代码
扫描文章末尾的公众号二维码