📄 at96.v
字号:
`timescale 1 ns / 1 nsmodule at96( clk,rst, ior,iow,memr,memw,bus_data,bus_addr,aen, //at96 bus sig doe,dir, //4245 control sig av_rd,av_bus_data,av_bus_addr, //a type monitor interface sig tvchk_bus_data, //tv check sig tv_irda_alter_data, //tv irda alternate sig flash_addr,flash_data,flash_ce,flash_oe,flash_we, //zhiku flash interface sig ad_a_data,ad_b_data,ad_c_data, //stick ad sample data sw_data, //switch input wd_data, //watch dog io register flash_state, dis_switch); //system clk and reset signalinput clk; //40minput rst;//the next port declaration is the isa_bus signalinput ior; //at96 bus io read strobe siginput iow; //at96 bus io write strobe siginput memr; //at96 bus memory read strobeinput memw; //at96 bus memroy write strobeinput aen; //at96 bus dma operation strobeinout [7:0] bus_data; //at96 data businput [23:0] bus_addr; //at96 address bus//4245 control signaloutput doe; //4245 oe sigoutput dir; //4245 director sig //a type display dram interface signaloutput av_rd; //a type monitor dram read strobeoutput [11:0] av_bus_addr; //a type monitor dram address businput [7:0] av_bus_data; //a type monitor dram data bus//tv check data input input [7:0] tvchk_bus_data; //tv check data input io reg//tv irda alternate output control wordoutput [7:0] tv_irda_alter_data; //tv irda alternate output io reg//switch input register input [7:0] sw_data;//flash state io registerinput [7:0] flash_state;//watch dog out io registeroutput [7:0] wd_data;reg [7:0] wd_data;//zhiku flash operation portoutput [19:0] flash_addr; //flash address businout [7:0] flash_data; //flash data busoutput flash_ce; //flash chip selectoutput flash_oe; //flash read strobeoutput flash_we; //flash write strobe//stick ad sample data input portinput [7:0] ad_a_data; //8255 a port,inputinput [7:0] ad_b_data; //8255 b port,inputinput [7:0] ad_c_data; //8255 c port,input//display switchoutput [2:0] dis_switch;reg [7:0] dis_switch_reg;//chip selce sigwire cs_w; //chip write strobe, used to strobe the input of the bidir bus(at96)wire cs; //chip select, used to strobe the 4245 (at96)wire cs_r; //chip read strobe, used to strobe the output of the bidir bus(at96)wire [2:0] out_sel; //output mux select of the bidir bus(at96)//at 96 bidir data bus mux and demuxreg [7:0] out_reg; //at 96 bidir data bus output muxwire [7:0] in_reg; //at 96 bidir data bus input demux//a type video regwire [7:0] av_mem_addr; reg av_rd;reg av_cs;reg [7:0] addr_ena;wire av_ena;reg memr1,memr2;//tv check reg signal wire [9:0] io_cs_addr; //io chip select address, 10 bit, a[9..0]//tv irda reg signal wire tv_irda_wr;reg [7:0] tv_irda_alter_data;//flash reg signalreg flash_ce_reg;reg zhiku_w_cs;reg zhiku_r_cs;wire [4:0] flash_cs_addr;reg [7:0] flash_we_reg;wire flash_wr_ena;reg [7:0] exp_addr_data;wire [7:0] zhiku_data;//io reg reg io_we; //io register write strobereg io_oe; //io register read strobewire mem_we; //memory write strobereg [7:0] io_data; //io registerreg ior1,ior2;//chip select addressparameter av_cs_addr = 8'he6; //a type monitor dram address spaceparameter tvchk_cs_addr = 10'h388; //tv check io register address spaceparameter tv_irda_alter_addr = 10'h38b; //tv irda alternate io register address spaceparameter zhiku_addr = 5'b11010; //zhiku flash address spaceparameter exp_cs_addr = 10'h2f7; //zhiku expandation address io register address spaceparameter ad_8255_a = 10'h240; //8255 a port io register address spaceparameter ad_8255_b = 10'h241; //8255 b port io register address spaceparameter ad_8255_c = 10'h242; //8255 c port io register address spaceparameter sw_addr = 10'h384; //swith input register(read only)parameter wd_addr = 10'h383; //watch dog io register (write only)parameter flash_state_addr = 10'h382; //flash state io register addressparameter addr_ena_addr = 10'h389; //av_addr encode enable io register addressparameter dis_switch_addr = 10'h38a; //dis_switch encode enable io register addressparameter flash_we_addr = 10'h381; //dis_switch encode enable io register address/*initial begin av_rd=0; av_cs=0; out_reg=8'b0; tv_irda_alter_wr=0; zhiku_r_cs=0; io_oe=0; io_we=0;end*///io reg write operationassign io_cs_addr = bus_addr[9:0]; assign dis_switch = dis_switch_reg[2:0]; always @(io_cs_addr or iow or aen) begin if(aen==0 && iow==0) case(io_cs_addr) tv_irda_alter_addr :io_we<=1; exp_cs_addr :io_we<=1; wd_addr :io_we<=1; addr_ena_addr :io_we<=1; dis_switch_addr :io_we<=1; flash_we_addr :io_we<=1; default :io_we<=0; endcase else io_we<=0;endalways @(negedge rst or posedge iow)begin if(rst==0) begin tv_irda_alter_data<=8'b0; exp_addr_data<=8'b0; wd_data<=8'b0; addr_ena<=8'b0; dis_switch_reg<=8'b0; flash_we_reg<=8'b0; end else if(aen==0) case(io_cs_addr) tv_irda_alter_addr :tv_irda_alter_data<=in_reg; exp_cs_addr :exp_addr_data<=in_reg; wd_addr :wd_data<=in_reg; addr_ena_addr :addr_ena<=in_reg; dis_switch_addr :dis_switch_reg<=in_reg; flash_we_addr :flash_we_reg<=in_reg; endcaseend//ior_reg signal generatealways @(negedge rst or negedge clk)begin if(rst==0) begin ior1<=0; ior2<=0; end else begin ior1<=ior; ior2<=ior1; endendalways @(negedge rst or negedge clk)begin if(rst==0) begin io_oe <= 0; end else if(!ior1 && ior2) begin if(aen==0) case(io_cs_addr) tvchk_cs_addr :io_oe<=1; ad_8255_a :io_oe<=1; ad_8255_b :io_oe<=1; ad_8255_c :io_oe<=1; sw_addr :io_oe<=1; flash_state_addr :io_oe<=1; dis_switch_addr :io_oe<=1; addr_ena_addr :io_oe<=1; default :io_oe<=0; endcase else begin io_oe<=0; end end //ior_reg<=1; else if(ior1 && !ior2) begin io_oe<=0; endendalways @(negedge rst or negedge clk)begin if(rst==0) begin io_data<=8'b1; end else if(!ior1 && ior2) begin if(aen==0) case(io_cs_addr) tvchk_cs_addr :io_data<=tvchk_bus_data; ad_8255_a :io_data<=ad_a_data; ad_8255_b :io_data<=ad_b_data; ad_8255_c :io_data<=ad_c_data; sw_addr :io_data<=sw_data; flash_state_addr :io_data<=flash_state; dis_switch_addr :io_data<=dis_switch_reg; addr_ena_addr :io_data<=addr_ena; default :io_data<=8'b1; endcase else begin io_data<=8'b1; end end //ior_reg<=1; else if(ior1 && !ior2) begin io_data<=8'b1; endend//io reg read operation/*always @(io_cs_addr or ior_reg or aen)begin if(aen==0 && ior_reg==1) case(io_cs_addr) tvchk_cs_addr :io_oe<=1; ad_8255_a :io_oe<=1; ad_8255_b :io_oe<=1; ad_8255_c :io_oe<=1; default :io_oe<=0; endcase else begin io_oe<=0; endendalways @(posedge ior_reg)begin if(aen==0) case(io_cs_addr) tvchk_cs_addr :io_data<=tvchk_bus_data; ad_8255_a :io_data<=ad_a_data; ad_8255_b :io_data<=ad_b_data; ad_8255_c :io_data<=ad_c_data; default :io_data<=8'b1; endcaseend*///a type monitor decoderassign av_bus_addr = bus_addr[11:0];assign av_mem_addr = bus_addr[19:12];assign av_ena = addr_ena[0];always @(negedge rst or negedge clk)begin if(rst==0) begin memr1<=1; memr2<=1; end else begin memr1<=memr; memr2<=memr1; endendalways @(negedge rst or negedge clk)begin if(rst==0) begin av_rd<=0; av_cs<=0; end else if(!memr1 && memr2) begin if(av_mem_addr==av_cs_addr && aen==0 && av_ena) begin av_rd<=1; av_cs<=1; end else begin av_rd<=0; av_cs<=0; end end else if(memr1 && !memr2) begin av_rd<=0; av_cs<=0; endend/*always @(av_mem_addr or av_rd or aen)begin if(av_mem_addr==av_cs_addr && av_rd==1 && aen==0) begin //av_rd<=1; av_cs<=1; end else begin //av_rd<=0; av_cs<=0; endend*//**************flash begin*******************/assign flash_cs_addr = bus_addr[19:15];assign flash_wr_ena = flash_we_reg[0];always @(flash_cs_addr or aen)begin if(flash_cs_addr==zhiku_addr && aen==0) flash_ce_reg<=1; else flash_ce_reg<=0;endassign flash_ce = !flash_ce_reg;always @(flash_cs_addr or memw or aen)begin if(flash_cs_addr==zhiku_addr && memw==0 && aen==0) zhiku_w_cs<=1; else zhiku_w_cs<=0;endalways @(flash_cs_addr or memr or aen)begin if(flash_cs_addr==zhiku_addr && memr==0 && aen==0) zhiku_r_cs<=1; else zhiku_r_cs<=0;endassign flash_oe = memr;assign flash_we = flash_wr_ena?memw:1;assign flash_addr = {exp_addr_data[4:0],bus_addr[14:0]};assign flash_data = zhiku_w_cs?in_reg:8'bz;assign zhiku_data = zhiku_r_cs?flash_data:zhiku_data;/**************flash end**************//******data bus output port begin*********/assign bus_data = cs_r?out_reg:8'bz;always @(out_sel or av_bus_data or io_data or zhiku_data)begin case(out_sel) 3'b001:out_reg<=io_data; 3'b010:out_reg<=av_bus_data; 3'b100:out_reg<=zhiku_data; default:out_reg<=8'b1; endcaseendassign out_sel = {zhiku_r_cs,av_cs,io_oe};assign cs_r = av_cs | io_oe | zhiku_r_cs;/******data bus output port end*********//******data bus input port begin*********/assign in_reg = cs_w?bus_data:in_reg;assign cs_w = mem_we | io_we;assign mem_we = zhiku_w_cs;/******data bus input port end*********///doe and dirassign dir = !cs_r;assign doe = rst ? ~cs : 1'b1;assign cs = cs_r | cs_w;endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -