VerilogHDL负责数字电路设计(AI助学版)课件_第1页
VerilogHDL负责数字电路设计(AI助学版)课件_第2页
VerilogHDL负责数字电路设计(AI助学版)课件_第3页
VerilogHDL负责数字电路设计(AI助学版)课件_第4页
VerilogHDL负责数字电路设计(AI助学版)课件_第5页
已阅读5页,还剩11页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

18.4AI分析代码提问:按照文件“提问5-CPU接口电路代码.docx”要求,进行代码分析,并给出仿真代码。Intel接口地址复用模式的数据读写仿真条件:CPUInterface的D和A两个引脚连接CPU的复用引脚A。1)reset信号1000ns的高电平;2)通过写操作分别向reg0~reg7写入8组数据:02、03、04、05、06、07、0A、FF;3)通过读操作将写入到寄存器reg0~reg7中的数据读出。Intel接口下微处理器的写时序图AI给出接口模块修正方法,sel_int模块中wr信号逻辑存在问题。原代码assignwr=CSB|WRB会导致写信号无效,修正为:assignwr=~(CSB|WRB);//当CSB和WRB均为低时,wr=1从图中看出,AI给出接口模块修正方法是错误的!!!再次提问:写是在wr的上升沿,因此不能改成:assignwr=~(CSB|WRB);AI给出接口模块修正方法:AI关键修正点sel_int模块中的wr信号逻辑修正:原代码中assignwr=CSB|WRB无法正确反映写使能条件。正确的逻辑应为:当CSB=0且WRB从低变高(上升沿)时,生成写脉冲。由于Verilog组合逻辑难以直接检测边沿,需在main_r模块中直接使用WRB的上升沿并结合CSB状态。main_r模块的敏感列表修正:将触发条件改为WRB的上升沿,并添加CSB状态判断。修正后的Verilog代码sel_int模块(移除wr信号)

