调一个cpld小板

来源:互联网 发布:python数据分析 视频 编辑:程序博客网 时间:2024/05/16 05:53

通过一个小项目,演示工程创建->仿真->下载的整个流程,涉及QuartusII,ISE,ModelSim的使用。

起因

刚刚帮朋友调了一个cpld小板,正好可以当做例程,把开发流程记录一下。

注:下面的项目需求经过了改造,不同于真实的项目需求

项目示例

原理图

这里写图片描述

系统输入信号:

  1. 时钟
  2. 8位宽总线
  3. 总线地址写使能
  4. 总线数据写使能
  5. 8位宽地址,接板上的拨码开关

系统输出信号:

  1. 8位并口输出

功能描述

此cpld小板作为执行器,应用时会有多个cpld挂在同一条总线上,外部有控制器。控制器每次发送一个8位地址,后跟一个8位数据,分别对应地址写使能和数据写使能。cpld小板的地址由拨码开关设定,当地址匹配时,保存数据,在延时一段时间后以数据为初始计数值递减,直至为0,改计数值就是cpld的输出。

Verilog HDL 程序

top_level.v

module top_level(clk, wa, wd, id, bus, out);input clk, wa, wd;input[7:0] id;input[7:0] bus;output[7:0] out;reg[7:0] out;reg[1:0] wa_buf;reg[1:0] wd_buf;reg id_match;reg[3:0] dly_cnt;initialbegin  out = 0;  wa_buf = 0;  wd_buf = 0;  id_match = 0;  dly_cnt = 0;endalways @(posedge clk)begin    wa_buf[0] <= wa;    wa_buf[1] <= wa_buf[0];    wd_buf[0] <= wd;    wd_buf[1] <= wd_buf[0];endalways @(posedge clk)begin    if ((id==bus)&&(wa_buf==2'b10))        id_match <= 1'b1;    else if (dly_cnt[3:0] == 4'b0001)        id_match <= 1'b0;               else        id_match <= id_match;endalways @(negedge clk)begin    if ((id_match==1'b1)&&(wd_buf==2'b10))        dly_cnt <= 4'b1001;    else if (dly_cnt == 0)        dly_cnt <= 0;    else        dly_cnt <= dly_cnt - 1;endalways @(negedge clk)begin    if ((id_match==1'b1)&&(wd_buf==2'b10))            out <= bus;    else if ((dly_cnt <= 4'b0010)&&(out != 0))            out <= out - 1;    else            out <= out;endendmodule

test.v

`timescale 1ns/1nsmodule test;  reg clk_in, wa, wd;  reg[7:0] id;  reg[7:0] bus;  wire[7:0] out;  initial   begin    wa = 1;    wd = 1;    clk_in = 1;    bus[7:0] = 8'b00000000;    //拨码开关    id[7:0] = 8'b00000000;    //测试1:错误地址    //总线    #100    bus[7:0] = 8'b00000001;      //写地址    #100    wa = 0;    #100    wa = 1;    //总线    #200    bus[7:0] = 8'b01010101;        //写数据    #100    wd = 0;      #100    wd = 1;    //测试2:正确地址,计数值为0x55    //总线    #100    bus[7:0] = 8'b00000000;     //写地址    #100    wa = 0;    #100    wa = 1;    //总线    #200    bus[7:0] = 8'b01010101;     //写数据       #100    wd = 0;      #100    wd = 1;    //写地址    #100    wa = 0;    #100    wa = 1;    //测试3:正确地址,计数值为0x0f    //总线    #200    bus[7:0] = 8'b00001111;       //写数据     #100    wd = 0;      #100    wd = 1;           end  always #50 clk_in <= ~clk_in;    top_level obj(clk_in, wa, wd, id, bus, out);endmodule

仿真(ModelSim SE 10.0c)

启动画面

初始界面

新建library,名称默认为work
这里写图片描述

这里写图片描述

这里写图片描述

新建project添加到work库,名称随意
这里写图片描述

这里写图片描述

因为已经准备好了top_level.v和test.v两个文件,选择“添加已存在文件”
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

添加完成,注意左下角的2个标签页,当前处于project
这里写图片描述

双击文件名可以打开编辑窗口
这里写图片描述

文件名上右键,选择编译;可以编译选中文件、全部文件、查看报表;当编译出现错误时应查看报表
这里写图片描述

编译成功后,文件状态为绿色对勾,下面的脚本窗口也有文本提示
这里写图片描述

选择library标签页,展开work库,选中test并右键选择Simulate
这里写图片描述

上述操作后会打开很多新界面。
在Objects页面内,是仿真对象的信号,全选,右键添加到Wave窗口
这里写图片描述

simulate工具条改为4 us,并run
这里写图片描述

得到仿真时序
这里写图片描述

下载(ISE Design Suite 14.7)

待整理

下载(Quartus II 11.0)

待整理

0 0
原创粉丝点击