基于FPGA的数据位宽转换器设计Verilog代码VIVADO仿真

名称:基于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)所用资源越少越好

QQ图片20240612102259.png

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;

        

源代码

 扫描文章末尾的公众号二维码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值