modulesel_int(CSB,RDB,WRB,rd);inputCSB,RDB,WRB;outputrd;assignrd=~(CSB|RDB);//读使能逻辑保持不变endmodulemain_r模块(直接使用WRB上升沿)modulemain_r(latch_A,WRB,CSB,D_in,reg_o,reset);inputreset,WRB,CSB;input[7:0]D_in,latch_A;output[7:0]reg_o;reg[7:0]reg0,reg1,...,reg7;//寄存器定义//地址解码逻辑(保持不变)wireaddr0=(latch_A==0);//...其他addr信号//写操作触发条件:WRB上升沿且CSB=0always@(posedgeWRBorposedgereset)beginif(reset)beginreg0<=8'b0;//...其他寄存器复位endelseif(!CSB)begin//CSB=0时允许写入case(1'b1)addr0:reg0<=D_in;addr1:reg1<=D_in;//...其他寄存器endcaseendend//读逻辑(保持不变)always@(*)begincase(latch_A)0:reg_o=reg0;//...其他地址endcaseendendmodule比较合理!!!要与AI互动学习18.5AI修改电路文件test.v为IntelCPU接口电路,让AI在代码中增加8个控制寄存器。提问AI:按照文件“test.v”的格式,增加8个控制寄存器。modulemain_r(latch_A,wr,D_in,reg_o,reset);inputreset,wr;input[7:0]D_in,latch_A;output[7:0]reg_o;reg[7:0]reg0,reg1,reg2,reg3,reg4,reg5,reg6,reg7,reg8,reg9,reg10,reg11,reg12,reg13,reg14,reg15,reg_o;wireaddr0,addr1,addr2,addr3,addr4,addr5,addr6,addr7,addr8,addr9,addr10,addr11,addr12,addr13,addr14,addr15;//地址解码逻辑扩展(新增addr8~addr15)assignaddr0=(latch_A==0)?1:0;assignaddr1=(latch_A==1)?1:0;assignaddr2=(latch_A==2)?1:0;assignaddr3=(latch_A==3)?1:0;assignaddr4=(latch_A==4)?1:0;assignaddr5=(latch_A==5)?1:0;assignaddr6=(latch_A==6)?1:0;assignaddr7=(latch_A==7)?1:0;assignaddr8=(latch_A==8)?1:0;//新增assignaddr9=(latch_A==9)?1:0;assignaddr10=(latch_A==10)?1:0;assignaddr11=(latch_A==11)?1:0;assignaddr12=(latch_A==12)?1:0;assignaddr13=(latch_A==13)?1:0;assignaddr14=(latch_A==14)?1:0;assignaddr15=(latch_A==15)?1:0;//寄存器写入逻辑扩展(新增reg8~reg15的always块)always@(posedgewrorposedgereset)beginif(reset)reg0<=8'b0000_0000;elseif(addr0)reg0<=D_in;end//...原有reg1~reg7的always块(略)...//新增reg8~reg15的写入逻辑always@(posedgewrorposedgereset)beginif(reset)reg8<=8'b0000_0000;elseif(addr8)reg8<=D_in;endalways@(posedgewrorposedgereset)beginif(reset)reg9<=8'b0000_0000;elseif(addr9)reg9<=D_in;endalways@(posedgewrorposedgereset)beginif(reset)reg10<=8'b0000_0000;elseif(addr10)reg10<=D_in;endalways@(posedgewrorposedgereset)beginif(reset)reg11<=8'b0000_0000;elseif(addr11)reg11<=D_in;endalways@(posedgewrorposedgereset)beginif(reset)reg12<=8'b0000_0000;elseif(addr12)reg12<=D_in;endalways@(posedgewrorposedgereset)beginif(reset)reg13<=8'b0000_0000;elseif(addr13)reg13<=D_in;endalways@(posedgewrorposedgereset)beginif(reset)reg14<=8'b0000_0000;elseif(addr14)reg14<=D_in;endalways@(posedgewrorposedgereset)beginif(reset)reg15<=8'b0000_0000;elseif(addr15)reg15<=D_in;end//输出选择逻辑扩展(新增addr8~addr15的case项)always@(*)begincase(1'b1)addr0:reg_o=reg0;addr1:reg_o=reg1;addr2:reg_o=reg2;addr3:reg_o=reg3;addr4:reg_o=reg4;addr5:reg_o=reg5;addr6:reg_o=reg6;addr7:reg_o=reg7;addr8:reg_o=reg8;//新增addr9:reg_o=reg9;addr10:reg_o=reg10;addr11:reg_o=reg11;addr12:reg_o=reg12;addr13:reg_o=reg13;addr14:reg_o=reg14;addr15:reg_o=reg15;default:reg_o=8'b0000_0000;endcaseendendmodule`timescale1ns/1psmoduletest_tb;

//输入信号regreset,CSB,RDB,WRB,ALE;reg[7:0]A;wire[7:0]D;

//双向数据总线控制reg[7:0]D_driver;assignD=(!CSB&&!RDB)?8'hzz:D_driver;

//实例化被测模块CPUInterfaceuut(.reset(reset),.CSB(CSB),.RDB(RDB),.WRB(WRB),.A(A),.D(D),.ALE(ALE));

//时钟和复位初始化initialbeginreset=1;CSB=1;RDB=1;WRB=1;ALE=0;A=0;D_driver=8'hzz;#20reset=0;#1000$finish;end

//测试用例initialbegin$dumpfile("test_tb.vcd");$dumpvars(0,test_tb);

//测试1:复位后寄存器清零#30;verify_reset();//测试2:写入地址8~15并验证test_write_read(8,8'hAA);test_write_read(9,8'h55);test_write_read(10,8'hF0);test_write_read(11,8'h0F);test_write_read(12,8'hCC);test_write_read(13,8'h33);test_write_read(14,8'h99);test_write_read(15,8'h66);

//测试3:非法地址读取(地址16)test_invalid_address(16);$display("Alltestspassed!");$finish;end

//任务:验证复位后寄存器为0taskverify_reset;beginfor(integeri=0;i<=15;i=i+1)beginread_register(i);if(D!==8'h00)begin$error("Resetfailedataddr%d:D=0x%h",i,D);$finish;endendendendtask

//任务:写入并验证寄存器tasktest_write_read;input[7:0]addr;input[7:0]data;begin

//写入操作ALE=1;A=addr;#10ALE=0;CSB=0;WRB=0;D_driver=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论