2132|0

14

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Uart_ram_HEX [复制链接]


11-07uart_ram_hex.pdf (652.43 KB, 下载次数: 7)


一、要求
从上位机发送256byte的数据,将数据存到ram中,ram的深度为256位宽为8位,然后每隔0.5sram中把数据读出,发送回上位机,同时显示在数码管上。

二、Top-Down设计框图
1、总体框图
  
file:///C:/Users/wwt/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png
  

2uart_rxHEX6uart_tx模块
本模块的详细设计见:《11-05基于rs232的异步串口通信》。file:///C:/Users/wwt/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png

3ram_ctrl模块时序图
  
file:///C:/Users/wwt/AppData/Local/Temp/msohtmlclip1/01/clip_image006.png
  

三、ram_ctrl模块代码
  
module ram_ctrl(
  
       input       wire              sclk,
  
       input       wire              rst_n,
  
       input       wire              wr_en,//写使能
  
       input       wire  [7:0]        pi_data,//输入ram中的数据
  
      
  
       output      wire  [7:0]        po_data,//输出的数据
  
       output      reg   [23:0]      po_hex_data,//输出HEX6的数据
  
       output      reg               po_data_end//输出数据标志信号
  
);
  
  
parameter   CNT_05S_END = 25'd24_999_999;//0.5s计数最大值
  
  
reg   [7:0]       wr_addr;//ram写地址
  
reg   [7:0]       rd_addr;//ram读地址
  
  
reg                cnt_start;//开始计数标志
  
reg   [24:0]      cnt_05s;//0.5s计数器
  
reg                cnt_05s_flag;//0.5秒计数器标志信号用于ram读地址的++
  
  
ram_256_8 ram_256_8_inst (
  
  .clka     (sclk        ), // input clka
  
  .wea      (wr_en       ), // input [0 : 0] wea
  
  .addra    (wr_addr     ), // input [7 : 0] addra
  
  .dina     (pi_data     ), // input [7 : 0] dina
  
  .clkb     (sclk        ), // input clkb
  
  .addrb    (rd_addr     ), // input [7 : 0] addrb
  
  .doutb    (po_data     ) // output [7 : 0] doutb
  
);
  
  
//0.5s开始计数控制信号
  
always@(posedge sclk or negedge rst_n)
  
       if(!rst_n)
  
             cnt_start <= 1'b0;
  
       else if(cnt_05s_flag==1'b1 && rd_addr==8'd255)
  
             cnt_start <= 1'b0;
  
       else if(wr_en == 1'b1)
  
             cnt_start <= 1'b1;            
  
  
//0.5s计数
  
always@(posedge sclk or negedge rst_n)
  
       if(!rst_n)
  
             cnt_05s <= 'd0;
  
       else if(cnt_05s == CNT_05S_END)
  
             cnt_05s <= 'd0;   
  
       else if(cnt_start == 1'b1)
  
             cnt_05s <= cnt_05s + 1'b1;   
  
            
  
//0.5s计数完成标志信号产生  用于读地址的++
  
always@(posedge sclk or negedge rst_n)
  
       if(!rst_n)  
  
             cnt_05s_flag <= 1'b0;
  
       else if(cnt_05s == CNT_05S_END)
  
             cnt_05s_flag <= 1'b1;
  
       else
  
             cnt_05s_flag <= 1'b0;
  
//ram写地址
  
always@(posedge sclk or negedge rst_n)
  
       if(!rst_n)  
  
             wr_addr <= 'd0;
  
       else if(wr_en)
  
             wr_addr <= wr_addr + 1'b1;   
  
            
  
//ram读数据的标志产生
  
always@(posedge sclk or negedge rst_n)
  
       if(!rst_n)  
  
             rd_addr <= 'd0;
  
       else if(rd_addr=='d255 && cnt_05s_flag==1'b1)
  
             rd_addr <= 'd0;
  
       else if(cnt_05s_flag)
  
             rd_addr <= rd_addr + 1'b1;                                 
  
                  
  
//ram的数据输出标志
  
always@(posedge sclk or negedge rst_n)
  
       if(!rst_n)  
  
             po_data_end <= 1'b0;
  
       else
  
             po_data_end <= cnt_05s_flag;
  
  
//输出HEX6的数据
  
always@(posedge sclk or negedge rst_n)
  
       if(!rst_n)
  
             po_hex_data <= 'hffffff;
  
       else
  
             po_hex_data <= {po_data[3:0],po_data[7:4],16'h0000};  
  
      
  
endmodule
  

四、ram_ctrl的测试脚本
1、脚本
  
`timescale 1ns/1ns
  
  
module tb_ram_ctrl();
  
  
       reg               sclk;
  
       reg               rst_n;
  
       reg               wr_en;//写使能
  
       reg   [7:0]        pi_data;//输入ram中的数据
  
      
  
       wire  [7:0]        po_data;//输出的数据
  
       wire              po_data_end;//输出数据标志信号
  
  
defparam ram_ctrl_inst.CNT_05S_END = 1000;
  
  
ram_ctrl ram_ctrl_inst(
  
       .sclk             (sclk             ),
  
       .rst_n            (rst_n            ),
  
       .wr_en            (wr_en            ),//写使能
  
       .pi_data          (pi_data          ),//输入ram中的数据
  
  
       .po_data          (po_data          ),//输出的数据
  
       .po_data_end      (po_data_end      )//输出数据标志信号
  
);
  
  
initial sclk = 1;
  
always #10 sclk = ~sclk;
  
  
initial begin
  
       rst_n <= 0;
  
       wr_en <= 0;
  
       pi_data <= 0;
  
       #25;
  
       rst_n <= 1;
  
       #500;
  
       gen_data();
  
end   
  
  
always begin
  
       wr_en <= 0;
  
       #500;
  
       wr_en <= 1;
  
       #20;
  
end   
  
  
task gen_data();
  
       integer     i;
  
       for(i=0;i<256;i=i+1)begin
  
             #500
  
             pi_data <= 255-i;
  
       end   
  
endtask
  
  
endmodule
  

2do脚本
  
#退出工程
  
quit -sim
  
#清屏
  
.main clear
  
#建立工程
  
vlib work
  
#编译工程
  
vlog ./tb_ram_ctrl.v
  
vlog ./ram_256_8.v
  
vlog ./BLK_MEM_GEN_V7_3.v
  
vlog ./../design/*.v
  
vsim -novopt  work.tb_ram_ctrl
  
add wave tb_ram_ctrl/ram_ctrl_inst/*
  
run 300us
  


此帖出自FPGA/CPLD论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表